All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
This project uses towncrier and the changes for the upcoming release can be found in changelog.d.
4.4.0 - 2025-07-30
- Migrate to b2sdk.v3.
- Switched to cloud-based signing using DigiCert KeyLocker.
- Add multi-bucket keys support to the
key createsubcommand. (#1083) - Support multi-bucket keys in
key listsubcommand.
- Replace backoff with tenacity for handling retries in tests. (#1088)
- Fix flaky integration test for multi-bucket key restrictions.
- Redesign console tools tests using b2sdk.v1 to use b2sdk.v3.
- Replace deprecated windows-2019 ci runner image with windows-2025.
4.3.3 - 2025-06-04
- Fix autocomplete install for
zsh. (#1086)
- Suggest running
b2 bucket listonNonExistentBucketerrors.
4.3.2 - 2025-04-24
- Bump
b2sdktov2.8.1to fix TimeoutError handling.
- Capture stdout in integration tests.
- Improve error messaging in autocomplete integration tests.
- Increase terminal size window in autocomplete integration tests.
4.3.1 - 2025-02-22
- Avoid failing on BrokenPipeError when running commands. (#1071)
- Display error message when trying to use
--with-authparam forb2id://urls in thefile urlcommand.
- Deleting used files by integration tests right away.
4.3.0 - 2025-01-07
- Fix shell autocompletion for Python >=3.12.8 and >=3.13.1.
- Update to b2sdk 2.7.0 to fix integration tests on Windows.
- Add
--exclude-if-uploaded-aftertosync. - Add
-las an alias for--longargument.
- Fix event notification tests when introducing new keys in API outputs.
- Remove yapf in favor of ruff.
- Upgraded to pytest 8.
- Use SHA384 for Windows signing instead of expired SHA256withRSA.
4.2.0 - 2024-10-29
- Remove Python 3.7 support in new releases.
Under Python 3.7
pipwill keep resolving the latest version of the package that supports active interpreter. This change comes at benefit of using newer versions of B2 CLI dependencies inb2standalone binary as well as in the official docker image. Python 3.8 is now the minimum supported version, until it reaches EOL in October 2024. We encourage use of latest stable Python release. If Python interpreter upgrade from 3.7 is not an option, please use provided standalone binaries or official docker image.
- Update to b2sdk 2.5.1 to fix
b2 syncstopping when encountering inaccessible directory. (#1040) - Fix
b2 file hide b2://bucket/filehandling and test coverage. - Fix
getdefaultlocaledeprecation warning on Python 3.11+.
- Add
b2 file server-side-copy b2id://XXX(also acceptsb2://bucket/objectNamesyntax). Add deprecation notice tob2 file copy-by-id- useb2 file server-side-copyinstead in new scripts. - Declare official support for Python 3.13 in
b2CLI. Testb2CLI against Python 3.13 in CI.
- Integration tests now use reuse test buckets whenever possible to speed up test execution and prevent bucket limit exhaustion.
4.1.0 - 2024-07-31
- Update
b2sdkto 2.5.0, to fixTruncatedOutputdownload errors when network is congested (e.g., due use of high downloader thread count). (#554)
- Add
b2 file unhidecommand. - Support both new
b2_uriand deprecatedbucket_name file_namearguments inb2 file hide.
4.0.3 - 2024-06-19
- Fix
syncreuploading files on re-run despite no changes in the source. Fixed by updatingb2sdkto2.4.1.
4.0.2 - 2024-06-17
- Fix
--lifecycle-rulevalidation onpython<3.10. - Update required
b2sdkto2.4.0which includes following fixes:- Move scan filters before a read on filesystem access attempt.
- Fix & improve Lifecycle Rule validation.
- Don't retry on
NoPaymentHistoryexception.
- Add
--lifecycle-ruleexample to CLI--helpand documentation. (#432)
4.0.1 - 2024-05-15
- Fix
-handling in file upload commands - even if file with-name exists, the stdin will be chosen over it. This change affectsb2v4(which is also aliased asb2), but notb2v3to keep backwards compatibility. - Fix
b2 ls b2://bucketName/fileNameandb2 rm b2://bucketName/fileNameto respectively, list and remove file identified by supplied B2 URI.
4.0.0 - 2024-05-13
- CLI
b2executable now points to the latest stable ApiVer version,b2v4, previously it pointed tob2v3. These means following breaking changes:b2will no longer persists credentials and other secrets on disk if credentials were passed throughB2_*environment variables. To explicitly persist them and keep using local cache for better performance, user can simply callb2 account accountb2 lsandb2 rmno longer accept two positional arguments, instead accepting onlyB2 URI(e.g.b2://bucketName/path)-is no longer supported as a valid filename, always being interpreted as standard input alias instead
- Changed
synccommand exit status code from 0 to 1 if any warnings or errors were encountered during the operation.
- Invalid unicode characters read from filesystem will no longer interrupt
b2 sync
- Deprecated
authorize-account,get-account-infoandclear-account, useaccount {authorize|get|clear}instead. - Deprecated
delete-file-version, userminstead. Added--bypass-governanceoption torm. - Deprecated
file-info,get-url,cat,upload-file,download-file,copy-file-by-id,hide-file,update-file-legal-holdandupdate-file-retention, usefile {info|url|cat|upload|download|copy-by-id|hide|update}instead. - Deprecated
get-download-url-with-auth, usefile urlinstead. Added--with-authand--durationoptions tofile url. - Deprecated
list-buckets,get-bucket,create-bucket,update-bucket,delete-bucket,get-download-authandnotification-rules, usebucket {list|get|create|update|delete|get-download-auth|notification-rule}instead. - Deprecated
list-keys,create-keyanddelete-key, usekey {list|create|delete}instead. - Deprecated
list-parts, usefile large partsinstead. Deprecatedlist-unfinished-large-files, usefile large unfinished listinstead. Deprecatedcancel-large-fileamdcancel-all-unfinished-large-files, usefile large unfinished cancelinstead. - Deprecated
replication-{setup|delete|pause|unpause|status}, usereplication {setup|delete|pause|unpause|status}instead.
- Add
account {authorize|get|clear}commands. - Add
bucket {list|get|create|update|delete|get-download-auth|notification-rule}commands. - Add
file large {parts|unfinished list|unfinished cancel}commands. - Add
file {info|url|cat|upload|download|copy-by-id|hide|update}commands. - Add
key {list|create|delete}commands. - Add
replication {setup|delete|pause|unpause|status}commands. - Allow
b2v3to be run in official Docker image without the need to change entrypoint.
- Automate nested subcommand documentation generation.
- Display short descriptions instead of arguments in subcommands help messages.
- Sort subcommands in
--helpalphabetically for better readability.
3.19.1 - 2024-04-23
- Fix
create-key --all-capabilitieserror when usingb2sdk>=2.1.
3.19.0 - 2024-04-15
- Add
notification-rulescommands for manipulating Bucket notification rules as part of Event Notifications feature Private Preview. See https://www.backblaze.com/blog/announcing-event-notifications/ for details.
3.18.0 - 2024-04-02
- Change all
_b2v4 --camelCaseCLI flags to --kebab-case. Add deprecation warning forb2v3 --camelCaseCLI flags.
- Don't persist credentials provided in the Environment variables in any command other than
authorize-accountwhen usingb2v4. - Fix
b2 --helpshowing full binary path instead of just basename.
- Add autocomplete support for
zshandfishshells. - Add support for calling
b2 lswithout arguments to list all buckets.
- Add dockerhub description deployment to CD workflow.
- Add support for pre-releases in CD.
- Fix missing command output when running
noxunder CI. - Increase verbosity when running tests under CI.
- Update to GitHub Actions using Node 20.
3.17.0 - 2024-03-15
- Control character escaping is now enabled by default if running in a terminal for improved security.
- Added
--escape-control-charactersand--no-escape-control-charactersflags, as well asB2_ESCAPE_CONTROL_CHARACTERSenv var to explicitly enable or disable control character escaping.
3.16.1 - 2024-02-26
- Fix
--threadsoption being silently ignored in upload commands.
3.16.0 - 2024-02-19
- All internal Python modules were moved to the
b2._internalpackage to further discourage users from importing them. - Change
lsandrmcommands to use theb2://URI scheme in the pre-release_b2v4command.
- Fix
--minPartSizenot supporting values above 100MB. - Fix a bug where
rm bucketName folderNamecommand without the--recursiveflag would remove a first file from every subdirectory insidefolderName. - Fix handling of
?and#in B2 URI.
- ApiVer introduced.
b2executable points to the latest stable ApiVer version, whileb2v3will always point to v3 ApiVer release ofb2CLI. - Add
--includeand--excludefilters to thelsandrmcommands. - Add support for deleting a single file by
b2id://URI in the pre-release_b2v4command. - Print account info if
b2 authorize-accountis successful using the same format asb2 get-account-info. - Print output file path in
download-filecommand.
- Fix CI failing on
mkdirwhen testing docker image. - Use pdm for building, testing and managing dependencies.
- Remove unnecessary files (continuous integration scripts, tests) from sdist tarball.
3.15.0 - 2023-12-07
- Use Python 3.12 in the official
b2Docker image.
- Loosen platformdirs dependency version specifier.
- Whenever target filename is a directory, file is downloaded into that directory.
3.14.0 - 2023-12-06
- Don't print `Using https://REALM" in stderr unless explicitly set by user. (#949)
- Added autocomplete suggestion caching to improve autocomplete performance.
- Do not include build cache in official
b2docker image. - Fix an error that caused multiprocessing semaphores to leak on OSX.
- Deprecated
download-file-by-idanddownload-file-by-name, usedownload-fileinstead. Deprecatedget-file-info, usefile-infoinstead. Deprecatedmake-urlandmake-friendly-url, useget-urlinstead.
- Add
--expires,--content-disposition,--content-encoding,--content-languageoptions to subcommandsupload-file,upload-unbound-stream,copy-file-by-id. - Add
download-file,file-infoandget-urlcommands using new B2 URI syntax allowing for referring to file-like objects by their bucket&name or ID.
- Add
catcommand to documentation. - Add additional linebreaks to ensure lists are properly rendered.
- Ensure CI checks Python package compatibility with latest setuptools. (#952)
- Allow skipping changelog for PRs marked with
-changeloglabel. - Changelog entries are now validated as a part of CI pipeline.
- Disable dependabot requests for updates unrelated to security issues.
- Fix CI badge not showing correct status in README.
- Remove unused exception class and outdated todo.
- Skip draft step in releases - all successful releases are public.
- Update license text generation dependencies to prevent triggering security scan false-positives.
- Use cpython 3.12 (not 3.11) for integration tests with secrets.
3.13.1 - 2023-11-21
- Fix "pip install" by making pyproject.toml viable. (#952)
- Fix
docker runexample in README.md
- Towncrier changelog generation - to avoid conflicts when simultaneously working on PRs
- fix towncrier generated changelog to work with mindsers/changelog-reader-action
3.13.0 - 2023-11-16
- Add linux/arm64 platform support to the official Docker image
- Add
catcommand for downloading file contents directly to stdout - Add
-ras an alias for--recursiveargument - Add
-qas an alias for--quietargument
- Emit
Using https://api.backblazeb2.commessage to stderr instead of stdout, therefor prevent JSON output corruption
- Stream
ls --jsonJSON output instead of dumping it only after all objects have been fetched - Alias
-to stdout indownload-file-by-nameordownload-file-by-idcommand
3.12.0 - 2023-10-28
- docker tests and pushing the official docker image on release
--quietnow will implicitly set--noProgressoption as well- pypy integration tests
- Use stable Python 3.12 in CI
- Fix readthedocs build by updating to v2 configuration schema
3.11.0 - 2023-10-04
- Add
--quietoption to all commands to suppress all messages printed to stdout & stderr
- Improve
--quietand--profileoptions documentation mentions, while suppressing them in--helpoutput
- Fix gathering licenses of typeshed libraries
- Fix spellcheck erroring out on LICENSE file
3.10.1 - 2023-09-27
- Fix lifecycle rules being cleared after using
update-bucketcommand if not explicitly set again. - Fix missing key ID for large file encrypted with SSE-C (fixed by
b2sdkupdate)
- Fix bad version number generation in CD
3.10.0 - 2023-09-10
- Add ability to upload from an unbound source such as standard input or a named pipe
- --bypassGovernance option to delete_file_version
- Declare official support of Python 3.12
- Cache-Control option when uploading files
- Add
--lifecycleRuletocreate-bucketandupdate-bucketand deprecate--lifecycleRulesargument - Add extra dependencies for better UX, installable with
pip install b2[full] - Add s3 endpoint to
get-account-info
- Deprecate support of
-as a valid filename inupload-filecommand. In the future-will always be interpreted as standard input
- Better help text for --corsRules
- if
--threadsis not explicitly set, number of threads is no longer guaranteed to be 10
- Remove unsupported PyPy 3.7 from tests matrix and add PyPy 3.10 instead
- Autocomplete integration tests will now work properly even if tested package has not been installed
- Automatically set copyright date when generating the docs
- Increase timeout time in autocomplete tests to accommodate slower CI environments
- Update pyinstaller to fix Linux Bundle build
- Replace
pyflakeswithrufffor linting - Make dependency version pinning less restrictive
- Fix tests by making mocks compatible with latest
b2sdkversion - Fix readthedocs build
- Fast rm sometimes failing due to a rare race condition
- Fix UnicodeEncodeError in non-Unicode terminals by prioritizing stdout encoding
- When listing licenses in
licensecommand only show licenses ofb2and its dependencies - Fix license command failing on Windows when non-UTF8 encoding is the default
3.9.0 - 2023-04-28
- Support for custom file upload timestamp
- Limit GitHub CI workload by running most integration tests only against edge versions of supported Python versions
- Add a direct dependency from tqdm
3.8.0 - 2023-03-23
- Add
install-autocompletecommand for installing shell autocompletion (currently onlybashis supported)
- Hitting the download endpoint twice in some cases
- GitHub CD builds and uploads an official B2 CLI image to docker hub
- Disable changelog verification for dependabot PRs
3.7.1 - 2023-02-08
- Remove unnecessary printing options from
rm - Clarify that
--recursiveis required when--withWildcardis used - Adjust description of
rm
- Remove macos stand-alone binary from CI/CD
3.7.0 - 2023-02-07
- Add
--incrementalModetosyncandupload-file - Add
licensecommand for printing licenses of b2 and libraries - Add wildcard support for the
lscommand - Add
rmcommand
- Stop using b2sdk.v1 in arg_parser.py
- Fix issues when running commands on Python 3.11
- Fix tests after changes introduced in b2sdk 1.19.0
rmcan handle any number of files
- GitHub CI got checkout action updated to v3 and setup-python to v4
- Ensured that changelog validation only happens on pull requests
- GitHub CI uses GITHUB_OUTPUT instead of deprecated set-output
- Releases now feature digests of each file
- Change default Python version in CI/CD to 3.11
- Temporary marking all directories as
safe.directoryinside CI/CD when bundling
3.6.0 - 2022-09-20
- Add
replication-deletecommand - Add
replication-pausecommand - Add
replication-statuscommand - Add
replication-unpausecommand - Add
--include-existing-filestoreplication-setup - Add
--max-streamsparameter to download commands - Add
--fileLockEnabledswitch toupdate-bucketsubcommand
- Fix
replication-setupdefault priority setter
- Fix warnings in tests
- Fix
test_keysunit test after changes in b2sdk - Fix running tests on the CI with the latest SDK from the master branch
3.5.0 - 2022-07-27
As in 3.4.0, replication support may be unstable, however no backward-incompatible
changes are currently planned.
This version is pinned strictly to b2-sdk-python==1.17.3 for the same reason.
- Add
--write-buffer-sizeparameter - Add
--skip-hash-verificationparameter
- Minimum MacOS version from 10.15 to 11.0
- Try not to crash tests due to bucket name collision
- Fix replication integration tests
- Fix leaking buckets in integration tests
- Limit number of workers for integration tests to 1 for now
- Make integration tests remove buckets only based on name, not based on creation time
- Add dependabot configuration
3.4.0 - 2022-05-04
This release contains a preview of replication support. It allows for basic usage
of B2 replication feature (currently in closed beta). Until this notice is removed,
the interface of replication related functionality should be not considered as public
API (as defined by SemVer).
This version is pinned strictly to b2-sdk-python==1.16.0 for the same reason.
- Add basic replication support to
create-bucketandupdate-bucket - Add more fields to
get-account-infojson - Add
--replicationtols --long - Add
replication-setupcommand - Add "quick start guide" to documentation
- Made
bucketTypepositional argument toupdate-bucketoptional - Run unit tests on all CPUs
3.3.0 - 2022-04-20
- Add
--threadsparameter todownload-file-by-nameanddownload-file-by-id - Add
--uploadThreadsand--downloadThreadsparameters tosync - Add
--profileswitch support - Add
applicationKeyIdandisMasterKeyto the output ofget-account-info
- Rename
--threadsparameter for--syncto--syncThreads
- Fix license header checker on Windows
- Fix
UnicodeEncodeErrorafter successful SSE-C download on a non-utf8 terminal (#786)
- Remove official support for python 3.5
- Remove official support for python 3.6
3.2.1 - 2022-02-23
- Fix setting permissions for local sqlite database (thanks to Jan Schejbal for responsible disclosure!)
3.2.0 - 2021-12-23
- Add compatibility support for arrow >= 1.0.2 on newer Python versions while continuing to support Python 3.5
- Fallback to
asciidecoder when printing help in case the locales are not properly set - Apply the value of
--threadsparameter tosyncdownloader threads
3.1.0 - 2021-11-02
- Add
--allCapabilitiestocreate-key - Add support for Python 3.10
- Fix testing bundle in CI for a new
staticxversion
3.0.3 - 2021-09-27
- Fix pypy selector in CI
- Fix for static linking of Linux binary (CD uses python container)
3.0.2 - 2021-09-17
- Sign Windows binary
- Download instruction in README.md (wording suggested by https://github.com/philh7456)
- Make Linux binary statically linked
3.0.1 - 2021-08-09
- logs from all loggers (in dependencies too) brought back
3.0.0 - 2021-08-07
- Add possibility to change realm during integration tests
- Add possibility to install SDK from local folder instead of pypi when running tests
- Add full support of establishing file metadata when copying, with either source or target using SSE-C
- Add
--noInfooption tocopy-file-by-id - Integration test for checking if
bad_bucket_iderror code is returned
- Fix integration tests on non-production environments
- Fix warnings thrown by integration tests
- delete-key unit test adjusted to a less mocked simulator
- Fix integration test cleanup
- Representing encryption-related metadata in buckets and file versions is now consistent
- CLI now uses
b2sdk.v2 - Downloading files prints file metadata as soon as the download commences (not when it finishes)
- New way of establishing location of the SQLite cache file, using
XDG_CONFIG_HOMEenv var - Downloaded file's metadata is complete and is displayed before the file is downloaded, a
Download finishedmessage is issued at the end contentLengthchanged tosizewhere appropriate- Log configuration: stack traces are not printed in case of errors by default,
--verbosechanges that - Log configuration arguments behaviour altered:
--logConfigis exclusive with--verboseand--debugLogs - Log configuration arguments behaviour altered:
--verboseand--debugLogscan be used at the same time (and they will both be taken into account)
- Support of
--metadataDirectiveargument incopy-file-by-id(themetadataDirectivesent to B2 cloud is detected automatically)
2.5.1 - 2021-08-06
SRC_LAST_MODIFIED_MILLISimport fix
2.5.0 - 2021-05-22
- Add integration test for sync within one bucket with different encryption
- Notarize OSX binary
- File lock arguments and new commands
- Fixed breaking integration test case
- Add zoneinfo to the Windows bundle
- Fixed unit tests failing on new attributes of FileVersionInfo
- Removing old buckets in integration tests
- Bucket name entropy in tests increased
2.4.0 - 2021-04-22
- Sign OSX binary
- Add support for SSE-C server-side encryption mode
- Exclude packages inside the test package when installing
2.3.0 - 2021-03-25
- Add support for SSE-B2 server-side encryption mode
- Pin
setuptools-scm<6.0as>=6.0doesn't support Python 3.5 - Fix boot speed regression caused by the
rst2ansiinvocations
2.2.0 - 2021-03-15
- Option to automatically authorize account when running commands other than
authorize-accountviaB2_APPLICATION_KEY_IDandB2_APPLICATION_KEYenv vars
- Improve setup and teardown for the integration tests
- Use
setuptools-scmfor versioning - Improve CLI and RTD descriptions of the commands
- Add upper version limit for arrow dependency, because of a breaking change
- Fix for the Windows bundled version
- Fix docs autogen
2.1.0 - 2020-11-03
- Add support for Python 3.9
- Add a possibility to append a string to the User-Agent via
B2_USER_AGENT_APPENDenv
- Update
b2 syncusage text for bucket-to-bucket sync
- Drop Python 2 support 🎉 (for old systems you can now use the binary distribution)
- Remove
--prefixfromls(it didn't really work, usefolderNameargument) - Clean up legacy code (
CliBucket, etc.)
- Fix docs generation in CI
- Correct names of the arguments in
b2 create-keyusage text
2.0.2 - 2020-07-15
- Add
--environmentinternal parameter forauthorize-account
2.0.0 - 2020-06-25
- Add official support for python 3.8
- Add
make-friendly-urlcommand - Add
--excludeIfModifiedAfterparameter forsync - Add
--jsonparameter tolsandlist-buckets - Introduce bundled versions of B2 CLI for Linux, Mac OS and Windows
- Switch to b2sdk api version v1: remove output of
delete-bucket - Use b2sdk >1.1.0: add large file server-side copy
- Switch option parser to argparse: readthedocs documentation is now generated automatically
- Normalize output indentation level to 4 spaces
- Remove the ability to import b2sdk classes through b2cli (please use b2sdk directly)
- Remove official support for python 3.4
- Remove
list-file-namescommand. Usels --recursive --jsoninstead - Remove
list-file-versionscommand. Usels --recursive --json --versionsinstead
1.4.2 - 2019-10-03
- Add
prefixparameter tolist-file-namesandlist-file-versions - Add support for (server-side) copy-file command
- Make parameters of
list-file-namesandlist-file-versionsoptional (use an empty string like this:"") - (b2sdk) Fix sync when used with a key restricted to filename prefix
- When authorizing with application keys, optional application key ID and application key can be added using environment variables B2_APPLICATION_KEY_ID and B2_APPLICATION_KEY respectively.
1.4.0 - 2019-04-25
- (b2sdk) Support for python 3.7
- Renaming accountId for authentication to application key Id Note: this means account Id is still backwards compatible, only the terminology has changed.
- Most of the code moved to b2sdk repository and package
- (b2sdk) Fix transferer crashing on empty file download attempt
- (b2sdk) Enable retries of non-transfer operations
- (b2sdk) Enable continuation of download operations
- Deprecation warning added for imports of sdk classes from cli package
1.3.8 - 2018-12-06
- New
--excludeAllSymlinksoption forsync. - Faster downloading of large files using multiple threads and bigger buffers.
- Fixed doc for cancel-all-unfinished-large-files
1.3.6 - 2018-08-21
- Fix auto-reauthorize for application keys.
- Fix problem with bash auto-completion module.
- Fix (hopefully) markdown display in PyPI.
1.3.4 - 2018-08-10
- Better documentation for authorize-account command.
- Fix error reporting when using application keys
- Fix auth issues with bucket-restricted application keys.
1.3.2 - 2018-07-28
- Tests fixed for Python 3.7
- Add documentation about what capabilities are required for different commands.
- Better error messages for authorization problems with application keys.
1.3.0 - 2018-07-20
- Support for application keys.
- Support for Python 3.6
- Drop support for Python 3.3 (
setuptoolsno longer supports 3.3)
- Faster and more complete integration tests
- Fix content type so markdown displays properly in PyPI
- The testing package is called
test, nottests
1.2.0 - 2018-07-06
- New
--recursiveoption for ls - New
--showSizeoption for get-bucket - New
--excludeDirRegexoption for sync
- Include LICENSE file in the source tarball. Fixes #433
- Test suite now runs as root (fixes #427)
- Validate file names before trying to upload
- Fix scaling problems when syncing large numbers of files
- Prefix Windows paths during sync to handle long paths (fixes #265)
- Check if file to be synced is still accessible before syncing (fixes #397)
1.1.0 - 2017-11-30
- Add support for CORS rules in
create-bucketandupdate-bucket.get-bucketwill display CORS rules.
- cleanup in integration tests works
1.0.0 - 2017-11-09
- Require
--allowEmptySourceto sync from empty directory, to help avoid accidental deletion of all files.
0.7.4 - 2017-11-09
- More efficient uploads by sending SHA1 checksum at the end.
- File modification times are set correctly when downloading.
- Fix an off-by-one issue when downloading a range of a file (affects library, but not CLI).
- Better handling of some errors from the B2 service.