[
  {
    "path": ".gitattributes",
    "content": "*.json binary\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report--english-.md",
    "content": "---\nname: Bug report (English)\nabout: Create a report to help improve the library\ntitle: \"[Bug] <issue title>\"\nlabels: bug, language-english\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior (preferably, an example code snippet).\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**System Info (please complete the following information):**\n - OS: [e.g. Windows, Linux, Mac OS]\n - `yadisk` version: [e.g. 2.0.0]\n - Python version: [e.g. 3.12.1]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report--русский-.md",
    "content": "---\nname: Bug report (Русский)\nabout: Создать баг репорт, чтобы помочь улучшить библиотеку\ntitle: \"[Bug] <название issue>\"\nlabels: bug, language-russian\nassignees: ''\n\n---\n\n**Опишите баг**\nЧеткое и краткое описание бага.\n\n**Действия по воспроизведению бага**\nДействия по воспроизведению: (например, пример кода или просто описание).\n\n**Ожидаемое поведение**\nЧеткое и краткое описание ожидаемого поведения.\n\n**Информация о вашей системе (заполните следующую информацию):**\n - ОС: [например, Windows, Linux, Mac OS]\n - Версия библиотеки `yadisk`: [например, 2.0.0]\n - Версия Python: [например, 3.12.1]\n\n**Дополнительая информация**\nЗдесь может быть любая дополнительная информация о проблеме.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request--english-.md",
    "content": "---\nname: Feature request (English)\nabout: Suggest an idea for this project\ntitle: \"[Feature Request] <issue title>\"\nlabels: enhancement, language-english\nassignees: ''\n\n---\n\n**Describe why you want this feature**\nA clear and concise description of what the problem is.\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Additional context**\nAdd any other context  about the feature request here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request--русский-.md",
    "content": "---\nname: Feature request (Русский)\nabout: Предложить идею\ntitle: \"[Feature Request] <название issue>\"\nlabels: enhancement, language-russian\nassignees: ''\n\n---\n\n**Опишите проблему**\nЧеткое и краткое описание проблемы, которую вы предлагаете решить.\n\n**Опишите ваше решение**\nЧеткое и краткое описание вашего решения.\n\n**Дополнительная информация**\nЗдесь может быть любая другая дополнительная информация.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question--english-.md",
    "content": "---\nname: Question (English)\nabout: Ask a question\ntitle: \"[Question] <issue title>\"\nlabels: language-english, question\nassignees: ''\n\n---\n\n**Short description of your question**\nYour question in detail.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question--русский-.md",
    "content": "---\nname: Question (Русский)\nabout: Задать вопрос\ntitle: \"[Question] <название issue>\"\nlabels: language-russian, question\nassignees: ''\n\n---\n\n**Краткое описание вашего вопроса**\nПодробное содержание вопроса.\n"
  },
  {
    "path": ".github/workflows/lint_and_test.yml",
    "content": "name: Perform linting and run tests\n\npermissions:\n  contents: read\n\non:\n  push:\n    branches:\n      - master\n      - dev\n  pull_request:\n    branches:\n      - master\n      - dev\n\njobs:\n  build:\n\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ubuntu-latest, windows-latest, macos-latest]\n        python-version: [\"3.9\", \"3.10\", \"3.11\", \"3.12\", \"3.13\", \"3.14\"]\n\n    runs-on: ${{ matrix.os }}\n    steps:\n    - uses: actions/checkout@v6\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v6\n      with:\n        python-version: ${{ matrix.python-version }}\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install -r requirements-dev.txt\n    - name: Lint with ruff\n      run: ruff check\n    - name: Lint with mypy\n      run: mypy\n    - name: Build the package\n      run: python -m build\n    - name: Install the built wheel\n      shell: bash\n      run: |\n        # Use the wheel to prevent broken releases, instead of the editable install\n        pip uninstall -y yadisk\n        pip install dist/yadisk-*.whl\n    - name: Run pre-recored tests\n      shell: bash\n      env:\n        PYTHON_YADISK_APP_ID: ${{ vars.PYTHON_YADISK_APP_ID }}\n        PYTHON_YADISK_APP_SECRET: ${{ secrets.PYTHON_YADISK_APP_SECRET }}\n        PYTHON_YADISK_APP_TOKEN: ${{ secrets.PYTHON_YADISK_APP_TOKEN }}\n        PYTHON_YADISK_TEST_ROOT: ${{ vars.PYTHON_YADISK_TEST_ROOT }}\n        PYTHON_YADISK_GATEWAY_HOST: ${{ vars.PYTHON_YADISK_GATEWAY_HOST }}\n        PYTHON_YADISK_GATEWAY_PORT: ${{ vars.PYTHON_YADISK_GATEWAY_PORT }}\n        PYTHON_YADISK_REPLAY_ENABLED: 1\n      run: |\n        if [[ \"${{ matrix.os }}\" == \"windows-latest\" ]]; then\n          # running with --cov fails on Windows in CI\n          pytest -v --log-cli-level=WARNING tests\n        else\n          source_path=$(python -c 'import importlib.util, os; print(os.path.dirname(importlib.util.find_spec(\"yadisk\").origin))')\n          pytest --cov=\"$source_path\" -v --log-cli-level=WARNING tests\n        fi\n    - name: Upload coverage\n      env:\n        COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      shell: bash\n      run: |\n        if [[ \"${{ matrix.os }}\" == \"ubuntu-latest\" ]] && [[ \"${{ matrix.python-version }}\" == \"3.14\" ]]; then\n          pip install coveralls\n          coveralls\n        fi\n"
  },
  {
    "path": ".gitignore",
    "content": ".*.sw[a-z]\n*.py[co]\ndist/\nbuild/\nyadisk.egg-info/\ndocs/_build\n.venv/\npyrightconfig.json\n.vim/\n.coverage\n.tool-versions\n*.mo\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Required\nversion: 2\n\n# Set the version of Python and other tools you might need\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3.11\"\n  apt_packages:\n    - libssl-dev\n    - libcurl4-openssl-dev\n    - python3-dev\n\n# Build documentation in the docs/ directory with Sphinx\nsphinx:\n   configuration: docs/conf.py\n\n# Optionally declare the Python requirements required to build your docs\npython:\n   install:\n     - requirements: docs/requirements.txt\n"
  },
  {
    "path": "CONTRIBUTING.rst",
    "content": "Contributing\n============\n\n.. contents:: Table of contents:\n\nBug reports, feedback, questions, feature requests, etc.\n********************************************************\n\nIf you've found a bug, have some questions, a feature request, or some other\nform of feedback, feel free to `open an issue\n<https://github.com/ivknv/yadisk/issues>`_, use the appropriate template.\n\nIssues are accepted in 2 languages: English or Russian, whichever is more\ncomfortable.\n\nPull requests\n*************\n\nPull requests are also welcome, however, be prepared to have your PR rejected,\nsince some changes might not be appropriate for this project.\n\nIf you would like to contribute a PR, keep the following in mind:\n\n#. This is a general-purpose API client library meant for developers, not an end-user\n   tool\n#. The main goal of this library is to provide simple, convenient and reliable\n   access to the Yandex.Disk's REST API, mostly mirroring it\n#. Reliability and correctness are valued above API convenience\n#. Some changes may seem useful but may also end up inadvertently creating edge\n   cases, making the feature unreliable or complicated to use safely. See if\n   that's the case for your PR.\n#. Tests are appreciated but not necessary for the initial PR, they can be\n   added later by this repository's maintainer\n#. There is quite a lot of code duplication, mostly due to implementation of both\n   sync/async interfaces, beware of that\n\nIf you're unsure if your PR can make it into the repository, consider opening\nan issue instead.\n\nHere are some PR examples that are likely to be merged:\n\n* Bug fixes\n* New/enhanced tests (that cover something that isn't adequately tested at the moment)\n* Documentation (e.g, added examples, corrections, additional REST API insight)\n* Support for an HTTP library (see Sessions and Session Interface in the documentation)\n\nPull request workflow\n---------------------\n\nThe pull request workflow looks as follows:\n\n#. Fork the repository\n#. Create a new branch with a unique name, specific to your PR, use the :code:`dev`\n   branch as the starting point\n#. Run linting tools\n#. Run tests\n#. If everything is good, commit changes\n#. Push to your forked repository\n#. Submit a pull request, set :code:`dev` as the destination branch\n\nBranch structure\n****************\n\nThe :code:`master` branch is used for stable releases, while the :code:`dev`\nbranch is used for work in progress. All changes have to go through the\n:code:`dev` branch before being merged into :code:`master`.\n\nSetting up the development environment\n**************************************\n\nAssuming you already have the appropriate Python version installed, first,\nsetup the virtualenv:\n\n.. code:: bash\n\n   # Optional: use .venv/$PYTHON_VERSION to manage venvs for multiple Python versions\n   python3 -m venv .venv\n\nAfter setting up the virtualenv you can activate it and install all the\ndevelopment dependencies and tools:\n\n.. code:: bash\n\n   # Enter the created virtual environment\n   source .venv/bin/activate\n\n   # Now install development dependencies and tools, including the tools needed\n   # to build the documentation\n   pip install -r requirements-dev.txt\n\nLinting\n*******\n\nBefore committing changes run linting tools and fix reported errors:\n\n.. code:: bash\n\n   ruff check\n   mypy\n\nBoth :code:`ruff` and :code:`mypy` are configured in :code:`pyproject.toml`.\n\nTesting\n*******\n\nTraffic recording / traffic replay\n----------------------------------\n\nTesting the API client has several challenges:\n\n* Sometimes the servers may be unavailable or simply malfunction\n* Sending requests takes a very long time\n* It is possible to hit a quota for certain functions in the process\n* Have to use a real user account\n* Cloud storage is persistent, so it has to be repeatedly cleaned up\n* There is a risk of data loss due to bugs or misconfiguration\n\nThis makes it unsuitable for continuous integration. However, we can record\nreal traffic and then replay it in tests to solve all of the above problems at\nonce. An **API gateway** is used for this purpose. It's a simple HTTP server\n(see :code:`tests/disk_gateway.py`), that can either **relay** all the requests\nto the actual Yandex.Disk servers while **recording** them to a JSON file, or\n**replay** them from a recorded JSON file without actually sending them\nanywhere. Of course, it is still necessary to occasionally re-record them,\nsince the actual API behavior may change over time.\n\nConfiguration\n-------------\n\nIn order to run most tests you need to configure a set of environment variables:\n\n.. code:: bash\n\n   export PYTHON_YADISK_APP_ID='<your test application ID>'\n   export PYTHON_YADISK_APP_SECRET='<your test application secret>'\n   export PYTHON_YADISK_APP_TOKEN='<currently valid access token for your test application>'\n   export PYTHON_YADISK_TEST_ROOT='<path to the directory where all tests will be contained>'\n   export PYTHON_YADISK_REPLAY_ENABLED='<0 or 1 (default), 0 disables traffic replay, 1 enables it>'\n   export PYTHON_YADISK_RECORDING_ENABLED='<0 (default) or 1, 1 enables traffic recording, 0 disables it>'\n   export PYTHON_YADISK_GATEWAY_HOST='<127.0.0.1 by default, host for the test API gateway>'\n   export PYTHON_YADISK_GATEWAY_PORT='<8080 by default, port for the test API gateway>'\n\n\n.. note::\n\n   Be very careful with the location of :code:`PYTHON_YADISK_TEST_ROOT`.\n   Specifing the wrong directory may lead to **permanent loss of data in\n   that folder**.\n\n.. note::\n\n   :code:`PYTHON_YADISK_APP_ID` and :code:`PYTHON_YADISK_APP_SECRET` are only\n   used in some authentication/authorization tests (see\n   :code:`tests/test_auth.py`), during replays they **do not have to be\n   valid**, they only need to be valid at the time of recording of these tests\n   (although they still **have to match**). In fact, if you ever find yourself\n   recording tests that use :code:`PYTHON_YADISK_APP_SECRET`, make sure to\n   **generate a new application secret** afterwards.\n\nReplaying tests\n---------------\n\nTesting is done with :code:`pytest`.\nTo only **replay**, set :code:`PYTHON_YADISK_RECORDING_ENABLED=0` and\n:code:`PYTHON_YADISK_REPLAY_ENABLED=1` (this is the default behavior):\n\n.. code:: bash\n\n   pytest -vx tests\n   # or the same thing more explicitly\n   PYTHON_YADISK_RECORDING_ENABLED=0 PYTHON_YADISK_REPLAY_ENABLED=1 pytest -vx tests\n\n.. note::\n\n   Running tests in replay mode will only work if :code:`PYTHON_YADISK_APP_ID`,\n   :code:`PYTHON_YADISK_APP_SECRET` and :code:`PYTHON_YADISK_TEST_ROOT` all\n   match with those at the time of recording. :code:`PYTHON_YADISK_APP_TOKEN`\n   is not stored anywhere and doesn't need to be valid nor match the value at\n   the time of recording.\n\nEnvironment variables, necessary for running replays of the recorded tests\nare provided in the :code:`tests/.env` file. Note that the secret in that file\nis not actually valid.\n\nRecording tests\n---------------\n\nTo **record** tests, set :code:`PYTHON_YADISK_RECORDING_ENABLED=1` and\n:code:`PYTHON_YADISK_REPLAY_ENABLED=0`:\n\n.. code:: bash\n\n   PYTHON_YADISK_RECORDING_ENABLED=1 PYTHON_YADISK_REPLAY_ENABLED=0 pytest -vx tests\n\nThe recorded JSON files are stored in :code:`tests/recorded/{sync,async}`.\n\n.. note::\n\n   Recorded JSON files may contain **personal information**, such as your name\n   and other account information (see :code:`test_get_disk_info()`), as well as\n   some information about your files (see :code:`test_get_last_uploaded()`,\n   :code:`test_get_public_resources()`, :code:`test_get_files()`). Inspect\n   the files after recording them. Content of requests and responses is compressed\n   with zlib and encoded with Base64 (see :code:`tests/disk_gateway.py`)\n\nRunning tests without either recording or replaying\n---------------------------------------------------\n\nIt is also possible to run tests without recording or replay:\n\n.. code:: bash\n\n   PYTHON_YADISK_RECORDING_ENABLED=0 PYTHON_YADISK_REPLAY_ENABLED=0 pytest -vx tests\n\nDocumentation\n*************\n\n.. _Read the Docs (en): https://yadisk.readthedocs.io/en/latest/\n.. _Read the Docs (ru): https://yadisk.readthedocs.io/ru/latest/\n\nAll documentation is written in English and then additionally localized to Russian.\nDocumentation is built with :code:`sphinx` and reSructuredText (:code:`.rst` files).\nIt is published at `Read the Docs (en)`_ and `Read the Docs (ru)`_\n\nBuilding documentation\n----------------------\n\nTo build the documentation in HTML\nformat, go the :code:`docs/` directory and run the following command:\n\n.. code:: bash\n\n   make html\n\nThis will build the documentation in English. The resulting files can be found\nin the :code:`docs/_build/html` directory.\n\nTo build documentation in Russian, run the following command:\n\n.. code:: bash\n\n   make -e SPHINXOPTS='-D language=ru' html\n\nTranslation\n-----------\n\n.. _Sphinx/Internationalization: https://www.sphinx-doc.org/en/master/usage/advanced/intl.html\n\nThe translation workflow looks something like this:\n\n#. Extract translatable messages with\n   :code:`make gettext`\n#. Generate :code:`.po` files with :code:`sphinx-intl update -p _build/gettext -l ru`\n   (can be found in :code:`locales/ru/LC_MESSAGES`)\n#. Translate :code:`.po` files\n#. Build translated documentation with :code:`make -e SPHINXOPTS='-D language=ru' html`\n\nSee `Sphinx/Internationalization`_ for more instructions.\n\nBuilding the package\n********************\n\nTo build the wheel (:code:`.whl` file) and the source archive, use the following\ncommand:\n\n.. code:: bash\n\n   python -m build\n\nAfterwards you should have the built wheel and source archive in the :code:`dist/`\ndirectory.\n\nNew release workflow\n**********************\n\n.. _Read the Docs (dev, en): https://yadisk.readthedocs.io/en/dev/\n.. _Read the Docs (dev, ru): https://yadisk.readthedocs.io/ru/dev/\n\nThis is the general workflow for publishing a new release:\n\n#. Commit changes to the :code:`dev` branch\n#. Update documentation\n#. Run tests and linting\n#. Update translations\n#. Push changes\n#. Run tests and linting with Github Actions, ensure there are no errors\n#. Check that the documentation is not broken at `Read the Docs (dev, en)`_ and `Read the Docs (dev, ru)`_\n#. Bump version number in several files (follow semantic versioning):\n\n   #. :code:`__version__` in :code:`src/yadisk/__init__.py`\n   #. :code:`version` in :code:`docs/conf.py`\n\n#. Write the release notes and translate them, put them in the following files:\n\n   #. :code:`docs/changelog.rst`\n   #. :code:`README.rst`\n   #. :code:`README.en.rst`\n   #. :code:`README.ru.rst`\n\n#. Push the changes\n#. Run tests and linting with Github Actions, ensure there are no errors\n#. Check that the documentation is not broken at `Read the Docs (dev, en)`_ and `Read the Docs (dev, ru)`_\n#. Create a PR and merge changes to :code:`master`\n#. Build the package (wheel and source archive)\n#. Upload the built package to PyPI\n#. Add a new release on Github\n"
  },
  {
    "path": "CONTRIBUTORS.rst",
    "content": "Contributors\n============\n\n- Ivan Konovalov (`@ivknv <https://github.com/ivknv>`_) (author, maintainer)\n- Yuri Kobets (`@tordex <https://github.com/tordex>`_)\n- Vladislav (`@Omnivanitate <https://github.com/Omnivanitate>`_)\n- `@unix3dgforce <https://github.com/unix3dgforce>`_\n- Nikita Kolesov (`@NikitaKolesov <https://github.com/NikitaKolesov>`_)\n- Katant Savelev (`@KatantDev <https://github.com/KatantDev>`_)\n"
  },
  {
    "path": "COPYING",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "COPYING.lesser",
    "content": "                 GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "include COPYING\ninclude COPYING.lesser\ninclude CONTRIBUTORS.rst\ninclude README.rst\ninclude README.en.rst\ninclude README.ru.rst\ninclude src/yadisk/py.typed\n"
  },
  {
    "path": "README.en.rst",
    "content": "YaDisk\n======\n\n.. |RTD Badge| image:: https://img.shields.io/readthedocs/yadisk.svg\n   :alt: Read the Docs\n   :target: https://yadisk.readthedocs.io/en/latest/\n\n.. |CI Badge| image:: https://img.shields.io/github/actions/workflow/status/ivknv/yadisk/lint_and_test.yml\n   :alt: GitHub Actions Workflow Status\n\n.. |PyPI Badge| image:: https://img.shields.io/pypi/v/yadisk.svg\n   :alt: PyPI\n   :target: https://pypi.org/project/yadisk\n\n.. |Python Version Badge| image:: https://img.shields.io/pypi/pyversions/yadisk\n   :alt: PyPI - Python Version\n\n.. |Coverage Badge| image:: https://coveralls.io/repos/github/ivknv/yadisk/badge.svg?branch=master\n   :alt: Coverage\n   :target: https://coveralls.io/github/ivknv/yadisk\n\n|RTD Badge| |CI Badge| |PyPI Badge| |Python Version Badge| |Coverage Badge|\n\nYaDisk is a Yandex.Disk REST API client library.\n\n.. _Read the Docs (EN): https://yadisk.readthedocs.io\n.. _Read the Docs (RU): https://yadisk.readthedocs.io/ru/latest\n\nDocumentation is available at `Read the Docs (EN)`_ and `Read the Docs (RU)`_.\n\n.. contents:: Table of contents:\n\nInstallation\n************\n\n:code:`yadisk` supports multiple HTTP client libraries and has both synchronous and\nasynchronous API.\n\nThe following HTTP client libraries are currently supported:\n\n* :code:`requests` (used by default for synchronous API)\n* :code:`httpx` (both synchronous and asynchronous, used by default for asynchronous API)\n* :code:`aiohttp` (asynchronous only)\n* :code:`pycurl` (synchronous only)\n\nFor synchronous API (installs :code:`requests`):\n\n.. code:: bash\n\n   pip install yadisk[sync-defaults]\n\nFor asynchronous API (installs :code:`aiofiles` and :code:`httpx`):\n\n.. code:: bash\n\n   pip install yadisk[async-defaults]\n\nAlternatively, you can manually choose which optional libraries to install:\n\n.. code:: bash\n\n   # For use with pycurl\n   pip install yadisk[pycurl]\n\n   # For use with aiohttp, will also install aiofiles\n   pip install yadisk[async-files,aiofiles]\n\nExamples\n********\n\nSynchronous API\n---------------\n\n.. code:: python\n\n    import yadisk\n\n    client = yadisk.Client(token=\"<token>\")\n    # or\n    # client = yadisk.Client(\"<application-id>\", \"<application-secret>\", \"<token>\")\n\n    # You can either use the with statement or manually call client.close() later\n    with client:\n        # Check if the token is valid\n        print(client.check_token())\n\n        # Get disk information\n        print(client.get_disk_info())\n\n        # Print files and directories at \"/some/path\"\n        print(list(client.listdir(\"/some/path\")))\n\n        # Upload \"file_to_upload.txt\" to \"/destination.txt\"\n        client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # Same thing\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            client.upload(f, \"/destination.txt\")\n\n        # Download \"/some-file-to-download.txt\" to \"downloaded.txt\"\n        client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # Permanently remove \"/file-to-remove\"\n        client.remove(\"/file-to-remove\", permanently=True)\n\n        # Create a new directory at \"/test-dir\"\n        print(client.mkdir(\"/test-dir\"))\n\nAsynchronous API\n----------------\n\n.. code:: python\n\n    import yadisk\n    import aiofiles\n\n    client = yadisk.AsyncClient(token=\"<token>\")\n    # or\n    # client = yadisk.AsyncClient(\"<application-id>\", \"<application-secret>\", \"<token>\")\n\n    # You can either use the with statement or manually call client.close() later\n    async with client:\n        # Check if the token is valid\n        print(await client.check_token())\n\n        # Get disk information\n        print(await client.get_disk_info())\n\n        # Print files and directories at \"/some/path\"\n        print([i async for i in client.listdir(\"/some/path\")])\n\n        # Upload \"file_to_upload.txt\" to \"/destination.txt\"\n        await client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # Same thing\n        async with aiofiles.open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # Same thing but with regular files\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # Download \"/some-file-to-download.txt\" to \"downloaded.txt\"\n        await client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # Same thing\n        async with aiofiles.open(\"downloaded.txt\", \"wb\") as f:\n            await client.download(\"/some-file-to-download.txt\", f)\n\n        # Permanently remove \"/file-to-remove\"\n        await client.remove(\"/file-to-remove\", permanently=True)\n\n        # Create a new directory at \"/test-dir\"\n        print(await client.mkdir(\"/test-dir\"))\n\nContributing\n************\n\nIf you would like to contribute to this project, see\n`CONTRIBUTING.rst <https://github.com/ivknv/yadisk/blob/master/CONTRIBUTING.rst>`_.\n\nChangelog\n*********\n\n.. _issue #2: https://github.com/ivknv/yadisk/issues/2\n.. _issue #4: https://github.com/ivknv/yadisk/issues/4\n.. _issue #7: https://github.com/ivknv/yadisk/issues/7\n.. _issue #23: https://github.com/ivknv/yadisk/issues/23\n.. _issue #26: https://github.com/ivknv/yadisk/issues/26\n.. _issue #28: https://github.com/ivknv/yadisk/issues/28\n.. _issue #29: https://github.com/ivknv/yadisk/issues/29\n.. _PR #31: https://github.com/ivknv/yadisk/pull/31\n.. _issue #43: https://github.com/ivknv/yadisk/issues/43\n.. _issue #45: https://github.com/ivknv/yadisk/issues/45\n.. _issue #49: https://github.com/ivknv/yadisk/issues/49\n.. _issue #53: https://github.com/ivknv/yadisk/issues/53\n.. _Introduction: https://yadisk.readthedocs.io/en/latest/intro.html\n.. _API Reference: https://yadisk.readthedocs.io/en/latest/api_reference/index.html\n.. _Available Session Implementations: https://yadisk.readthedocs.io/en/latest/api_reference/sessions.html\n.. _Session Interface: https://yadisk.readthedocs.io/en/latest/api_reference/session_interface.html\n.. _requests: https://pypi.org/project/requests\n.. _Migration Guide: https://yadisk.readthedocs.io/en/latest/migration_guide.html\n.. _PR #57: https://github.com/ivknv/yadisk/pull/57\n.. _issue #62: https://github.com/ivknv/yadisk/issues/62\n\n* **Release 3.4.1 (2026-04-16)**\n\n  * Bug fixes:\n\n    * Fixed a :code:`TypeError` when passing a file path to\n      :code:`AsyncClient.download()` or :code:`AsyncClient.upload()` while not\n      having :code:`aiofiles` installed (see `issue #62`_)\n\n    * Work around Yandex.Disk ignoring request body for :code:`Client.patch()` and\n      :code:`Client.update_public_settings()` when using :code:`pycurl` due to\n      setting :code:`Transfer-Encoding: chunked` by default\n\n* **Release 3.4.0 (2025-07-10)**\n\n  * New features:\n\n    * Added methods for managing public settings of resources:\n\n      * :code:`Client.update_public_settings()`\n      * :code:`Client.get_public_settings()`\n      * :code:`Client.get_public_available_settings()`\n\n      Note, it appears that these API endpoints do not fully conform to the\n      official REST API documentation, their functionality is limited in\n      practice.\n\n    * Added new exception class :code:`PasswordRequiredError`\n\n    * Added several new fields for :code:`DiskInfoObject`:\n\n      * :code:`deletion_restricion_days`\n      * :code:`hide_screenshots_in_photoslice`\n      * :code:`is_legal_entity`\n\n    * Implemented the :code:`__dir__()` method for response objects\n\n  * Improvements:\n\n    * :code:`repr()` of API response objects now only shows the keys that are\n      actually present (instead of displaying them as :code:`None` like before)\n\n* **Release 3.3.0 (2025-04-29)**\n\n  * New features:\n\n    * User-Agent spoofing to bypass Yandex.Disk's upload speed limit (see `PR #57`_).\n      :code:`Client.upload()` and related methods (including :code:`AsyncClient`)\n      have a new optional parameter :code:`spoof_user_agent`, which is set to\n      :code:`True` by default. This parameter can be used to disable User-Agent\n      spoofing if necessary.\n\n    * Added IPython's pretty printing support for :code:`YaDiskObject` and\n      derived classes\n\n  * Bug fixes:\n\n    * :code:`Client.wait_for_operation()` now uses :code:`time.monotonic()`\n      instead of :code:`time.time()`\n\n  * Improvements:\n\n    * REST API error messages are now clearly divided into four parts (message,\n      description, error code and HTTP status code)\n\n* **Release 3.2.0 (2025-02-03)**\n\n  * New features:\n\n    * Added new method: :code:`Client.makedirs()` / :code:`AsyncClient.makedirs()`\n      (see `issue #53`_)\n    * Added several missing fields for :code:`DiskInfoObject`:\n\n      * :code:`photounlim_size`\n      * :code:`will_be_overdrawn`\n      * :code:`free_photounlim_end_date`\n      * :code:`payment_flow`\n\n    * Added missing field :code:`sizes` for :code:`ResourceObject` and related\n      objects\n\n  * Bug fixes:\n\n    * :code:`Client.rename()` / :code:`AsyncClient.rename()` now raises\n      :code:`ValueError` on attempt to rename the root directory\n    * Automatic retry attempt numbers were logged off by one, now they are\n      logged correctly\n\n* **Release 3.1.0 (2024-07-12)**\n\n  * New features:\n\n    * Added new exception classes: :code:`GoneError` and\n      :code:`ResourceDownloadLimitExceededError`\n    * Added a new method: :code:`Client.get_all_public_resources()` and\n      :code:`AsyncClient.get_all_public_resources()`\n  * Bug fixes:\n\n    * Fixed setting :code:`headers` and session arguments to :code:`None` causing\n      errors\n    * Fixed incorrect handling of empty filename in :code:`Client.rename()` and\n      :code:`AsyncClient.rename()`\n    * Fixed several typos in async convenience method implementations\n      (:code:`listdir()` and related)\n    * Fixed :code:`PublicResourceListObject` having the wrong type for its\n      :code:`items` member\n    * Fixed API requests not working with :code:`PycURLSession` when\n      :code:`stream=True` is set\n    * No data will be written to the output file by :code:`Client.download()`,\n      :code:`Client.download_by_link()`, :code:`AsyncClient.download()` and\n      :code:`AsyncClient.download_by_link()` if the server returns a bad status\n      code\n\n* **Release 3.0.1 (2024-07-09)**\n\n  * Fixed broken :code:`pyproject.toml` that did not include full package\n    contents (see `issue #49`_)\n\n* **Release 3.0.0 (2024-07-09)**\n\n  * Breaking changes:\n\n    - See `Migration Guide`_ for full details\n    - All methods wait for asynchronous operations to complete by default\n      (see the new :code:`wait=<bool>` parameter)\n    - Iterating over the result of :code:`AsyncClient.listdir()` no longer\n      requires the additional await keyword.\n    - Number of returned items of :code:`Client.get_files()` /\n      :code:`AsyncClient.get_files()` is now controlled by the :code:`max_items`\n      parameter, rather than :code:`limit`\n    - Methods :code:`set_token()`, :code:`set_headers()` of :code:`Session` and\n      :code:`AsyncSession` were removed\n    - Some methods no longer accept the :code:`fields` parameter\n    - :code:`Client.get_last_uploaded()` / :code:`AsyncClient.get_last_uploaded()`\n      now return a list instead of a generator\n    - :code:`yadisk.api` is now a private module\n    - All private modules were renamed to have names that start with :code:`_`\n      (e.g, :code:`yadisk._api`)\n  * New features:\n\n    - Added methods to wait until an asynchronous operation completes\n      (see :code:`Client.wait_for_operation()` / :code:`AsyncClient.wait_for_operation()`)\n    - Methods that may start an asynchronous operation now accept additional\n      parameters: :code:`wait: bool = True`,\n      :code:`poll_interval: float = 1.0` and\n      :code:`poll_timeout: Optional[float] = None`\n    - :code:`Client.listdir()`, :code:`Client.get_files()` and their async\n      variants now accept a new parameter\n      :code:`max_items: Optional[int] = None`, which can be used to limit\n      the maximum number of returned items\n    - Most :code:`Client` and :code:`AsyncClient` methods now accept an optional\n      parameter :code:`retry_on: Optional[Tuple[Type[Exception], ...]] = None`,\n      which lets you specify a tuple of additional exceptions that can trigger\n      an automatic retry\n    - :code:`yadisk.types` module is now public\n    - Added basic logging of outgoing API requests and automatic retries\n    - The logger instance for the library can be accessed as\n      :code:`yadisk.settings.logger`\n    - Added :code:`YaDiskObject.field()` and the :code:`@` operator\n      (:code:`YaDiskObject.__matmul__()`) which verify that the given field is\n      not :code:`None`\n    - Added :code:`Client.get_upload_link_object()`,\n      :code:`AsyncClient.get_upload_link_object()` whose return values\n      additionally contain :code:`operation_id`\n    - :code:`utils.auto_retry()` now accepts more parameters\n    - Added a few missing fields for :code:`DiskInfoObject`\n    - :code:`EXIFObject` now contains GPS coordinates\n    - :code:`CaseInsensitiveDict` is now part of :code:`yadisk.utils`\n  * Improvements:\n\n    - Added full type hints for :code:`Client`, :code:`AsyncClient` through\n      :code:`.pyi` stub files\n    - Docstrings for :code:`Client` / :code:`AsyncClient` now include more\n      parameters\n    - Errors during JSON processing (e.g. :code:`InvalidResponseError`) also\n      trigger automatic retries\n    - Error message when the default session module is not available is now\n      less confusing (see `issue #43`_)\n    - Reduced :code:`Client.listdir()`'s default :code:`limit` to :code:`500`\n      from :code:`10000` to avoid timeouts on large directories (see `issue #45`_)\n    - Reduced :code:`Client.get_files()`'s default :code:`limit` to :code:`200`\n      from :code:`1000` to avoid timeouts\n    - :code:`Client.download()` and similar methods no longer set\n      :code:`Connection: close` header, since it's not necessary (unlike with\n      :code:`Client.upload()`)\n    - :code:`UnknownYaDiskError` now includes status code in the error message\n  * Bug fixes:\n\n    - Fixed :code:`httpx`- and :code:`aiohttp`-based session implementations\n      not converting their exceptions to :code:`RequestError` in their\n      :code:`Response.json()` / :code:`AsyncResponse.json()` implementations\n    - Fixed :code:`stream=True` not being set by default in\n      :code:`AsyncClient.download()`, :code:`AsyncClient.download_public()`\n  * Other changes:\n\n    - :code:`typing_extensions` is now required for Python < 3.10\n\n\n* **Release 2.1.0 (2024-01-03)**\n\n  * Fixed a bug where POST request parameters were not encoded correctly\n  * Fixed a bug in :code:`PycURLSession.send_request()` that made it ignore passed headers\n  * :code:`RequestsSession.close()` now closes all underlying session\n    instances, instead of only the current thread-local one\n  * All methods of :code:`Client` and :code:`AsyncClient` now use existing session\n  * Removed :code:`session_factory` attribute and :code:`make_session()` method\n    of :code:`Client` and :code:`AsyncClient`\n  * Session class can now be specified as a string\n  * Added :code:`Client.get_device_code()`/:code:`AsyncClient.get_device_code()` methods\n  * Added :code:`Client.get_token_from_device_code()`/:code:`AsyncClient.get_token_from_device_code()` methods\n  * Added missing :code:`redirect_uri` parameter for :code:`Client.get_auth_url()`/:code:`AsyncClient.get_auth_url()`\n    and :code:`Client.get_code_url()`/:code:`AsyncClient.get_code_url()`\n  * Added support for PKCE parameters for :code:`Client.get_auth_url()`/:code:`AsyncClient.get_auth_url()`,\n    :code:`Client.get_code_url()`/:code:`AsyncClient.get_code_url()` and\n    :code:`Client.get_token()`/:code:`AsyncClient.get_token()`\n  * Added :code:`scope` attribute for :code:`TokenObject`\n  * Added new exception classes: :code:`InvalidClientError`, :code:`InvalidGrantError`,\n    :code:`AuthorizationPendingError`, :code:`BadVerificationCodeError` and\n    :code:`UnsupportedTokenTypeError`\n\n* **Release 2.0.0 (2023-12-12)**\n\n  * The library now provides both synchronous and asynchronous APIs (see\n    `Introduction`_ and `API Reference`_)\n  * Multiple HTTP libraries are supported by default (see\n    `Available Session Implementations`_ for the full list)\n  * It is now possible to add support for any HTTP library (see\n    `Session Interface`_)\n  * `requests`_ is now an optional dependency (although it's still used by\n    default for synchronous API)\n  * Note that now requests-specific arguments must be passed differently\n    (see `Available Session Implementations`_)\n  * Preferred HTTP client libraries must be explicitly installed now\n    (see `Introduction`_)\n  * :code:`Client.upload()` and :code:`Client.upload_by_link()` can now accept\n    a function that returns an iterator (or a generator) as a payload\n\n* **Release 1.3.4 (2023-10-15)**\n\n  * :code:`upload()` and :code:`download()` (and related) methods can now\n    upload/download non-seekable file-like objects (e.g. :code:`stdin` or :code:`stdout`\n    when open in binary mode), see `PR #31`_\n\n* **Release 1.3.3 (2023-04-22)**\n\n  * :code:`app:/` paths now work correctly (see `issue #26`_)\n\n* **Release 1.3.2 (2023-03-20)**\n\n  * Fixed `issue #29`_: TypeError: 'type' object is not subscriptable\n\n* **Release 1.3.1 (2023-02-28)**\n\n  * Fixed `issue #28`_: calling :code:`download_public()` with :code:`path` keyword argument raises :code:`TypeError`\n  * Fixed :code:`AttributeError` raised when calling :code:`ResourceLinkObject.public_listdir()`\n\n* **Release 1.3.0 (2023-01-30)**\n\n  * Added convenience methods to :code:`...Object` objects (e.g. see :code:`ResourceObject` in docs)\n  * Added type hints\n  * Improved error checking and response validation\n  * Added :code:`InvalidResponseError`, :code:`PayloadTooLargeError`, :code:`UploadTrafficLimitExceededError`\n  * Added a few missing fields to :code:`DiskInfoObject` and :code:`SystemFoldersObject`\n  * Added :code:`rename()`, :code:`upload_by_link()` and :code:`download_by_link()` methods\n  * Added :code:`default_args` field for :code:`YaDisk` object\n  * :code:`download()` and :code:`upload()` now return :code:`ResourceLinkObject`\n  * Returned :code:`LinkObject` instances have been replaced by more specific subclasses\n  * :code:`ConnectionError` now also triggers a retry\n\n* **Release 1.2.19 (2023-01-20)**\n\n  * Fixed incorrect behavior of the fix from 1.2.18 for paths :code:`disk:`\n    and :code:`trash:` (only these two).\n\n* **Release 1.2.18 (2023-01-20)**\n\n  * Fixed `issue #26`_: ':' character in filenames causes :code:`BadRequestError`.\n    This is due the behavior of Yandex.Disk's REST API itself but is avoided\n    on the library level with this fix.\n\n* **Release 1.2.17 (2022-12-11)**\n\n  * Fixed a minor bug which could cause a :code:`ReferenceError`\n    (which would not cause a crash, but still show an error message). The bug\n    involved using :code:`__del__()` method in :code:`SelfDestructingSession`\n    to automatically close the sessions it seems to affect primarily old Python\n    versions (such as 3.4).\n\n* **Release 1.2.16 (2022-08-17)**\n\n  * Fixed a bug in :code:`check_token()`: could throw :code:`ForbiddenError` if\n    the application lacks necessary permissions (`issue #23`_).\n\n* **Release 1.2.15 (2021-12-31)**\n\n  * Fixed an issue where :code:`http://` links were not recognized as operation links\n    (they were assumed to always be :code:`https://`, since all the other\n    requests are always HTTPS).\n    Occasionally, Yandex.Disk can for some reason return an :code:`http://` link\n    to an asynchronous operation instead of :code:`https://`.\n    Both links are now recognized correctly and an :code:`https://` version will\n    always be used by :code:`get_operation_status()`, regardless of which one\n    Yandex.Disk returned.\n\n* **Release 1.2.14 (2019-03-26)**\n\n  * Fixed a :code:`TypeError` in :code:`get_public_*` functions when passing :code:`path` parameter\n    (see `issue #7`_)\n  * Added :code:`unlimited_autoupload_enabled` attribute for :code:`DiskInfoObject`\n\n* **Release 1.2.13 (2019-02-23)**\n\n  * Added :code:`md5` parameter for :code:`remove()`\n  * Added :code:`UserPublicInfoObject`\n  * Added :code:`country` attribute for :code:`UserObject`\n  * Added :code:`photoslice_time` attribute for :code:`ResourceObject`, :code:`PublicResourceObject`\n    and :code:`TrashResourceObject`\n\n* **Release 1.2.13 (2019-02-23)**\n\n  * Added :code:`md5` parameter for :code:`remove()`\n  * Added :code:`UserPublicInfoObject`\n  * Added :code:`country` attribute for :code:`UserObject`\n  * Added :code:`photoslice_time` attribute for :code:`ResourceObject`, :code:`PublicResourceObject`\n    and :code:`TrashResourceObject`\n\n* **Release 1.2.12 (2018-10-11)**\n\n  * Fixed `fields` parameter not working properly in `listdir()` (`issue #4`_)\n\n* **Release 1.2.11 (2018-06-30)**\n\n  * Added the missing parameter :code:`sort` for :code:`get_meta()`\n  * Added :code:`file` and :code:`antivirus_status` attributes for :code:`ResourceObject`,\n    :code:`PublicResourceObject` and :code:`TrashResourceObject`\n  * Added :code:`headers` parameter\n  * Fixed a typo in :code:`download()` and :code:`download_public()` (`issue #2`_)\n  * Removed :code:`*args` parameter everywhere\n\n* **Release 1.2.10 (2018-06-14)**\n\n  * Fixed :code:`timeout=None` behavior. :code:`None` is supposed to mean 'no timeout' but\n    in the older versions it was synonymous with the default timeout.\n\n* **Release 1.2.9 (2018-04-28)**\n\n  * Changed the license to LGPLv3 (see :code:`COPYING` and :code:`COPYING.lesser`)\n  * Other package info updates\n\n* **Release 1.2.8 (2018-04-17)**\n\n  * Fixed a couple of typos: :code:`PublicResourceListObject.items` and\n    :code:`TrashResourceListObject.items` had wrong types\n  * Substitute field aliases in :code:`fields` parameter when performing\n    API requests (e.g. :code:`embedded` -> :code:`_embedded`)\n\n* **Release 1.2.7 (2018-04-15)**\n\n  * Fixed a file rewinding bug when uploading/downloading files after a retry\n\n* **Release 1.2.6 (2018-04-13)**\n\n  * Now caching :code:`requests` sessions so that open connections\n    can be reused (which can significantly speed things up sometimes)\n  * Disable :code:`keep-alive` when uploading/downloading files by default\n\n* **Release 1.2.5 (2018-03-31)**\n\n  * Fixed an off-by-one bug in :code:`utils.auto_retry()`\n    (which could sometimes result in :code:`AttributeError`)\n  * Retry the whole request for :code:`upload()`, :code:`download()` and :code:`download_public()`\n  * Set :code:`stream=True` for :code:`download()` and :code:`download_public()`\n  * Other minor fixes\n\n* **Release 1.2.4 (2018-02-19)**\n\n  * Fixed :code:`TokenObject` having :code:`exprires_in` instead of :code:`expires_in` (fixed a typo)\n\n* **Release 1.2.3 (2018-01-20)**\n\n  * Fixed a :code:`TypeError` when :code:`WrongResourceTypeError` is raised\n\n* **Release 1.2.2 (2018-01-19)**\n\n  * :code:`refresh_token()` no longer requires a valid or empty token.\n\n* **Release 1.2.1 (2018-01-14)**\n\n  * Fixed auto retries not working. Whoops.\n\n* **Release 1.2.0 (2018-01-14)**\n\n  * Fixed passing :code:`n_retries=0` to :code:`upload()`,\n    :code:`download()` and :code:`download_public()`\n  * :code:`upload()`, :code:`download()` and :code:`download_public()`\n    no longer return anything (see the docs)\n  * Added :code:`utils` module (see the docs)\n  * Added :code:`RetriableYaDiskError`, :code:`WrongResourceTypeError`,\n    :code:`BadGatewayError` and :code:`GatewayTimeoutError`\n  * :code:`listdir()` now raises :code:`WrongResourceTypeError`\n    instead of :code:`NotADirectoryError`\n\n* **Release 1.1.1 (2017-12-29)**\n\n  * Fixed argument handling in :code:`upload()`, :code:`download()` and :code:`download_public()`.\n    Previously, passing :code:`n_retries` and :code:`retry_interval` would raise an exception (:code:`TypeError`).\n\n* **Release 1.1.0 (2017-12-27)**\n\n  * Better exceptions (see the docs)\n  * Added support for :code:`force_async` parameter\n  * Minor bug fixes\n\n* **Release 1.0.8 (2017-11-29)**\n\n  * Fixed yet another :code:`listdir()` bug\n\n* **Release 1.0.7 (2017-11-04)**\n\n  * Added :code:`install_requires` argument to :code:`setup.py`\n\n* **Release 1.0.6 (2017-11-04)**\n\n  * Return :code:`OperationLinkObject` in some functions\n\n* **Release 1.0.5 (2017-10-29)**\n\n  * Fixed :code:`setup.py` to exclude tests\n\n* **Release 1.0.4 (2017-10-23)**\n\n  * Fixed bugs in :code:`upload`, :code:`download` and :code:`listdir` functions\n  * Set default :code:`listdir` :code:`limit` to :code:`10000`\n\n* **Release 1.0.3 (2017-10-22)**\n\n  * Added settings\n\n* **Release 1.0.2 (2017-10-19)**\n\n  * Fixed :code:`get_code_url` function (added missing parameters)\n\n* **Release 1.0.1 (2017-10-18)**\n\n  * Fixed a major bug in :code:`GetTokenRequest` (added missing parameter)\n\n* **Release 1.0.0 (2017-10-18)**\n\n  * Initial release\n"
  },
  {
    "path": "README.rst",
    "content": "YaDisk\n======\n\n.. |RTD Badge| image:: https://img.shields.io/readthedocs/yadisk.svg\n   :alt: Read the Docs\n   :target: https://yadisk.readthedocs.io/ru/latest/\n\n.. |CI Badge| image:: https://img.shields.io/github/actions/workflow/status/ivknv/yadisk/lint_and_test.yml\n   :alt: GitHub Actions Workflow Status\n\n.. |PyPI Badge| image:: https://img.shields.io/pypi/v/yadisk.svg\n   :alt: PyPI\n   :target: https://pypi.org/project/yadisk\n\n.. |Python Version Badge| image:: https://img.shields.io/pypi/pyversions/yadisk\n   :alt: PyPI - Python Version\n\n.. |Coverage Badge| image:: https://coveralls.io/repos/github/ivknv/yadisk/badge.svg?branch=master\n   :alt: Coverage\n   :target: https://coveralls.io/github/ivknv/yadisk\n\n|RTD Badge| |CI Badge| |PyPI Badge| |Python Version Badge| |Coverage Badge|\n\n.. _English version of this document: https://github.com/ivknv/yadisk/blob/master/README.en.rst\n\n`English version of this document`_\n\nYaDisk - это библиотека-клиент REST API Яндекс.Диска.\n\n.. _Read the Docs (EN): https://yadisk.readthedocs.io\n.. _Read the Docs (RU): https://yadisk.readthedocs.io/ru/latest\n\nДокументация доступна на `Read the Docs (RU)`_ и `Read the Docs (EN)`_.\n\n.. contents:: Содержание:\n\nУстановка\n*********\n\n:code:`yadisk` поддерживает несколько HTTP библиотек и реализует одновременно как синхронный,\nтак и асинхронный API.\n\nНа данный момент поддерживаются следующие HTTP библиотеки:\n\n* :code:`requests` (используется по умолчанию для синхронного API)\n* :code:`httpx` (синхронный и асинхронный API, используется по умолчанию для асинхронного API)\n* :code:`aiohttp` (асинхронный API)\n* :code:`pycurl` (синхронный API)\n\nДля синхронного API (устанавливает :code:`requests`):\n\n.. code:: bash\n\n    pip install yadisk[sync-defaults]\n\nДля асинхронного API (устанавливает :code:`httpx` и :code:`aiofiles`):\n\n.. code:: bash\n\n   pip install yadisk[async-defaults]\n\nВы можете также вручную установить нужные библиотеки:\n\n.. code:: bash\n\n   # Для использования совместно с pycurl\n   pip install yadisk[pycurl]\n\n   # Для использования совместно с aiohttp, также установит aiofiles\n   pip install yadisk[async-files,aiohttp]\n\nПримеры\n*******\n\nСинхронный API\n--------------\n\n.. code:: python\n\n    import yadisk\n\n    client = yadisk.Client(token=\"<токен>\")\n    # или\n    # client = yadisk.Client(\"<id-приложения>\", \"<secret-приложения>\", \"<токен>\")\n\n    # Вы можете использовать либо конструкцию with, либо вручную вызвать client.close() в конце\n    with client:\n        # Проверяет, валиден ли токен\n        print(client.check_token())\n\n        # Получает общую информацию о диске\n        print(client.get_disk_info())\n\n        # Выводит содержимое \"/some/path\"\n        print(list(client.listdir(\"/some/path\")))\n\n        # Загружает \"file_to_upload.txt\" в \"/destination.txt\"\n        client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # То же самое\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            client.upload(f, \"/destination.txt\")\n\n        # Скачивает \"/some-file-to-download.txt\" в \"downloaded.txt\"\n        client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # Безвозвратно удаляет \"/file-to-remove\"\n        client.remove(\"/file-to-remove\", permanently=True)\n\n        # Создаёт новую папку \"/test-dir\"\n        print(client.mkdir(\"/test-dir\"))\n\nАсинхронный API\n---------------\n\n.. code:: python\n\n    import yadisk\n    import aiofiles\n\n    client = yadisk.AsyncClient(token=\"<token>\")\n    # или\n    # client = yadisk.AsyncClient(\"<application-id>\", \"<application-secret>\", \"<token>\")\n\n    # Вы можете использовать либо конструкцию with, либо вручную вызвать client.close() в конце\n    async with client:\n        # Проверяет, валиден ли токен\n        print(await client.check_token())\n\n        # Получает общую информацию о диске\n        print(await client.get_disk_info())\n\n        # Выводит содержимое \"/some/path\"\n        print([i async for i in client.listdir(\"/some/path\")])\n\n        # Загружает \"file_to_upload.txt\" в \"/destination.txt\"\n        await client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # То же самое\n        async with aiofiles.open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # То же самое, но с обычными файлами\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # Скачивает \"/some-file-to-download.txt\" в \"downloaded.txt\"\n        await client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # То же самое\n        async with aiofiles.open(\"downloaded.txt\", \"wb\") as f:\n            await client.download(\"/some-file-to-download.txt\", f)\n\n        # Безвозвратно удаляет \"/file-to-remove\"\n        await client.remove(\"/file-to-remove\", permanently=True)\n\n        # Создаёт новую папку \"/test-dir\"\n        print(await client.mkdir(\"/test-dir\"))\n\nУчастие в разработке\n********************\n\nЕсли вы хотите поучаствовать в разработке, см.\n`CONTRIBUTING.rst <https://github.com/ivknv/yadisk/blob/master/CONTRIBUTING.rst>`_.\n\nИстория изменений\n*****************\n\n.. _issue #2: https://github.com/ivknv/yadisk/issues/2\n.. _issue #4: https://github.com/ivknv/yadisk/issues/4\n.. _issue #7: https://github.com/ivknv/yadisk/issues/7\n.. _issue #23: https://github.com/ivknv/yadisk/issues/23\n.. _issue #26: https://github.com/ivknv/yadisk/issues/26\n.. _issue #28: https://github.com/ivknv/yadisk/issues/28\n.. _issue #29: https://github.com/ivknv/yadisk/issues/29\n.. _PR #31: https://github.com/ivknv/yadisk/pull/31\n.. _issue #43: https://github.com/ivknv/yadisk/issues/43\n.. _issue #45: https://github.com/ivknv/yadisk/issues/45\n.. _issue #49: https://github.com/ivknv/yadisk/issues/49\n.. _issue #53: https://github.com/ivknv/yadisk/issues/53\n.. _Введение: https://yadisk.readthedocs.io/ru/latest/intro.html\n.. _Справочник API: https://yadisk.readthedocs.io/ru/latest/api_reference/index.html\n.. _Доступные реализации сессий: https://yadisk.readthedocs.io/ru/latest/api_reference/sessions.html\n.. _Интерфейс Session: https://yadisk.readthedocs.io/ru/latest/api_reference/session_interface.html\n.. _requests: https://pypi.org/project/requests\n.. _Руководство по миграции: https://yadisk.readthedocs.io/ru/latest/migration_guide.html\n.. _PR #57: https://github.com/ivknv/yadisk/pull/57\n.. _issue #62: https://github.com/ivknv/yadisk/issues/62\n\n* **Release 3.4.1 (2026-04-16)**\n\n  * Исправления:\n\n    * Исправлена ошибка :code:`TypeError` при передаче пути к файлу в\n      :code:`AsyncClient.download()` или :code:`AsyncClient.upload()` без\n      установленного :code:`aiofiles` (см. `issue #62`_)\n\n    * Обход проблемы, когда Яндекс.Диск игнорирует тело запроса для\n      :code:`Client.patch()` и :code:`Client.update_public_settings()` при\n      использовании :code:`pycurl` из-за задания заголовка :code:`Transfer-Encoding: chunked`\n      по умолчанию\n\n* **Release 3.4.0 (2025-07-10)**\n\n  * Нововведения:\n\n    * Добавлены методы для управления настройками публичного доступа к ресурсам:\n\n      * :code:`Client.update_public_settings()`\n      * :code:`Client.get_public_settings()`\n      * :code:`Client.get_public_available_settings()`\n\n      Внимание: похоже, что эти эндпоинты не полностью соответствуют\n      официальной документации REST API, их функциональность на практике\n      ограничена.\n\n    * Добавлен новый класс исключений :code:`PasswordRequiredError`\n\n    * Добавлено несколько новых полей :code:`DiskInfoObject`:\n\n      * :code:`deletion_restricion_days`\n      * :code:`hide_screenshots_in_photoslice`\n      * :code:`is_legal_entity`\n\n    * Реализован метод :code:`__dir__()` для объектов ответов сервера\n\n  * Улучшения:\n\n    * :code:`repr()` объектов ответов API теперь показывает только те ключи,\n      которые фактически присутствуют (вместо отображения их значений как\n      :code:`None`, как раньше)\n\n* **Release 3.3.0 (2025-04-29)**\n\n  * Нововведения:\n\n    * Спуфинг User-Agent для обхода ограничения скорости загрузки файлов на\n      Диск (см. `PR #57`_). :code:`Client.upload()` и связанные с ним методы\n      (включая :code:`AsyncClient`) имеют новый опциональный параметр\n      :code:`spoof_user_agent`, который по умолчанию имеет значение\n      :code:`True`. Этот параметр можно использовать для отключения спуфинга,\n      если это необходимо.\n\n    * Добавлена поддержка pretty-printing в IPython для :code:`YaDiskObject` и\n      производных классов\n\n  * Исправления:\n\n    * :code:`Client.wait_for_operation()` теперь использует\n      :code:`time.monotonic()` вместо :code:`time.time()`\n\n  * Улучшения:\n\n    * Сообщения об ошибках REST API теперь чётко разделены на четыре части\n      (сообщение, описание, код ошибки и код состояния HTTP)\n\n* **Release 3.2.0 (2025-02-03)**\n\n  * Нововведения:\n\n    * Добавлен новый метод: :code:`Client.makedirs()` и\n      :code:`AsyncClient.makedirs()` (см. `issue #53`_)\n    * Добавлено несколько недостающих полей :code:`DiskInfoObject`\n\n      * :code:`photounlim_size`\n      * :code:`will_be_overdrawn`\n      * :code:`free_photounlim_end_date`\n      * :code:`payment_flow`\n\n    * Добавлено недостающее поле :code:`sizes` для :code:`ResourceObject` и\n      связанных с ним объектов\n\n  * Исправления:\n\n    * :code:`Client.rename()` / :code:`AsyncClient.rename()` теперь вызывает\n      :code:`ValueError` при попытке переименовать корневую папку\n    * Номера автоматических повторных попыток логировались с ошибкой на\n      единицу, теперь они логируются правильно\n\n* **Release 3.1.0 (2024-07-12)**\n\n  * Нововведения:\n\n    * Добавлены новые исключения: :code:`GoneError` и\n      :code:`ResourceDownloadLimitExceededError`\n    * Добавлен новый метод: :code:`Client.get_all_public_resources()` и\n      :code:`AsyncClient.get_all_public_resources()`\n  * Исправления:\n\n    * Задание :code:`headers` и других опциональных параметров сессии как\n      :code:`None` больше не вызывает ошибок\n    * Исправлено неправильное поведение :code:`Client.rename()` и\n      :code:`AsyncClient.rename()` при указании пустого имени файла\n    * Исправлено несколько опечаток в асинхронных реализациях\n      convenience-методов (:code:`listdir()` и аналогичных)\n    * Исправлен неправильный тип данных у атрибута :code:`items` класса\n      :code:`PublicResourceListObject`\n    * Исправлены ошибки при отправке запросов API с помощью\n      :code:`PycURLSession` при задании :code:`stream=True`\n    * Данные не будут записаны в файл методами :code:`Client.download()`,\n      :code:`Client.download_by_link()`, :code:`AsyncClient.download()` и\n      :code:`AsyncClient.download_by_link()`, если сервер вернул ошибочный код\n      состояния\n\n* **Release 3.0.1 (2024-07-09)**\n\n  * Исправлен сломанный :code:`pyproject.toml`, который не включал в сборку\n    полное содержимое пакета (см. `issue #49`_)\n\n* **Release 3.0.0 (2024-07-09)**\n\n  * Несовместимые изменения:\n\n    - См. `Руководство по миграции`_ для подробностей\n    - Все методы теперь ожидают завершения асинхронных операций по умолчанию\n      (см. новый параметр :code:`wait=<bool>`)\n    - Итерация по результату :code:`AsyncClient.listdir()` больше не требует\n      дополнительного ключевого слова await\n    - Число возвращаемых файлов :code:`Client.get_files()` /\n      :code:`AsyncClient.get_files()` теперь контролируется параметром\n      :code:`max_items`, вместо :code:`limit`\n    - Методы :code:`set_token()`, :code:`set_headers()` интерфейсов\n      :code:`Session` и :code:`AsyncSession` были удалены\n    - Некоторые методы больше не принимают параметр :code:`fields`\n    - :code:`Client.get_last_uploaded()` /\n      :code:`AsyncClient.get_last_uploaded()` теперь возвращает список вместо\n      генератора\n    - :code:`yadisk.api` - теперь скрытый модуль\n    - Все скрытые модули были переименованы, их имена начинаются с :code:`_`\n      (например, :code:`yadisk._api`)\n  * Нововведения:\n\n    - Добавлены методы для ожидания завершения асинхронной операции (см.\n      :code:`Client.wait_for_operation()` /\n      :code:`AsyncClient.wait_for_operation()`)\n    - Методы, которые могут запускать асинхронную операцию, теперь принимают\n      дополнительные параметры: :code:`wait: bool = True`,\n      :code:`poll_interval: float = 1.0` и\n      :code:`poll_timeout: Optional[float] = None`\n    - :code:`Client.listdir()`, :code:`Client.get_files()` и их асинхронные\n      вариации теперь принимают новый параметр :code:`max_items: Optional[int] =\n      None`, который может быть использован, чтобы ограничить максимальное число\n      возвращаемых файлов\n    - Большинство методов :code:`Client` и :code:`AsyncClient` теперь принимает\n      :code:`retry_on: Optional[Tuple[Type[Exception], ...]] = None`, который\n      позволяет указывать кортеж из дополнительных исключений, которые могут вызвать\n      автоматическую повторную попытку\n    - Модуль :code:`yadisk.types` - теперь публичный\n    - Добавлено логирование исходящих запросов к API и автоматических\n      повторных попыток\n    - Объект логгера библиотеки доступен как :code:`yadisk.settings.logger`\n    - Добавлен метод :code:`YaDiskObject.field()` и оператор :code:`@`\n      (:code:`YaDiskObject.__matmul__()`), который удостоверяется, что указанное\n      поле объекта не является :code:`None`\n    - Добавлены методы :code:`Client.get_upload_link_object()`,\n      :code:`AsyncClient.get_upload_link_object()`, возвращаемые значения которых\n      дополнительно содержат :code:`operation_id`\n    - :code:`utils.auto_retry()` теперь принимает больше параметров\n    - Добавлено несколько недостающих полей :code:`DiskInfoObject`\n    - :code:`EXIFObject` теперь содержит GPS-координаты\n    - :code:`CaseInsensitiveDict` - теперь часть :code:`yadisk.utils`\n  * Улучшения:\n\n    - Добавлены полные подсказки типов для :code:`Client` и :code:`AsyncClient` с\n      помощью файлов :code:`.pyi`\n    - Строки документации для :code:`Client` / :code:`AsyncClient` теперь\n      включают в себя больше параметров\n    - Ошибки во время обработки JSON (например, :code:`InvalidResponseError`)\n      также вызывают автоматические повторные попытки\n    - Сообщение об ошибке в случае, когда модуль сессии по умолчанию\n      недоступен, теперь не вводит в заблуждение (см. `issue #43`_)\n    - Уменьшено значение :code:`limit` до :code:`500` (было :code:`10000`)\n      для :code:`Client.listdir()` для избежания таймаутов при больших папках\n      (см. `issue #45`_)\n    - Уменьшено значение :code:`limit` до :code:`200` (было :code:`1000`)\n      для :code:`Client.get_files()` для избежания таймаутов\n    - :code:`Client.download()` и подобные методы больше не задают заголовок\n      :code:`Connection: close` т.к. в этом нет необходимости (в отличие от\n      :code:`Client.upload()`)\n    - :code:`UnknownYaDiskError` теперь включает код статуса в сообщение об\n      ошибке\n  * Исправления:\n\n    - Исправлены реализации на основе :code:`httpx` и :code:`aiohttp`:\n      реализации методов :code:`Response.json()` / :code:`AsyncResponse.json()`\n      не преобразовывали свои исключения в :code:`RequestError`\n    - Исправлено: параметр :code:`stream=True` был не задан по умолчанию в\n      :code:`AsyncClient.download()`, :code:`AsyncClient.download_public()`\n  * Другие изменения:\n\n    - :code:`typing_extensions` теперь требуется для Python < 3.10\n\n* **Release 2.1.0 (2024-01-03)**\n\n  * Исправлен баг, из-за которого параметры в теле POST-запроса неправильно кодировались\n  * Исправлен баг в :code:`PycURLSession.send_request()`, из-за которого\n    переданные заголовки игнорировались\n  * :code:`RequestsSession.close()` теперь закрывает сессию для всех потоков\n  * Все методы :code:`Client` и :code:`AsyncClient` теперь используют\n    существующую сессию\n  * Удалены аттрибут :code:`session_factory` и метод :code:`make_session()`\n    классов :code:`Client` и :code:`AsyncClient`\n  * Класс сессии теперь может быть указан в качестве строки\n    (см. :code:`Client`/:code:`AsyncClient`)\n  * Добавлены методы :code:`Client.get_device_code()`/:code:`AsyncClient.get_device_code()`\n  * Добавлены методы :code:`Client.get_token_from_device_code()`/:code:`AsyncClient.get_token_from_device_code()`\n  * Добавлен недостающий параметр :code:`redirect_uri` для\n    :code:`Client.get_auth_url()`/:code:`AsyncClient.get_auth_url()` и\n    :code:`Client.get_code_url()`/:code:`AsyncClient.get_code_url()`\n  * Добавлена поддержка параметров PKCE для\n    :code:`Client.get_auth_url()`/:code:`AsyncClient.get_auth_url()`,\n    :code:`Client.get_code_url()`/:code:`AsyncClient.get_code_url()` и\n    :code:`Client.get_token()`/:code:`AsyncClient.get_token()`\n  * Добавлен аттрибут :code:`scope` для :code:`TokenObject`\n  * Добавлены новые классы исключений: :code:`InvalidClientError`,\n    :code:`InvalidGrantError`, :code:`AuthorizationPendingError`,\n    :code:`BadVerificationCodeError` и :code:`UnsupportedTokenTypeError`\n\n* **Release 2.0.0 (2023-12-12)**\n\n  * Библиотека теперь предоставляет как синхронный, так и асинхронный API\n    (см. `Введение`_ и `Справочник API`_)\n  * Теперь поддерживается несколько HTTP библиотек (см.\n    `Доступные реализации сессий`_ для полного списка)\n  * Теперь возможно добавить поддержку любой HTTP библиотеки\n    (см. `Интерфейс Session`_)\n  * `requests`_ - теперь опциональная зависимость (хотя всё ещё используется\n    по умолчанию для синхронного API)\n  * Обратите внимание, что аргументы, специфичные для requests теперь передаются\n    по другому (см. `Доступные реализации сессий`_)\n  * Предпочитаемые HTTP библиотеки теперь должны быть установлены явным образом\n    (см. `Введение`_)\n  * :code:`Client.upload()` и :code:`Client.upload_by_link()` теперь могут\n    принимать функцию, возвращающую итератор (или генератор) в качестве полезной\n    нагрузки\n\n* **Release 1.3.4 (2023-10-15)**\n\n  * Методы :code:`upload()` и :code:`download()` (и связянные с ними) теперь\n    могут загружать/скачивать файлы, не поддерживающие операцию :code:`seek()`\n    (например, :code:`stdin` и :code:`stdout`, при условии, что они открыты в\n    режиме :code:`\"rb\"` или :code:`\"wb\"`), см. `PR #31`_\n\n* **Release 1.3.3 (2023-04-22)**\n\n  * Пути вида :code:`app:/` теперь работают правильно (см. `issue #26`_)\n\n* **Release 1.3.2 (2023-03-20)**\n\n  * Исправлено `issue #29`_: TypeError: 'type' object is not subscriptable\n\n* **Release 1.3.1 (2023-02-28)**\n\n  * Исправлено `issue #28`_: :code:`TypeError` при вызове :code:`download_public()` с параметром :code:`path`\n  * Исправлено :code:`AttributeError` при вызове :code:`ResourceLinkObject.public_listdir()`\n\n* **Release 1.3.0 (2023-01-30)**\n\n  * Добавлены convenience-методы для объектов :code:`...Object` (например, см. :code:`ResourceObject`)\n  * Добавлены подсказки типов (type hints)\n  * Улучшены проверки ошибок и проверка ответа\n  * Добавлены :code:`InvalidResponseError`, :code:`PayloadTooLargeError`, :code:`UploadTrafficLimitExceededError`\n  * Добавлено несколько недостающих полей объектов :code:`DiskInfoObject` и :code:`SystemFoldersObject`\n  * Добавлены методы :code:`rename()`, :code:`upload_by_link()` и :code:`download_by_link()`\n  * Добавлен аттрибут :code:`default_args` объекта :code:`YaDisk`\n  * :code:`download()` и :code:`upload()` теперь возвращают :code:`ResourceLinkObject`\n  * До этого возвращаемые объекты :code:`LinkObject` были заменены более конкретными подклассами\n  * :code:`ConnectionError` теперь тоже вызывает повторную попытку\n\n* **Release 1.2.19 (2023-01-20)**\n\n  * Исправлено неправильное поведение фикса из 1.2.18 для путей :code:`disk:`\n    и :code:`trash:`.\n\n* **Release 1.2.18 (2023-01-20)**\n\n  * Исправлено `issue #26`_: символ ':' в именах файлов приводит к\n    :code:`BadRequestError`. Это поведение вызвано работой самого REST API\n    Яндекс.Диска, но было исправлено на уровне библиотеки.\n\n* **Release 1.2.17 (2022-12-11)**\n\n  * Исправлен баг, связанный с автоматическим закрытием сессии. Использование\n    метода :code:`__del__()` приводило в некоторых случаях к ошибке\n    :code:`ReferenceError` (ошибка игнорировалась, но сообщение выводилось).\n    Баг проявляется по большей части в старых версиях Python (например 3.4).\n\n* **Release 1.2.16 (2022-08-17)**\n\n  * Исправлен баг в :code:`check_token()`: функция могла вызвать :code:`ForbiddenError`,\n    если у приложения недостатчно прав (`issue #23`_).\n\n* **Release 1.2.15 (2021-12-31)**\n\n  * Исправлено: не распознавались ссылки на асинхронные операции, если они\n    использовали :code:`http://` (вместо :code:`https://`).\n    Иногда Яндекс.Диск может вернуть :code:`http://` ссылку на асинхронную\n    операцию. Теперь обе версии ссылок распознаются правильно, при этом,\n    при получении информации об операции (через :code:`get_operation_status()`)\n    всегда используется :code:`https://` версия ссылки, даже если Яндекс.Диск\n    вернул :code:`http://`.\n\n* **Release 1.2.14 (2019-03-26)**\n\n  * Исправлена ошибка :code:`TypeError` в функциях :code:`get_public_*` при\n    использовании с параметром :code:`path` (`issue #7`_)\n  * Добавлен аттрибут :code:`unlimited_autoupload_enabled` для :code:`DiskInfoObject`\n\n* **Release 1.2.13 (2019-02-23)**\n\n  * Добавлен :code:`md5` параметр для :code:`remove()`\n  * Добавлен :code:`UserPublicInfoObject`\n  * Добавлен аттрибут :code:`country` для :code:`UserObject`\n  * Добавлен аттрибут :code:`photoslice_time` для :code:`ResourceObject`, :code:`PublicResourceObject`\n    и :code:`TrashResourceObject`\n\n* **Release 1.2.12 (2018-10-11)**\n\n  * Исправлен баг: не работает параметр `fields` в `listdir()` (`issue #4`_)\n\n* **Release 1.2.11 (2018-06-30)**\n\n  * Добавлен недостающий параметр :code:`sort` для :code:`get_meta()`\n  * Добавлены аттрибуты :code:`file` и :code:`antivirus_status` для :code:`ResourceObject`,\n    :code:`PublicResourceObject` и :code:`TrashResourceObject`\n  * Добавлен параметр :code:`headers`\n  * Исправлена опечатка в :code:`download()` и :code:`download_public()` (`issue #2`_)\n  * Убран параметр :code:`*args`\n\n* **Release 1.2.10 (2018-06-14)**\n\n  * Исправлено поведение :code:`timeout=None`. :code:`None` должен означать „без таймаута“,\n    но в предыдущих версиях значение :code:`None` было синонимично со стандартным таймаутом.\n\n* **Release 1.2.9 (2018-04-28)**\n\n  * Изменена лицензия на LGPLv3 (см. :code:`COPYING` и :code:`COPYING.lesser`)\n  * Другие изменения информации о пакете\n\n* **Release 1.2.8 (2018-04-17)**\n\n  * Исправлено несколько опечаток: у :code:`PublicResourceListObject.items` и\n    :code:`TrashResourceListObject.items` были неправильные типы данных\n  * Псевдонимы полей в параметре :code:`fields` заменяются при выполнении\n    запросов API (например, :code:`embedded` -> :code:`_embedded`)\n\n* **Release 1.2.7 (2018-04-15)**\n\n  * Исправлен баг перемотки файла при загрузке/скачивании после повторной попытки\n\n* **Release 1.2.6 (2018-04-13)**\n\n  * Теперь объекты сессий :code:`requests` кэшируются, чтобы их можно\n    было переиспользовать (иногда может существенно ускорить выполнение запросов)\n  * :code:`keep-alive` отключается при загрузке/скачивании файлов по умолчанию\n\n* **Release 1.2.5 (2018-03-31)**\n\n  * Исправлен баг (ошибка на единицу) в :code:`utils.auto_retry()` (иногда мог вызвать :code:`AttributeError`)\n  * Повторные попытки применяются для :code:`upload()`, :code:`download()` и :code:`download_public()` целиком\n  * Задано :code:`stream=True` для :code:`download()` и :code:`download_public()`\n  * Другие мелкие исправления\n\n* **Release 1.2.4 (2018-02-19)**\n\n  * Исправлена опечатка (:code:`TokenObject.exprires_in` -> :code:`TokenObject.expires_in`)\n\n* **Release 1.2.3 (2018-01-20)**\n\n  * Исправлено :code:`TypeError` при вызове :code:`WrongResourceTypeError`\n\n* **Release 1.2.2 (2018-01-19)**\n\n  * :code:`refresh_token()` больше не требует валидный или пустой токен.\n\n* **Release 1.2.1 (2018-01-14)**\n\n  * Исправлена неработоспособность повторных попыток.\n\n* **Release 1.2.0 (2018-01-14)**\n\n  * Исправлено использование :code:`n_retries=0` в :code:`upload()`, :code:`download()` и :code:`download_public()`\n  * :code:`upload()`, :code:`download()` и :code:`download_public()` больше не возвращают ничего (см. документацию)\n  * Добавлен модуль :code:`utils` (см. документацию)\n  * Добавлены :code:`RetriableYaDiskError`, :code:`WrongResourceTypeError`, :code:`BadGatewayError` и :code:`GatewayTimeoutError`\n  * :code:`listdir()` теперь вызывает :code:`WrongResourceTypeError` вместо :code:`NotADirectoryError`\n\n* **Release 1.1.1 (2017-12-29)**\n\n  * Исправлена обработка аргументов в :code:`upload()`, :code:`download()` и :code:`download_public()`.\n    До этого использование :code:`n_retries` и :code:`retry_interval` вызывало исключение (:code:`TypeError`).\n\n* **Release 1.1.0 (2017-12-27)**\n\n  * Усовершенствованные исключения (см. документацию)\n  * Добавлена поддержка параметра :code:`force_async`\n  * Мелкие исправления багов\n\n* **Release 1.0.8 (2017-11-29)**\n\n  * Исправлен ещё один баг в :code:`listdir()`\n\n* **Release 1.0.7 (2017-11-04)**\n\n  * Добавлен :code:`install_requires` в :code:`setup.py`\n\n* **Release 1.0.6 (2017-11-04)**\n\n  * Некоторые функции теперь возвращают :code:`OperationLinkObject`\n\n* **Release 1.0.5 (2017-10-29)**\n\n  * Исправлен :code:`setup.py`, теперь исключает тесты\n\n* **Release 1.0.4 (2017-10-23)**\n\n  * Исправлены баги в :code:`upload`, :code:`download` и :code:`listdir`\n  * Значение по-умолчанию :code:`limit` в :code:`listdir` установлено в :code:`10000`\n\n* **Release 1.0.3 (2017-10-22)**\n\n  * Добавлен модуль :code:`settings`\n\n* **Release 1.0.2 (2017-10-19)**\n\n  * Исправлена функция :code:`get_code_url` (добавлены недостающие параметры)\n\n* **Release 1.0.1 (2017-10-18)**\n\n  * Исправлен серьёзный баг в :code:`GetTokenRequest` (добавлен недостающий параметр)\n\n* **Release 1.0.0 (2017-10-18)**\n\n  * Первый релиз\n"
  },
  {
    "path": "README.ru.rst",
    "content": "YaDisk\n======\n\n.. |RTD Badge| image:: https://img.shields.io/readthedocs/yadisk.svg\n   :alt: Read the Docs\n   :target: https://yadisk.readthedocs.io/ru/latest/\n\n.. |CI Badge| image:: https://img.shields.io/github/actions/workflow/status/ivknv/yadisk/lint_and_test.yml\n   :alt: GitHub Actions Workflow Status\n\n.. |PyPI Badge| image:: https://img.shields.io/pypi/v/yadisk.svg\n   :alt: PyPI\n   :target: https://pypi.org/project/yadisk\n\n.. |Python Version Badge| image:: https://img.shields.io/pypi/pyversions/yadisk\n   :alt: PyPI - Python Version\n\n.. |Coverage Badge| image:: https://coveralls.io/repos/github/ivknv/yadisk/badge.svg?branch=master\n   :alt: Coverage\n   :target: https://coveralls.io/github/ivknv/yadisk\n\n|RTD Badge| |CI Badge| |PyPI Badge| |Python Version Badge| |Coverage Badge|\n\n.. _English version of this document: https://github.com/ivknv/yadisk/blob/master/README.en.rst\n\n`English version of this document`_\n\nYaDisk - это библиотека-клиент REST API Яндекс.Диска.\n\n.. _Read the Docs (EN): https://yadisk.readthedocs.io\n.. _Read the Docs (RU): https://yadisk.readthedocs.io/ru/latest\n\nДокументация доступна на `Read the Docs (RU)`_ и `Read the Docs (EN)`_.\n\n.. contents:: Содержание:\n\nУстановка\n*********\n\n:code:`yadisk` поддерживает несколько HTTP библиотек и реализует одновременно как синхронный,\nтак и асинхронный API.\n\nНа данный момент поддерживаются следующие HTTP библиотеки:\n\n* :code:`requests` (используется по умолчанию для синхронного API)\n* :code:`httpx` (синхронный и асинхронный API, используется по умолчанию для асинхронного API)\n* :code:`aiohttp` (асинхронный API)\n* :code:`pycurl` (синхронный API)\n\nДля синхронного API (устанавливает :code:`requests`):\n\n.. code:: bash\n\n    pip install yadisk[sync-defaults]\n\nДля асинхронного API (устанавливает :code:`httpx` и :code:`aiofiles`):\n\n.. code:: bash\n\n   pip install yadisk[async-defaults]\n\nВы можете также вручную установить нужные библиотеки:\n\n.. code:: bash\n\n   # Для использования совместно с pycurl\n   pip install yadisk[pycurl]\n\n   # Для использования совместно с aiohttp, также установит aiofiles\n   pip install yadisk[async-files,aiohttp]\n\nПримеры\n*******\n\nСинхронный API\n--------------\n\n.. code:: python\n\n    import yadisk\n\n    client = yadisk.Client(token=\"<токен>\")\n    # или\n    # client = yadisk.Client(\"<id-приложения>\", \"<secret-приложения>\", \"<токен>\")\n\n    # Вы можете использовать либо конструкцию with, либо вручную вызвать client.close() в конце\n    with client:\n        # Проверяет, валиден ли токен\n        print(client.check_token())\n\n        # Получает общую информацию о диске\n        print(client.get_disk_info())\n\n        # Выводит содержимое \"/some/path\"\n        print(list(client.listdir(\"/some/path\")))\n\n        # Загружает \"file_to_upload.txt\" в \"/destination.txt\"\n        client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # То же самое\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            client.upload(f, \"/destination.txt\")\n\n        # Скачивает \"/some-file-to-download.txt\" в \"downloaded.txt\"\n        client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # Безвозвратно удаляет \"/file-to-remove\"\n        client.remove(\"/file-to-remove\", permanently=True)\n\n        # Создаёт новую папку \"/test-dir\"\n        print(client.mkdir(\"/test-dir\"))\n\nАсинхронный API\n---------------\n\n.. code:: python\n\n    import yadisk\n    import aiofiles\n\n    client = yadisk.AsyncClient(token=\"<token>\")\n    # или\n    # client = yadisk.AsyncClient(\"<application-id>\", \"<application-secret>\", \"<token>\")\n\n    # Вы можете использовать либо конструкцию with, либо вручную вызвать client.close() в конце\n    async with client:\n        # Проверяет, валиден ли токен\n        print(await client.check_token())\n\n        # Получает общую информацию о диске\n        print(await client.get_disk_info())\n\n        # Выводит содержимое \"/some/path\"\n        print([i async for i in client.listdir(\"/some/path\")])\n\n        # Загружает \"file_to_upload.txt\" в \"/destination.txt\"\n        await client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # То же самое\n        async with aiofiles.open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # То же самое, но с обычными файлами\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # Скачивает \"/some-file-to-download.txt\" в \"downloaded.txt\"\n        await client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # То же самое\n        async with aiofiles.open(\"downloaded.txt\", \"wb\") as f:\n            await client.download(\"/some-file-to-download.txt\", f)\n\n        # Безвозвратно удаляет \"/file-to-remove\"\n        await client.remove(\"/file-to-remove\", permanently=True)\n\n        # Создаёт новую папку \"/test-dir\"\n        print(await client.mkdir(\"/test-dir\"))\n\nУчастие в разработке\n********************\n\nЕсли вы хотите поучаствовать в разработке, см.\n`CONTRIBUTING.rst <https://github.com/ivknv/yadisk/blob/master/CONTRIBUTING.rst>`_.\n\nИстория изменений\n*****************\n\n.. _issue #2: https://github.com/ivknv/yadisk/issues/2\n.. _issue #4: https://github.com/ivknv/yadisk/issues/4\n.. _issue #7: https://github.com/ivknv/yadisk/issues/7\n.. _issue #23: https://github.com/ivknv/yadisk/issues/23\n.. _issue #26: https://github.com/ivknv/yadisk/issues/26\n.. _issue #28: https://github.com/ivknv/yadisk/issues/28\n.. _issue #29: https://github.com/ivknv/yadisk/issues/29\n.. _PR #31: https://github.com/ivknv/yadisk/pull/31\n.. _issue #43: https://github.com/ivknv/yadisk/issues/43\n.. _issue #45: https://github.com/ivknv/yadisk/issues/45\n.. _issue #49: https://github.com/ivknv/yadisk/issues/49\n.. _issue #53: https://github.com/ivknv/yadisk/issues/53\n.. _Введение: https://yadisk.readthedocs.io/ru/latest/intro.html\n.. _Справочник API: https://yadisk.readthedocs.io/ru/latest/api_reference/index.html\n.. _Доступные реализации сессий: https://yadisk.readthedocs.io/ru/latest/api_reference/sessions.html\n.. _Интерфейс Session: https://yadisk.readthedocs.io/ru/latest/api_reference/session_interface.html\n.. _requests: https://pypi.org/project/requests\n.. _Руководство по миграции: https://yadisk.readthedocs.io/ru/latest/migration_guide.html\n.. _PR #57: https://github.com/ivknv/yadisk/pull/57\n.. _issue #62: https://github.com/ivknv/yadisk/issues/62\n\n* **Release 3.4.1 (2026-04-16)**\n\n  * Исправления:\n\n    * Исправлена ошибка :code:`TypeError` при передаче пути к файлу в\n      :code:`AsyncClient.download()` или :code:`AsyncClient.upload()` без\n      установленного :code:`aiofiles` (см. `issue #62`_)\n\n    * Обход проблемы, когда Яндекс.Диск игнорирует тело запроса для\n      :code:`Client.patch()` и :code:`Client.update_public_settings()` при\n      использовании :code:`pycurl` из-за задания заголовка :code:`Transfer-Encoding: chunked`\n      по умолчанию\n\n* **Release 3.4.0 (2025-07-10)**\n\n  * Нововведения:\n\n    * Добавлены методы для управления настройками публичного доступа к ресурсам:\n\n      * :code:`Client.update_public_settings()`\n      * :code:`Client.get_public_settings()`\n      * :code:`Client.get_public_available_settings()`\n\n      Внимание: похоже, что эти эндпоинты не полностью соответствуют\n      официальной документации REST API, их функциональность на практике\n      ограничена.\n\n    * Добавлен новый класс исключений :code:`PasswordRequiredError`\n\n    * Добавлено несколько новых полей :code:`DiskInfoObject`:\n\n      * :code:`deletion_restricion_days`\n      * :code:`hide_screenshots_in_photoslice`\n      * :code:`is_legal_entity`\n\n    * Реализован метод :code:`__dir__()` для объектов ответов сервера\n\n  * Улучшения:\n\n    * :code:`repr()` объектов ответов API теперь показывает только те ключи,\n      которые фактически присутствуют (вместо отображения их значений как\n      :code:`None`, как раньше)\n\n* **Release 3.3.0 (2025-04-29)**\n\n  * Нововведения:\n\n    * Спуфинг User-Agent для обхода ограничения скорости загрузки файлов на\n      Диск (см. `PR #57`_). :code:`Client.upload()` и связанные с ним методы\n      (включая :code:`AsyncClient`) имеют новый опциональный параметр\n      :code:`spoof_user_agent`, который по умолчанию имеет значение\n      :code:`True`. Этот параметр можно использовать для отключения спуфинга,\n      если это необходимо.\n\n    * Добавлена поддержка pretty-printing в IPython для :code:`YaDiskObject` и\n      производных классов\n\n  * Исправления:\n\n    * :code:`Client.wait_for_operation()` теперь использует\n      :code:`time.monotonic()` вместо :code:`time.time()`\n\n  * Улучшения:\n\n    * Сообщения об ошибках REST API теперь чётко разделены на четыре части\n      (сообщение, описание, код ошибки и код состояния HTTP)\n\n* **Release 3.2.0 (2025-02-03)**\n\n  * Нововведения:\n\n    * Добавлен новый метод: :code:`Client.makedirs()` и\n      :code:`AsyncClient.makedirs()` (см. `issue #53`_)\n    * Добавлено несколько недостающих полей :code:`DiskInfoObject`\n\n      * :code:`photounlim_size`\n      * :code:`will_be_overdrawn`\n      * :code:`free_photounlim_end_date`\n      * :code:`payment_flow`\n\n    * Добавлено недостающее поле :code:`sizes` для :code:`ResourceObject` и\n      связанных с ним объектов\n\n  * Исправления:\n\n    * :code:`Client.rename()` / :code:`AsyncClient.rename()` теперь вызывает\n      :code:`ValueError` при попытке переименовать корневую папку\n    * Номера автоматических повторных попыток логировались с ошибкой на\n      единицу, теперь они логируются правильно\n\n* **Release 3.1.0 (2024-07-12)**\n\n  * Нововведения:\n\n    * Добавлены новые исключения: :code:`GoneError` и\n      :code:`ResourceDownloadLimitExceededError`\n    * Добавлен новый метод: :code:`Client.get_all_public_resources()` и\n      :code:`AsyncClient.get_all_public_resources()`\n  * Исправления:\n\n    * Задание :code:`headers` и других опциональных параметров сессии как\n      :code:`None` больше не вызывает ошибок\n    * Исправлено неправильное поведение :code:`Client.rename()` и\n      :code:`AsyncClient.rename()` при указании пустого имени файла\n    * Исправлено несколько опечаток в асинхронных реализациях\n      convenience-методов (:code:`listdir()` и аналогичных)\n    * Исправлен неправильный тип данных у атрибута :code:`items` класса\n      :code:`PublicResourceListObject`\n    * Исправлены ошибки при отправке запросов API с помощью\n      :code:`PycURLSession` при задании :code:`stream=True`\n    * Данные не будут записаны в файл методами :code:`Client.download()`,\n      :code:`Client.download_by_link()`, :code:`AsyncClient.download()` и\n      :code:`AsyncClient.download_by_link()`, если сервер вернул ошибочный код\n      состояния\n\n* **Release 3.0.1 (2024-07-09)**\n\n  * Исправлен сломанный :code:`pyproject.toml`, который не включал в сборку\n    полное содержимое пакета (см. `issue #49`_)\n\n* **Release 3.0.0 (2024-07-09)**\n\n  * Несовместимые изменения:\n\n    - См. `Руководство по миграции`_ для подробностей\n    - Все методы теперь ожидают завершения асинхронных операций по умолчанию\n      (см. новый параметр :code:`wait=<bool>`)\n    - Итерация по результату :code:`AsyncClient.listdir()` больше не требует\n      дополнительного ключевого слова await\n    - Число возвращаемых файлов :code:`Client.get_files()` /\n      :code:`AsyncClient.get_files()` теперь контролируется параметром\n      :code:`max_items`, вместо :code:`limit`\n    - Методы :code:`set_token()`, :code:`set_headers()` интерфейсов\n      :code:`Session` и :code:`AsyncSession` были удалены\n    - Некоторые методы больше не принимают параметр :code:`fields`\n    - :code:`Client.get_last_uploaded()` /\n      :code:`AsyncClient.get_last_uploaded()` теперь возвращает список вместо\n      генератора\n    - :code:`yadisk.api` - теперь скрытый модуль\n    - Все скрытые модули были переименованы, их имена начинаются с :code:`_`\n      (например, :code:`yadisk._api`)\n  * Нововведения:\n\n    - Добавлены методы для ожидания завершения асинхронной операции (см.\n      :code:`Client.wait_for_operation()` /\n      :code:`AsyncClient.wait_for_operation()`)\n    - Методы, которые могут запускать асинхронную операцию, теперь принимают\n      дополнительные параметры: :code:`wait: bool = True`,\n      :code:`poll_interval: float = 1.0` и\n      :code:`poll_timeout: Optional[float] = None`\n    - :code:`Client.listdir()`, :code:`Client.get_files()` и их асинхронные\n      вариации теперь принимают новый параметр :code:`max_items: Optional[int] =\n      None`, который может быть использован, чтобы ограничить максимальное число\n      возвращаемых файлов\n    - Большинство методов :code:`Client` и :code:`AsyncClient` теперь принимает\n      :code:`retry_on: Optional[Tuple[Type[Exception], ...]] = None`, который\n      позволяет указывать кортеж из дополнительных исключений, которые могут вызвать\n      автоматическую повторную попытку\n    - Модуль :code:`yadisk.types` - теперь публичный\n    - Добавлено логирование исходящих запросов к API и автоматических\n      повторных попыток\n    - Объект логгера библиотеки доступен как :code:`yadisk.settings.logger`\n    - Добавлен метод :code:`YaDiskObject.field()` и оператор :code:`@`\n      (:code:`YaDiskObject.__matmul__()`), который удостоверяется, что указанное\n      поле объекта не является :code:`None`\n    - Добавлены методы :code:`Client.get_upload_link_object()`,\n      :code:`AsyncClient.get_upload_link_object()`, возвращаемые значения которых\n      дополнительно содержат :code:`operation_id`\n    - :code:`utils.auto_retry()` теперь принимает больше параметров\n    - Добавлено несколько недостающих полей :code:`DiskInfoObject`\n    - :code:`EXIFObject` теперь содержит GPS-координаты\n    - :code:`CaseInsensitiveDict` - теперь часть :code:`yadisk.utils`\n  * Улучшения:\n\n    - Добавлены полные подсказки типов для :code:`Client` и :code:`AsyncClient` с\n      помощью файлов :code:`.pyi`\n    - Строки документации для :code:`Client` / :code:`AsyncClient` теперь\n      включают в себя больше параметров\n    - Ошибки во время обработки JSON (например, :code:`InvalidResponseError`)\n      также вызывают автоматические повторные попытки\n    - Сообщение об ошибке в случае, когда модуль сессии по умолчанию\n      недоступен, теперь не вводит в заблуждение (см. `issue #43`_)\n    - Уменьшено значение :code:`limit` до :code:`500` (было :code:`10000`)\n      для :code:`Client.listdir()` для избежания таймаутов при больших папках\n      (см. `issue #45`_)\n    - Уменьшено значение :code:`limit` до :code:`200` (было :code:`1000`)\n      для :code:`Client.get_files()` для избежания таймаутов\n    - :code:`Client.download()` и подобные методы больше не задают заголовок\n      :code:`Connection: close` т.к. в этом нет необходимости (в отличие от\n      :code:`Client.upload()`)\n    - :code:`UnknownYaDiskError` теперь включает код статуса в сообщение об\n      ошибке\n  * Исправления:\n\n    - Исправлены реализации на основе :code:`httpx` и :code:`aiohttp`:\n      реализации методов :code:`Response.json()` / :code:`AsyncResponse.json()`\n      не преобразовывали свои исключения в :code:`RequestError`\n    - Исправлено: параметр :code:`stream=True` был не задан по умолчанию в\n      :code:`AsyncClient.download()`, :code:`AsyncClient.download_public()`\n  * Другие изменения:\n\n    - :code:`typing_extensions` теперь требуется для Python < 3.10\n\n* **Release 2.1.0 (2024-01-03)**\n\n  * Исправлен баг, из-за которого параметры в теле POST-запроса неправильно кодировались\n  * Исправлен баг в :code:`PycURLSession.send_request()`, из-за которого\n    переданные заголовки игнорировались\n  * :code:`RequestsSession.close()` теперь закрывает сессию для всех потоков\n  * Все методы :code:`Client` и :code:`AsyncClient` теперь используют\n    существующую сессию\n  * Удалены аттрибут :code:`session_factory` и метод :code:`make_session()`\n    классов :code:`Client` и :code:`AsyncClient`\n  * Класс сессии теперь может быть указан в качестве строки\n    (см. :code:`Client`/:code:`AsyncClient`)\n  * Добавлены методы :code:`Client.get_device_code()`/:code:`AsyncClient.get_device_code()`\n  * Добавлены методы :code:`Client.get_token_from_device_code()`/:code:`AsyncClient.get_token_from_device_code()`\n  * Добавлен недостающий параметр :code:`redirect_uri` для\n    :code:`Client.get_auth_url()`/:code:`AsyncClient.get_auth_url()` и\n    :code:`Client.get_code_url()`/:code:`AsyncClient.get_code_url()`\n  * Добавлена поддержка параметров PKCE для\n    :code:`Client.get_auth_url()`/:code:`AsyncClient.get_auth_url()`,\n    :code:`Client.get_code_url()`/:code:`AsyncClient.get_code_url()` и\n    :code:`Client.get_token()`/:code:`AsyncClient.get_token()`\n  * Добавлен аттрибут :code:`scope` для :code:`TokenObject`\n  * Добавлены новые классы исключений: :code:`InvalidClientError`,\n    :code:`InvalidGrantError`, :code:`AuthorizationPendingError`,\n    :code:`BadVerificationCodeError` и :code:`UnsupportedTokenTypeError`\n\n* **Release 2.0.0 (2023-12-12)**\n\n  * Библиотека теперь предоставляет как синхронный, так и асинхронный API\n    (см. `Введение`_ и `Справочник API`_)\n  * Теперь поддерживается несколько HTTP библиотек (см.\n    `Доступные реализации сессий`_ для полного списка)\n  * Теперь возможно добавить поддержку любой HTTP библиотеки\n    (см. `Интерфейс Session`_)\n  * `requests`_ - теперь опциональная зависимость (хотя всё ещё используется\n    по умолчанию для синхронного API)\n  * Обратите внимание, что аргументы, специфичные для requests теперь передаются\n    по другому (см. `Доступные реализации сессий`_)\n  * Предпочитаемые HTTP библиотеки теперь должны быть установлены явным образом\n    (см. `Введение`_)\n  * :code:`Client.upload()` и :code:`Client.upload_by_link()` теперь могут\n    принимать функцию, возвращающую итератор (или генератор) в качестве полезной\n    нагрузки\n\n* **Release 1.3.4 (2023-10-15)**\n\n  * Методы :code:`upload()` и :code:`download()` (и связянные с ними) теперь\n    могут загружать/скачивать файлы, не поддерживающие операцию :code:`seek()`\n    (например, :code:`stdin` и :code:`stdout`, при условии, что они открыты в\n    режиме :code:`\"rb\"` или :code:`\"wb\"`), см. `PR #31`_\n\n* **Release 1.3.3 (2023-04-22)**\n\n  * Пути вида :code:`app:/` теперь работают правильно (см. `issue #26`_)\n\n* **Release 1.3.2 (2023-03-20)**\n\n  * Исправлено `issue #29`_: TypeError: 'type' object is not subscriptable\n\n* **Release 1.3.1 (2023-02-28)**\n\n  * Исправлено `issue #28`_: :code:`TypeError` при вызове :code:`download_public()` с параметром :code:`path`\n  * Исправлено :code:`AttributeError` при вызове :code:`ResourceLinkObject.public_listdir()`\n\n* **Release 1.3.0 (2023-01-30)**\n\n  * Добавлены convenience-методы для объектов :code:`...Object` (например, см. :code:`ResourceObject`)\n  * Добавлены подсказки типов (type hints)\n  * Улучшены проверки ошибок и проверка ответа\n  * Добавлены :code:`InvalidResponseError`, :code:`PayloadTooLargeError`, :code:`UploadTrafficLimitExceededError`\n  * Добавлено несколько недостающих полей объектов :code:`DiskInfoObject` и :code:`SystemFoldersObject`\n  * Добавлены методы :code:`rename()`, :code:`upload_by_link()` и :code:`download_by_link()`\n  * Добавлен аттрибут :code:`default_args` объекта :code:`YaDisk`\n  * :code:`download()` и :code:`upload()` теперь возвращают :code:`ResourceLinkObject`\n  * До этого возвращаемые объекты :code:`LinkObject` были заменены более конкретными подклассами\n  * :code:`ConnectionError` теперь тоже вызывает повторную попытку\n\n* **Release 1.2.19 (2023-01-20)**\n\n  * Исправлено неправильное поведение фикса из 1.2.18 для путей :code:`disk:`\n    и :code:`trash:`.\n\n* **Release 1.2.18 (2023-01-20)**\n\n  * Исправлено `issue #26`_: символ ':' в именах файлов приводит к\n    :code:`BadRequestError`. Это поведение вызвано работой самого REST API\n    Яндекс.Диска, но было исправлено на уровне библиотеки.\n\n* **Release 1.2.17 (2022-12-11)**\n\n  * Исправлен баг, связанный с автоматическим закрытием сессии. Использование\n    метода :code:`__del__()` приводило в некоторых случаях к ошибке\n    :code:`ReferenceError` (ошибка игнорировалась, но сообщение выводилось).\n    Баг проявляется по большей части в старых версиях Python (например 3.4).\n\n* **Release 1.2.16 (2022-08-17)**\n\n  * Исправлен баг в :code:`check_token()`: функция могла вызвать :code:`ForbiddenError`,\n    если у приложения недостатчно прав (`issue #23`_).\n\n* **Release 1.2.15 (2021-12-31)**\n\n  * Исправлено: не распознавались ссылки на асинхронные операции, если они\n    использовали :code:`http://` (вместо :code:`https://`).\n    Иногда Яндекс.Диск может вернуть :code:`http://` ссылку на асинхронную\n    операцию. Теперь обе версии ссылок распознаются правильно, при этом,\n    при получении информации об операции (через :code:`get_operation_status()`)\n    всегда используется :code:`https://` версия ссылки, даже если Яндекс.Диск\n    вернул :code:`http://`.\n\n* **Release 1.2.14 (2019-03-26)**\n\n  * Исправлена ошибка :code:`TypeError` в функциях :code:`get_public_*` при\n    использовании с параметром :code:`path` (`issue #7`_)\n  * Добавлен аттрибут :code:`unlimited_autoupload_enabled` для :code:`DiskInfoObject`\n\n* **Release 1.2.13 (2019-02-23)**\n\n  * Добавлен :code:`md5` параметр для :code:`remove()`\n  * Добавлен :code:`UserPublicInfoObject`\n  * Добавлен аттрибут :code:`country` для :code:`UserObject`\n  * Добавлен аттрибут :code:`photoslice_time` для :code:`ResourceObject`, :code:`PublicResourceObject`\n    и :code:`TrashResourceObject`\n\n* **Release 1.2.12 (2018-10-11)**\n\n  * Исправлен баг: не работает параметр `fields` в `listdir()` (`issue #4`_)\n\n* **Release 1.2.11 (2018-06-30)**\n\n  * Добавлен недостающий параметр :code:`sort` для :code:`get_meta()`\n  * Добавлены аттрибуты :code:`file` и :code:`antivirus_status` для :code:`ResourceObject`,\n    :code:`PublicResourceObject` и :code:`TrashResourceObject`\n  * Добавлен параметр :code:`headers`\n  * Исправлена опечатка в :code:`download()` и :code:`download_public()` (`issue #2`_)\n  * Убран параметр :code:`*args`\n\n* **Release 1.2.10 (2018-06-14)**\n\n  * Исправлено поведение :code:`timeout=None`. :code:`None` должен означать „без таймаута“,\n    но в предыдущих версиях значение :code:`None` было синонимично со стандартным таймаутом.\n\n* **Release 1.2.9 (2018-04-28)**\n\n  * Изменена лицензия на LGPLv3 (см. :code:`COPYING` и :code:`COPYING.lesser`)\n  * Другие изменения информации о пакете\n\n* **Release 1.2.8 (2018-04-17)**\n\n  * Исправлено несколько опечаток: у :code:`PublicResourceListObject.items` и\n    :code:`TrashResourceListObject.items` были неправильные типы данных\n  * Псевдонимы полей в параметре :code:`fields` заменяются при выполнении\n    запросов API (например, :code:`embedded` -> :code:`_embedded`)\n\n* **Release 1.2.7 (2018-04-15)**\n\n  * Исправлен баг перемотки файла при загрузке/скачивании после повторной попытки\n\n* **Release 1.2.6 (2018-04-13)**\n\n  * Теперь объекты сессий :code:`requests` кэшируются, чтобы их можно\n    было переиспользовать (иногда может существенно ускорить выполнение запросов)\n  * :code:`keep-alive` отключается при загрузке/скачивании файлов по умолчанию\n\n* **Release 1.2.5 (2018-03-31)**\n\n  * Исправлен баг (ошибка на единицу) в :code:`utils.auto_retry()` (иногда мог вызвать :code:`AttributeError`)\n  * Повторные попытки применяются для :code:`upload()`, :code:`download()` и :code:`download_public()` целиком\n  * Задано :code:`stream=True` для :code:`download()` и :code:`download_public()`\n  * Другие мелкие исправления\n\n* **Release 1.2.4 (2018-02-19)**\n\n  * Исправлена опечатка (:code:`TokenObject.exprires_in` -> :code:`TokenObject.expires_in`)\n\n* **Release 1.2.3 (2018-01-20)**\n\n  * Исправлено :code:`TypeError` при вызове :code:`WrongResourceTypeError`\n\n* **Release 1.2.2 (2018-01-19)**\n\n  * :code:`refresh_token()` больше не требует валидный или пустой токен.\n\n* **Release 1.2.1 (2018-01-14)**\n\n  * Исправлена неработоспособность повторных попыток.\n\n* **Release 1.2.0 (2018-01-14)**\n\n  * Исправлено использование :code:`n_retries=0` в :code:`upload()`, :code:`download()` и :code:`download_public()`\n  * :code:`upload()`, :code:`download()` и :code:`download_public()` больше не возвращают ничего (см. документацию)\n  * Добавлен модуль :code:`utils` (см. документацию)\n  * Добавлены :code:`RetriableYaDiskError`, :code:`WrongResourceTypeError`, :code:`BadGatewayError` и :code:`GatewayTimeoutError`\n  * :code:`listdir()` теперь вызывает :code:`WrongResourceTypeError` вместо :code:`NotADirectoryError`\n\n* **Release 1.1.1 (2017-12-29)**\n\n  * Исправлена обработка аргументов в :code:`upload()`, :code:`download()` и :code:`download_public()`.\n    До этого использование :code:`n_retries` и :code:`retry_interval` вызывало исключение (:code:`TypeError`).\n\n* **Release 1.1.0 (2017-12-27)**\n\n  * Усовершенствованные исключения (см. документацию)\n  * Добавлена поддержка параметра :code:`force_async`\n  * Мелкие исправления багов\n\n* **Release 1.0.8 (2017-11-29)**\n\n  * Исправлен ещё один баг в :code:`listdir()`\n\n* **Release 1.0.7 (2017-11-04)**\n\n  * Добавлен :code:`install_requires` в :code:`setup.py`\n\n* **Release 1.0.6 (2017-11-04)**\n\n  * Некоторые функции теперь возвращают :code:`OperationLinkObject`\n\n* **Release 1.0.5 (2017-10-29)**\n\n  * Исправлен :code:`setup.py`, теперь исключает тесты\n\n* **Release 1.0.4 (2017-10-23)**\n\n  * Исправлены баги в :code:`upload`, :code:`download` и :code:`listdir`\n  * Значение по-умолчанию :code:`limit` в :code:`listdir` установлено в :code:`10000`\n\n* **Release 1.0.3 (2017-10-22)**\n\n  * Добавлен модуль :code:`settings`\n\n* **Release 1.0.2 (2017-10-19)**\n\n  * Исправлена функция :code:`get_code_url` (добавлены недостающие параметры)\n\n* **Release 1.0.1 (2017-10-18)**\n\n  * Исправлен серьёзный баг в :code:`GetTokenRequest` (добавлен недостающий параметр)\n\n* **Release 1.0.0 (2017-10-18)**\n\n  * Первый релиз\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = python -msphinx\nSPHINXPROJ    = YaDisk\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)"
  },
  {
    "path": "docs/api_reference/async_api.rst",
    "content": "Asynchronous API\n================\n\n.. autoclass:: yadisk.AsyncClient\n\n   .. automethod:: close\n\n.. autoclass:: yadisk.AsyncYaDisk\n\nAuthentication\n--------------\n\n.. automethod:: yadisk.AsyncClient.check_token\n.. automethod:: yadisk.AsyncClient.get_auth_url\n.. automethod:: yadisk.AsyncClient.get_code_url\n.. automethod:: yadisk.AsyncClient.get_device_code\n.. automethod:: yadisk.AsyncClient.get_token\n.. automethod:: yadisk.AsyncClient.get_token_from_device_code\n.. automethod:: yadisk.AsyncClient.refresh_token\n.. automethod:: yadisk.AsyncClient.revoke_token\n\nDisk Info\n---------\n\n.. automethod:: yadisk.AsyncClient.get_disk_info\n\nMetadata About Files\n--------------------\n\n.. automethod:: yadisk.AsyncClient.get_meta\n.. automethod:: yadisk.AsyncClient.listdir\n.. automethod:: yadisk.AsyncClient.exists\n.. automethod:: yadisk.AsyncClient.get_type\n.. automethod:: yadisk.AsyncClient.is_file\n.. automethod:: yadisk.AsyncClient.is_dir\n.. automethod:: yadisk.AsyncClient.get_files\n.. automethod:: yadisk.AsyncClient.get_last_uploaded\n\nUploading Files\n---------------\n\n.. automethod:: yadisk.AsyncClient.upload\n.. automethod:: yadisk.AsyncClient.get_upload_link\n.. automethod:: yadisk.AsyncClient.get_upload_link_object\n.. automethod:: yadisk.AsyncClient.upload_by_link\n.. automethod:: yadisk.AsyncClient.upload_url\n\nDownloading Files\n-----------------\n\n.. automethod:: yadisk.AsyncClient.download\n.. automethod:: yadisk.AsyncClient.get_download_link\n.. automethod:: yadisk.AsyncClient.download_by_link\n\n\nFile Operations\n---------------\n\nCreating Directories\n^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.AsyncClient.mkdir\n.. automethod:: yadisk.AsyncClient.makedirs\n\n\nRemoving Files\n^^^^^^^^^^^^^^\n.. automethod:: yadisk.AsyncClient.remove\n\nCopying Files\n^^^^^^^^^^^^^\n.. automethod:: yadisk.AsyncClient.copy\n\nMoving Files\n^^^^^^^^^^^^\n\n.. automethod:: yadisk.AsyncClient.move\n.. automethod:: yadisk.AsyncClient.rename\n\nSetting Custom Properties\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.AsyncClient.patch\n\nPublic Files\n------------\n\nPublishing/Unpublishing Files\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.AsyncClient.publish\n.. automethod:: yadisk.AsyncClient.unpublish\n\nMetadata About Public Files\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.AsyncClient.get_public_meta\n.. automethod:: yadisk.AsyncClient.get_public_type\n.. automethod:: yadisk.AsyncClient.is_public_dir\n.. automethod:: yadisk.AsyncClient.is_public_file\n.. automethod:: yadisk.AsyncClient.public_exists\n\nDownloading Public Files\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.AsyncClient.get_public_download_link\n.. automethod:: yadisk.AsyncClient.download_public\n\nSaving Public Resources to Disk\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.AsyncClient.save_to_disk\n\nListing Public Files\n^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.AsyncClient.get_public_resources\n.. automethod:: yadisk.AsyncClient.get_all_public_resources\n\nPublic Access Settings\n----------------------\n\n.. automethod:: yadisk.AsyncClient.get_public_settings\n.. automethod:: yadisk.AsyncClient.get_public_available_settings\n.. automethod:: yadisk.AsyncClient.update_public_settings\n\nTrash\n-----\n\n.. automethod:: yadisk.AsyncClient.get_trash_meta\n.. automethod:: yadisk.AsyncClient.trash_exists\n.. automethod:: yadisk.AsyncClient.restore_trash\n.. automethod:: yadisk.AsyncClient.remove_trash\n.. automethod:: yadisk.AsyncClient.trash_listdir\n.. automethod:: yadisk.AsyncClient.get_trash_type\n.. automethod:: yadisk.AsyncClient.is_trash_dir\n.. automethod:: yadisk.AsyncClient.is_trash_file\n\nChecking Operation Status\n-------------------------\n\n.. automethod:: yadisk.AsyncClient.get_operation_status\n.. automethod:: yadisk.AsyncClient.wait_for_operation\n"
  },
  {
    "path": "docs/api_reference/exceptions.rst",
    "content": "Exceptions\n==========\n\n.. automodule:: yadisk.exceptions\n   :members:\n   :show-inheritance:\n"
  },
  {
    "path": "docs/api_reference/index.rst",
    "content": "API Reference\n=============\n\n.. toctree::\n   :maxdepth: 1\n   :caption: Contents:\n\n   sync_api\n   async_api\n   types\n   sessions\n   settings\n   exceptions\n   response_objects\n   session_interface\n   utilities\n"
  },
  {
    "path": "docs/api_reference/response_objects.rst",
    "content": "Response Objects\n================\n\n.. automodule:: yadisk.objects\n   :members:\n   :special-members: __matmul__\n   :show-inheritance:\n"
  },
  {
    "path": "docs/api_reference/session_interface.rst",
    "content": "Session Interface\n=================\n\nThe :any:`Session` and :any:`AsyncSession` are abstract classes that act as adapters\nto underlying HTTP client libraries. A session instance is used by :any:`Client`\nor :any:`AsyncClient` to perform all the HTTP requests to the Yandex.Disk API.\n\nThese interfaces can be implemented to add support for any HTTP library.\nFor a concrete example, see the source code of any existing implementation\n(e.g. :any:`HTTPXSession`).\n\nSynchronous\n###########\n\n.. autoclass:: yadisk.Session\n   :members:\n\n.. autoclass:: yadisk.Response\n   :members:\n\nAsynchronous\n############\n\n.. autoclass:: yadisk.AsyncSession\n   :members:\n\n.. autoclass:: yadisk.AsyncResponse\n   :members:\n"
  },
  {
    "path": "docs/api_reference/sessions.rst",
    "content": "Available Session Implementations\n=================================\n\nYou can choose which HTTP library will be used by :any:`Client` and :any:`AsyncClient`\nby specifying the :code:`session` parameter.\nBelow you can see the list of session implementations that are shipped with the :code:`yadisk` library.\n\nAlternatively, you can make your own :any:`Session`/:any:`AsyncSession` implementation.\nFor a concrete example, take a look at the source code of any existing implementations (e.g. :any:`HTTPXSession`).\n\nSynchronous Implementations\n###########################\n\n.. autoclass:: yadisk.sessions.requests_session.RequestsSession\n   :show-inheritance:\n\n.. autoclass:: yadisk.sessions.httpx_session.HTTPXSession\n   :show-inheritance:\n\n.. autoclass:: yadisk.sessions.pycurl_session.PycURLSession\n   :show-inheritance:\n\nAsynchronous Implementations\n############################\n\n.. autoclass:: yadisk.sessions.aiohttp_session.AIOHTTPSession\n   :show-inheritance:\n\n.. autoclass:: yadisk.sessions.async_httpx_session.AsyncHTTPXSession\n   :show-inheritance:\n\nImporting Session Classes\n#########################\n\nYou can use the following functions to import a session class by name:\n\n.. autofunction:: yadisk.import_session\n.. autofunction:: yadisk.import_async_session\n"
  },
  {
    "path": "docs/api_reference/settings.rst",
    "content": "Settings\n========\n\nThe following settings can be accessed and changed at runtime in `yadisk.settings` module:\n\n.. automodule:: yadisk.settings\n   :members:\n   :show-inheritance:\n"
  },
  {
    "path": "docs/api_reference/sync_api.rst",
    "content": "Synchronous API\n===============\n\n.. autoclass:: yadisk.Client\n\n   .. automethod:: close\n\n.. autoclass:: yadisk.YaDisk\n\nAuthentication\n--------------\n\n.. automethod:: yadisk.Client.check_token\n.. automethod:: yadisk.Client.get_auth_url\n.. automethod:: yadisk.Client.get_code_url\n.. automethod:: yadisk.Client.get_device_code\n.. automethod:: yadisk.Client.get_token\n.. automethod:: yadisk.Client.get_token_from_device_code\n.. automethod:: yadisk.Client.refresh_token\n.. automethod:: yadisk.Client.revoke_token\n\nDisk Info\n---------\n\n.. automethod:: yadisk.Client.get_disk_info\n\nMetadata About Files\n--------------------\n\n.. automethod:: yadisk.Client.get_meta\n.. automethod:: yadisk.Client.listdir\n.. automethod:: yadisk.Client.exists\n.. automethod:: yadisk.Client.get_type\n.. automethod:: yadisk.Client.is_file\n.. automethod:: yadisk.Client.is_dir\n.. automethod:: yadisk.Client.get_files\n.. automethod:: yadisk.Client.get_last_uploaded\n\nUploading Files\n---------------\n\n.. automethod:: yadisk.Client.upload\n.. automethod:: yadisk.Client.get_upload_link\n.. automethod:: yadisk.Client.get_upload_link_object\n.. automethod:: yadisk.Client.upload_by_link\n.. automethod:: yadisk.Client.upload_url\n\nDownloading Files\n-----------------\n\n.. automethod:: yadisk.Client.download\n.. automethod:: yadisk.Client.get_download_link\n.. automethod:: yadisk.Client.download_by_link\n\n\nFile Operations\n---------------\n\nCreating Directories\n^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.Client.mkdir\n.. automethod:: yadisk.Client.makedirs\n\n\nRemoving Files\n^^^^^^^^^^^^^^\n.. automethod:: yadisk.Client.remove\n\nCopying Files\n^^^^^^^^^^^^^\n.. automethod:: yadisk.Client.copy\n\nMoving Files\n^^^^^^^^^^^^\n\n.. automethod:: yadisk.Client.move\n.. automethod:: yadisk.Client.rename\n\nSetting Custom Properties\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.Client.patch\n\nPublic Files\n------------\n\nPublishing/Unpublishing Files\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.Client.publish\n.. automethod:: yadisk.Client.unpublish\n\n\nMetadata About Public Files\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.Client.get_public_meta\n.. automethod:: yadisk.Client.get_public_type\n.. automethod:: yadisk.Client.is_public_dir\n.. automethod:: yadisk.Client.is_public_file\n.. automethod:: yadisk.Client.public_exists\n\nDownloading Public Files\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.Client.get_public_download_link\n.. automethod:: yadisk.Client.download_public\n\nSaving Public Resources to Disk\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.Client.save_to_disk\n\nListing Public Files\n^^^^^^^^^^^^^^^^^^^^\n\n.. automethod:: yadisk.Client.get_public_resources\n.. automethod:: yadisk.Client.get_all_public_resources\n\nPublic Access Settings\n----------------------\n\n.. automethod:: yadisk.Client.get_public_settings\n.. automethod:: yadisk.Client.get_public_available_settings\n.. automethod:: yadisk.Client.update_public_settings\n\nTrash\n-----\n\n.. automethod:: yadisk.Client.get_trash_meta\n.. automethod:: yadisk.Client.trash_exists\n.. automethod:: yadisk.Client.restore_trash\n.. automethod:: yadisk.Client.remove_trash\n.. automethod:: yadisk.Client.trash_listdir\n.. automethod:: yadisk.Client.get_trash_type\n.. automethod:: yadisk.Client.is_trash_dir\n.. automethod:: yadisk.Client.is_trash_file\n\nChecking Operation Status\n-------------------------\n\n.. automethod:: yadisk.Client.get_operation_status\n.. automethod:: yadisk.Client.wait_for_operation\n"
  },
  {
    "path": "docs/api_reference/types.rst",
    "content": "Types\n=====\n\n.. automodule:: yadisk.types\n   :members:\n   :show-inheritance:\n"
  },
  {
    "path": "docs/api_reference/utilities.rst",
    "content": "Utilities\n=========\n\n.. automodule:: yadisk.utils\n   :members:\n"
  },
  {
    "path": "docs/changelog.rst",
    "content": "Changelog\n=========\n\n.. _issue #2: https://github.com/ivknv/yadisk/issues/2\n.. _issue #4: https://github.com/ivknv/yadisk/issues/4\n.. _issue #7: https://github.com/ivknv/yadisk/issues/7\n.. _issue #23: https://github.com/ivknv/yadisk/issues/23\n.. _issue #26: https://github.com/ivknv/yadisk/issues/26\n.. _issue #28: https://github.com/ivknv/yadisk/issues/28\n.. _issue #29: https://github.com/ivknv/yadisk/issues/29\n.. _PR #31: https://github.com/ivknv/yadisk/pull/31\n.. _issue #43: https://github.com/ivknv/yadisk/issues/43\n.. _issue #45: https://github.com/ivknv/yadisk/issues/45\n.. _issue #49: https://github.com/ivknv/yadisk/issues/49\n.. _issue #53: https://github.com/ivknv/yadisk/issues/53\n.. _requests: https://pypi.org/project/requests\n.. _PR #57: https://github.com/ivknv/yadisk/pull/57\n.. _issue #62: https://github.com/ivknv/yadisk/issues/62\n\n.. role:: python(code)\n   :language: python\n\n* **Release 3.4.1 (2026-04-16)**\n\n  * Bug fixes:\n\n    * Fixed a :code:`TypeError` when passing a file path to\n      :any:`AsyncClient.download()` or :any:`AsyncClient.upload()` while not\n      having :code:`aiofiles` installed (see `issue #62`_)\n\n    * Work around Yandex.Disk ignoring request body for :any:`Client.patch()` and\n      :any:`Client.update_public_settings()` when using :code:`pycurl` due to\n      setting :code:`Transfer-Encoding: chunked` by default\n\n* **Release 3.4.0 (2025-07-10)**\n\n  * New features:\n\n    * Added methods for managing public settings of resources:\n\n      * :any:`Client.update_public_settings()`\n      * :any:`Client.get_public_settings()`\n      * :any:`Client.get_public_available_settings()`\n\n      Note, it appears that these API endpoints do not fully conform to the\n      official REST API documentation, their functionality is limited in\n      practice.\n\n    * Added new exception class :any:`PasswordRequiredError`\n\n    * Added several new fields for :any:`DiskInfoObject`:\n\n      * :code:`deletion_restricion_days`\n      * :code:`hide_screenshots_in_photoslice`\n      * :code:`is_legal_entity`\n\n    * Implemented the :code:`__dir__()` method for response objects\n\n  * Improvements:\n\n    * :code:`repr()` of API response objects now only shows the keys that are\n      actually present (instead of displaying them as :code:`None` like before)\n\n* **Release 3.3.0 (2025-04-29)**\n\n  * New features:\n\n    * User-Agent spoofing to bypass Yandex.Disk's upload speed limit (see `PR #57`_).\n      :any:`Client.upload()` and related methods (including :any:`AsyncClient`)\n      have a new optional parameter :code:`spoof_user_agent`, which is set to\n      :code:`True` by default. This parameter can be used to disable User-Agent\n      spoofing if necessary.\n\n    * Added IPython's pretty printing support for :any:`YaDiskObject` and\n      derived classes\n\n  * Bug fixes:\n\n    * :any:`Client.wait_for_operation()` now uses :code:`time.monotonic()`\n      instead of :code:`time.time()`\n\n  * Improvements:\n\n    * REST API error messages are now clearly divided into four parts (message,\n      description, error code and HTTP status code)\n\n* **Release 3.2.0 (2025-02-03)**\n\n  * New features:\n\n    * Added new method: :any:`Client.makedirs()` / :any:`AsyncClient.makedirs()`\n      (see `issue #53`_)\n    * Added several missing fields for :any:`DiskInfoObject`:\n\n      * :code:`photounlim_size`\n      * :code:`will_be_overdrawn`\n      * :code:`free_photounlim_end_date`\n      * :code:`payment_flow`\n\n    * Added missing field :code:`sizes` for :any:`ResourceObject` and related\n      objects\n\n  * Bug fixes:\n\n    * :any:`Client.rename()` / :any:`AsyncClient.rename()` now raises\n      :any:`ValueError` on attempt to rename the root directory\n    * Automatic retry attempt numbers were logged off by one, now they are\n      logged correctly\n\n* **Release 3.1.0 (2024-07-12)**\n\n  * New features:\n\n    * Added new exception classes: :any:`GoneError` and\n      :any:`ResourceDownloadLimitExceededError`\n    * Added a new method: :any:`Client.get_all_public_resources()` and\n      :any:`AsyncClient.get_all_public_resources()`\n\n  * Bug fixes:\n\n    * Fixed setting :code:`headers` and session arguments to :code:`None` causing\n      errors\n    * Fixed incorrect handling of empty filename in :any:`Client.rename()` and\n      :any:`AsyncClient.rename()`\n    * Fixed several typos in async convenience method implementations\n      (:code:`listdir()` and related)\n    * Fixed :any:`PublicResourceListObject` having the wrong type for its\n      :code:`items` member\n    * Fixed API requests not working with :any:`PycURLSession` when\n      :code:`stream=True` is set\n    * No data will be written to the output file by :any:`Client.download()`,\n      :any:`Client.download_by_link()`, :any:`AsyncClient.download()` and\n      :any:`AsyncClient.download_by_link()` if the server returns a bad status\n      code\n\n* **Release 3.0.1 (2024-07-09)**\n\n  * Fixed broken :code:`pyproject.toml` that did not include full package\n    contents (see `issue #49`_)\n\n* **Release 3.0.0 (2024-07-09)**\n\n  * Breaking changes:\n\n    - See :doc:`/migration_guide` for full details\n    - All methods wait for asynchronous operations to complete by default\n      (see the new :code:`wait=<bool>` parameter)\n    - Iterating over the result of :any:`AsyncClient.listdir()` no longer\n      requires the additional await keyword.\n    - Number of returned items of :any:`Client.get_files()` /\n      :any:`AsyncClient.get_files()` is now controlled by the :code:`max_items`\n      parameter, rather than :code:`limit`\n    - Methods :code:`set_token()`, :code:`set_headers()` of :any:`Session` and\n      :any:`AsyncSession` were removed\n    - Some methods no longer accept the :code:`fields` parameter\n    - :any:`Client.get_last_uploaded()` / :any:`AsyncClient.get_last_uploaded()`\n      now return a list instead of a generator\n    - :code:`yadisk.api` is now a private module\n    - All private modules were renamed to have names that start with :code:`_`\n      (e.g, :code:`yadisk._api`)\n  * New features:\n\n    - Added methods to wait until an asynchronous operation completes\n      (see :any:`Client.wait_for_operation()` / :any:`AsyncClient.wait_for_operation()`)\n    - Methods that may start an asynchronous operation now accept additional\n      parameters: :python:`wait: bool = True`,\n      :python:`poll_interval: float = 1.0` and\n      :python:`poll_timeout: Optional[float] = None`\n    - :any:`Client.listdir()`, :any:`Client.get_files()` and their async\n      variants now accept a new parameter\n      :python:`max_items: Optional[int] = None`, which can be used to limit\n      the maximum number of returned items\n    - Most :any:`Client` and :any:`AsyncClient` methods now accept an optional\n      parameter :python:`retry_on: Optional[Tuple[Type[Exception], ...]] = None`,\n      which lets you specify a tuple of additional exceptions that can trigger\n      an automatic retry\n    - :any:`yadisk.types` module is now public\n    - Added basic logging of outgoing API requests and automatic retries\n    - The logger instance for the library can be accessed as\n      :any:`yadisk.settings.logger`\n    - Added :any:`YaDiskObject.field()` and the :code:`@` operator\n      (:any:`YaDiskObject.__matmul__()`) which verify that the given field is\n      not :code:`None`\n    - Added :any:`Client.get_upload_link_object()`,\n      :any:`AsyncClient.get_upload_link_object()` whose return values\n      additionally contain :code:`operation_id`\n    - :any:`utils.auto_retry()` now accepts more parameters\n    - Added a few missing fields for :any:`DiskInfoObject`\n    - :any:`EXIFObject` now contains GPS coordinates\n    - :any:`CaseInsensitiveDict` is now part of :any:`yadisk.utils`\n  * Improvements:\n\n    - Added full type hints for :any:`Client`, :any:`AsyncClient` through\n      :code:`.pyi` stub files\n    - Docstrings for :any:`Client` / :any:`AsyncClient` now include more\n      parameters\n    - Errors during JSON processing (e.g. :any:`InvalidResponseError`) also\n      trigger automatic retries\n    - Error message when the default session module is not available is now\n      less confusing (see `issue #43`_)\n    - Reduced :any:`Client.listdir()`'s default :code:`limit` to :code:`500`\n      from :code:`10000` to avoid timeouts on large directories (see `issue #45`_)\n    - Reduced :any:`Client.get_files()`'s default :code:`limit` to :code:`200`\n      from :code:`1000` to avoid timeouts\n    - :any:`Client.download()` and similar methods no longer set\n      :code:`Connection: close` header, since it's not necessary (unlike with\n      :any:`Client.upload()`)\n    - :any:`UnknownYaDiskError` now includes status code in the error message\n  * Bug fixes:\n\n    - Fixed :code:`httpx`- and :code:`aiohttp`-based session implementations\n      not converting their exceptions to :any:`RequestError` in their\n      :any:`Response.json()` / :any:`AsyncResponse.json()` implementations\n    - Fixed :python:`stream=True` not being set by default in\n      :any:`AsyncClient.download()`, :any:`AsyncClient.download_public()`\n  * Other changes:\n\n    - :code:`typing_extensions` is now required for Python < 3.10\n\n* **Release 2.1.0 (2024-01-03)**\n\n  * Fixed a bug where POST request parameters were not encoded correctly\n  * Fixed a bug in :code:`PycURLSession.send_request()` that made it ignore passed headers\n  * :code:`RequestsSession.close()` now closes all underlying session\n    instances, instead of only the current thread-local one\n  * All methods of :any:`Client` and :any:`AsyncClient` now use existing session\n  * Removed :code:`session_factory` attribute and :code:`make_session()` method\n    of :any:`Client` and :any:`AsyncClient`\n  * Session class can now be specified as a string (see :any:`Client`/:any:`AsyncClient`)\n  * Added :any:`Client.get_device_code()`/:any:`AsyncClient.get_device_code()` methods\n  * Added :any:`Client.get_token_from_device_code()`/:any:`AsyncClient.get_token_from_device_code()` methods\n  * Added missing :code:`redirect_uri` parameter for :any:`Client.get_auth_url()`/:any:`AsyncClient.get_auth_url()`\n    and :any:`Client.get_code_url()`/:any:`AsyncClient.get_code_url()`\n  * Added support for PKCE parameters for :any:`Client.get_auth_url()`/:any:`AsyncClient.get_auth_url()`,\n    :any:`Client.get_code_url()`/:any:`AsyncClient.get_code_url()` and\n    :any:`Client.get_token()`/:any:`AsyncClient.get_token()`\n  * Added :code:`scope` attribute for :any:`TokenObject`\n  * Added new exception classes: :any:`InvalidClientError`, :any:`InvalidGrantError`,\n    :any:`AuthorizationPendingError`, :any:`BadVerificationCodeError` and\n    :any:`UnsupportedTokenTypeError`\n\n* **Release 2.0.0 (2023-12-12)**\n\n  * The library now provides both synchronous and asynchronous APIs (see\n    :doc:`/intro` and :doc:`/api_reference/index`)\n  * Multiple HTTP libraries are supported by default (see\n    :doc:`/api_reference/sessions` for the full list)\n  * It is now possible to add support for any HTTP library (see\n    :doc:`/api_reference/session_interface`)\n  * `requests`_ is now an optional dependency (although it's still used by\n    default for synchronous API)\n  * Note that now requests-specific arguments must be passed differently (see :doc:`/api_reference/sessions`)\n  * Preferred HTTP client libraries must be explicitly installed now (see :doc:`/intro`)\n  * :any:`Client.upload()` and :any:`Client.upload_by_link()` can now accept\n    a function that returns an iterator (or a generator) as a payload\n\n* **Release 1.3.4 (2023-10-15)**\n\n  * `upload()` and `download()` (and related) methods can now\n    upload/download non-seekable file-like objects (e.g. `stdin` or `stdout`\n    when open in binary mode), see `PR #31`_\n\n* **Release 1.3.3 (2023-04-22)**\n\n  * `app:/` paths now work correctly (see `issue #26`_)\n\n* **Release 1.3.2 (2023-03-20)**\n\n  * Fixed `issue #29`_: TypeError: 'type' object is not subscriptable\n\n* **Release 1.3.1 (2023-02-28)**\n\n  * Fixed `issue #28`_: calling `download_public()` with `path` keyword argument raises `TypeError`\n  * Fixed `AttributeError` raised when calling `ResourceLinkObject.public_listdir()`\n\n* **Release 1.3.0 (2023-01-30)**\n\n  * Added convenience methods to `...Object` objects (e.g. see `ResourceObject`)\n  * Added type hints\n  * Improved error checking and response validation\n  * Added `InvalidResponseError`, `PayloadTooLargeError`, `UploadTrafficLimitExceededError`\n  * Added a few missing fields to `DiskInfoObject` and `SystemFoldersObject`\n  * Added `rename()`, `upload_by_link()` and `download_by_link()` methods\n  * Added `default_args` field for `YaDisk` object\n  * `download()` and `upload()` now return `ResourceLinkObject`\n  * Returned `LinkObject` instances have been replaced by more specific subclasses\n  * :any:`ConnectionError` now also triggers a retry\n\n* **Release 1.2.19 (2023-01-20)**\n\n  * Fixed incorrect behavior of the fix from 1.2.18 for paths `disk:`\n    and `trash:` (only these two).\n\n* **Release 1.2.18 (2023-01-20)**\n\n  * Fixed `issue #26`_: ':' character in filenames causes `BadRequestError`.\n    This is due the behavior of Yandex.Disk's REST API itself but is avoided\n    on the library level with this fix.\n\n* **Release 1.2.17 (2022-12-11)**\n\n  * Fixed a minor bug which could cause a `ReferenceError`\n    (which would not cause a crash, but still show an error message). The bug\n    involved using `__del__()` method in `SelfDestructingSession`\n    to automatically close the sessions it seems to affect primarily old Python\n    versions (such as 3.4).\n\n* **Release 1.2.16 (2022-08-17)**\n\n  * Fixed a bug in `check_token()`: could throw `ForbiddenError` if\n    the application lacks necessary permissions (`issue #23`_).\n\n* **Release 1.2.15 (2021-12-31)**\n\n  * Fixed an issue where `http://` links were not recognized as operation links\n    (they were assumed to always be `https://`, since all the other\n    requests are always HTTPS).\n    Occasionally, Yandex.Disk can for some reason return an `http://` link\n    to an asynchronous operation instead of `https://`.\n    Both links are now recognized correctly and an `https://` version will\n    always be used by `get_operation_status()`, regardless of which one\n    Yandex.Disk returned.\n\n* **Release 1.2.14 (2019-03-26)**\n\n  * Fixed a `TypeError` in `get_public_*` functions when passing `path` parameter\n    (see `issue #7`_)\n  * Added `unlimited_autoupload_enabled` attribute for `DiskInfoObject`\n\n* **Release 1.2.13 (2019-02-23)**\n\n  * Added `md5` parameter for `remove()`\n  * Added `UserPublicInfoObject`\n  * Added `country` attribute for `UserObject`\n  * Added `photoslice_time` attribute for `ResourceObject`, `PublicResourceObject`\n    and `TrashResourceObject`\n\n* **Release 1.2.12 (2018-10-11)**\n\n  * Fixed `fields` parameter not working properly in `listdir()` (`issue #4`_)\n\n* **Release 1.2.11 (2018-06-30)**\n\n  * Added the missing parameter `sort` for `get_meta()`\n  * Added `file` and `antivirus_status` attributes for `ResourceObject`,\n    `PublicResourceObject` and `TrashResourceObject`\n  * Added `headers` parameter\n  * Fixed a typo in `download()` and `download_public()` (`issue #2`_)\n  * Removed `*args` parameter everywhere\n\n* **Release 1.2.10 (2018-06-14)**\n\n  * Fixed `timeout=None` behavior. `None` is supposed to mean 'no timeout' but\n    in the older versions it was synonymous with the default timeout.\n\n* **Release 1.2.9 (2018-04-28)**\n\n  * Changed the license to LGPLv3 (see `COPYING` and `COPYING.lesser`)\n  * Other package info updates\n\n* **Release 1.2.8 (2018-04-17)**\n\n  * Fixed a couple of typos: `PublicResourceListObject.items` and\n    `TrashResourceListObject.items` had wrong types\n  * Substitute field aliases in `fields` parameter when performing\n    API requests (e.g. `embedded` -> `_embedded`)\n\n* **Release 1.2.7 (2018-04-15)**\n\n  * Fixed a file rewinding bug when uploading/downloading files after a retry\n\n* **Release 1.2.6 (2018-04-13)**\n\n  * Now caching `requests` sessions so that open connections\n    can be reused (which can significantly speed things up sometimes)\n  * Disable `keep-alive` when uploading/downloading files by default\n\n* **Release 1.2.5 (2018-03-31)**\n\n  * Fixed an off-by-one bug in `utils.auto_retry()`\n    (which could sometimes result in `AttributeError`)\n  * Retry the whole request for `upload()`, `download()` and `download_public()`\n  * Set `stream=True` for `download()` and `download_public()`\n  * Other minor fixes\n\n* **Release 1.2.4 (2018-02-19)**\n\n  * Fixed `TokenObject` having `exprires_in` instead of `expires_in` (fixed a typo)\n\n* **Release 1.2.3 (2018-01-20)**\n\n  * Fixed a `TypeError` when `WrongResourceTypeError` is raised\n\n* **Release 1.2.2 (2018-01-19)**\n\n  * `refresh_token()` no longer requires a valid or empty token.\n\n* **Release 1.2.1 (2018-01-14)**\n\n  * Fixed auto retries not working. Whoops.\n\n* **Release 1.2.0 (2018-01-14)**\n\n  * Fixed passing `n_retries=0` to `upload()`,\n    `download()` and `download_public()`\n  * `upload()`, `download()` and `download_public()`\n    no longer return anything (see the docs)\n  * Added `utils` module (see the docs)\n  * Added `RetriableYaDiskError`, `WrongResourceTypeError`,\n    `BadGatewayError` and `GatewayTimeoutError`\n  * `listdir()` now raises `WrongResourceTypeError`\n    instead of `NotADirectoryError`\n\n* **Release 1.1.1 (2017-12-29)**\n\n  * Fixed argument handling in `upload()`, `download()` and `download_public()`.\n    Previously, passing `n_retries` and `retry_interval` would raise an exception (`TypeError`).\n\n* **Release 1.1.0 (2017-12-27)**\n\n  * Better exceptions (see the docs)\n  * Added support for `force_async` parameter\n  * Minor bug fixes\n\n* **Release 1.0.8 (2017-11-29)**\n\n  * Fixed yet another `listdir()` bug\n\n* **Release 1.0.7 (2017-11-04)**\n\n  * Added `install_requires` argument to `setup.py`\n\n* **Release 1.0.6 (2017-11-04)**\n\n  * Return `OperationLinkObject` in some functions\n\n* **Release 1.0.5 (2017-10-29)**\n\n  * Fixed `setup.py` to exclude tests\n\n* **Release 1.0.4 (2017-10-23)**\n\n  * Fixed bugs in `upload`, `download` and `listdir` functions\n  * Set default `listdir` `limit` to `10000`\n\n* **Release 1.0.3 (2017-10-22)**\n\n  * Added settings\n\n* **Release 1.0.2 (2017-10-19)**\n\n  * Fixed `get_code_url` function (added missing parameters)\n\n* **Release 1.0.1 (2017-10-18)**\n\n  * Fixed a major bug in `GetTokenRequest` (added missing parameter)\n\n* **Release 1.0.0 (2017-10-18)**\n\n  * Initial release\n"
  },
  {
    "path": "docs/conf.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n#\n# YaDisk documentation build configuration file, created by\n# sphinx-quickstart on Sun Oct  1 19:06:55 2017.\n#\n# This file is execfile()d with the current directory set to its\n# containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\nimport os\nimport sys\nsys.path.insert(0, os.path.abspath('..'))\n\n# -- General configuration ------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = ['sphinx.ext.autodoc',\n    'sphinx.ext.coverage',\n    'sphinx.ext.viewcode',\n    'sphinx.ext.intersphinx']\n\nintersphinx_mapping = {\"python\": (\"https://docs.python.org/3\", None),\n                       \"requests\": (\"https://requests.readthedocs.io/en/latest\", None),\n                       \"aiohttp\": (\"https://docs.aiohttp.org/en/stable\", None),\n                       \"pycurl\": (\"http://pycurl.io/docs/latest\", None)}\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n#\n# source_suffix = ['.rst', '.md']\nsource_suffix = '.rst'\n\n# The master toctree document.\nmaster_doc = 'index'\n\n# General information about the project.\nproject = 'YaDisk'\ncopyright = '2026, Ivan Konovalov'\nauthor = 'Ivan Konovalov'\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\nversion = '3.4.1'\n# The full version, including alpha/beta/rc tags.\nrelease = version\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = 'en'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This patterns also effect to html_static_path and html_extra_path\nexclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\n# If true, `todo` and `todoList` produce output, else they produce nothing.\ntodo_include_todos = False\n\n\n# -- Options for HTML output ----------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = 'sphinx_rtd_theme'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#\n# html_theme_options = {}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n\n# Custom sidebar templates, must be a dictionary that maps document names\n# to template names.\n#\n# This is required for the alabaster theme\n# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars\nhtml_sidebars = {\n    '**': [\n        'about.html',\n        'navigation.html',\n        'relations.html',  # needs 'show_related': True theme option to display\n        'searchbox.html',\n        'donate.html',\n    ]\n}\n\n\n# -- Options for HTMLHelp output ------------------------------------------\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'YaDiskdoc'\n\n\n# -- Options for LaTeX output ---------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    #\n    # 'papersize': 'letterpaper',\n\n    # The font size ('10pt', '11pt' or '12pt').\n    #\n    # 'pointsize': '10pt',\n\n    # Additional stuff for the LaTeX preamble.\n    #\n    # 'preamble': '',\n\n    # Latex figure (float) alignment\n    #\n    # 'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (master_doc, 'YaDisk.tex', 'YaDisk Documentation',\n     'Ivan Konovalov', 'manual'),\n]\n\n\n# -- Options for manual page output ---------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    (master_doc, 'yadisk', 'YaDisk Documentation',\n     [author], 1)\n]\n\n\n# -- Options for Texinfo output -------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (master_doc, 'YaDisk', 'YaDisk Documentation',\n     author, 'YaDisk', 'One line description of project.',\n     'Miscellaneous'),\n]\n\n\n\n"
  },
  {
    "path": "docs/index.rst",
    "content": ".. YaDisk documentation master file, created by\n   sphinx-quickstart on Sun Oct  1 19:06:55 2017.\n   You can adapt this file completely to your liking, but it should at least\n   contain the root `toctree` directive.\n\nWelcome to YaDisk's documentation!\n==================================\n\n.. toctree::\n   :maxdepth: 2\n   :caption: Contents:\n\n   intro\n   known_issues\n   migration_guide\n   api_reference/index\n   changelog\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n"
  },
  {
    "path": "docs/intro.rst",
    "content": "Introduction\n============\n\nYaDisk is a Yandex.Disk REST API client library.\n\nInstallation\n************\n\n:code:`yadisk` supports multiple HTTP client libraries and has both synchronous and\nasynchronous API.\n\nThe following HTTP client libraries are currently supported:\n\n* :code:`requests` (used by default for synchronous API)\n* :code:`httpx` (both synchronous and asynchronous, used by default for asynchronous API)\n* :code:`aiohttp` (asynchronous only)\n* :code:`pycurl` (synchronous only)\n\nFor synchronous API (installs :code:`requests`):\n\n.. code:: bash\n\n   pip install yadisk[sync-defaults]\n\nFor asynchronous API (installs :code:`aiofiles` and :code:`httpx`):\n\n.. code:: bash\n\n   pip install yadisk[async-defaults]\n\nAlternatively, you can manually choose which optional libraries to install:\n\n.. code:: bash\n\n   # For use with pycurl\n   pip install yadisk[pycurl]\n\n   # For use with aiohttp, will also install aiofiles\n   pip install yadisk[async-files,aiohttp]\n\nLinks to Official Yandex.Disk REST API Docs\n*******************************************\n\n| `Official Yandex.Disk REST API Docs <https://yandex.com/dev/disk/rest/>`__\n| `Polygon <https://yandex.com/dev/disk/poligon>`__\n\nExamples\n********\n\nSynchronous API\n---------------\n\n.. code:: python\n\n    import yadisk\n\n    client = yadisk.Client(token=\"<token>\")\n    # or\n    # client = yadisk.Client(\"<application-id>\", \"<application-secret>\", \"<token>\")\n\n    # You can either use the with statement or manually call client.close() later\n    with client:\n        # Check if the token is valid\n        print(client.check_token())\n\n        # Get disk information\n        print(client.get_disk_info())\n\n        # Print files and directories at \"/some/path\"\n        print(list(client.listdir(\"/some/path\")))\n\n        # Upload \"file_to_upload.txt\" to \"/destination.txt\"\n        client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # Same thing\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            client.upload(f, \"/destination.txt\")\n\n        # Download \"/some-file-to-download.txt\" to \"downloaded.txt\"\n        client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # Permanently remove \"/file-to-remove\"\n        client.remove(\"/file-to-remove\", permanently=True)\n\n        # Create a new directory at \"/test-dir\"\n        print(client.mkdir(\"/test-dir\"))\n\nReceiving token with confirmation code\n######################################\n\n.. code:: python\n\n    import sys\n    import yadisk\n\n    def main():\n        with yadisk.Client(\"application-id>\", \"<application-secret>\") as client:\n            url = client.get_code_url()\n\n            print(f\"Go to the following url: {url}\")\n            code = input(\"Enter the confirmation code: \")\n\n            try:\n                response = client.get_token(code)\n            except yadisk.exceptions.BadRequestError:\n                print(\"Bad code\")\n                return\n\n            client.token = response.access_token\n\n            if client.check_token():\n                print(\"Sucessfully received token!\")\n            else:\n                print(\"Something went wrong. Not sure how though...\")\n\n    main()\n\nRecursive upload\n################\n\n.. code:: python\n\n    import posixpath\n    import os\n    import yadisk\n\n    def recursive_upload(client: yadisk.Client, from_dir: str, to_dir: str):\n        for root, dirs, files in os.walk(from_dir):\n            p = root.split(from_dir)[1].strip(os.path.sep)\n            dir_path = posixpath.join(to_dir, p)\n\n            try:\n                client.mkdir(dir_path)\n            except yadisk.exceptions.PathExistsError:\n                pass\n\n            for file in files:\n                file_path = posixpath.join(dir_path, file)\n                p_sys = p.replace(\"/\", os.path.sep)\n                in_path = os.path.join(from_dir, p_sys, file)\n\n                try:\n                    client.upload(in_path, file_path)\n                except yadisk.exceptions.PathExistsError:\n                    pass\n\n    client = yadisk.Client(token=\"<application-token>\")\n    to_dir = \"/test\"\n    from_dir = \"/home/ubuntu\"\n    recursive_upload(client, from_dir, to_dir)\n\nSetting custom properties of files\n##################################\n\n.. code:: python\n\n    import yadisk\n\n    def main():\n        with yadisk.Client(token=\"<application-token>\") as client:\n            path = input(\"Enter a path to patch: \")\n            properties = {\"speed_of_light\":       299792458,\n                          \"speed_of_light_units\": \"meters per second\",\n                          \"message_for_owner\":    \"MWAHAHA! Your file has been patched by an evil script!\"}\n\n            meta = client.patch(path, properties)\n            print(\"\\nNew properties: \")\n\n            for k, v in meta.custom_properties.items():\n                print(f\"{k}: {repr(v)}\")\n\n            answer = input(\"\\nWant to get rid of them? (y/[n]) \")\n\n            if answer.lower() in (\"y\", \"yes\"):\n                properties = {k: None for k in properties}\n                client.patch(path, properties)\n                print(\"Everything's back as usual\")\n\n    main()\n\nEmptying the trash bin\n######################\n\n.. code:: python\n\n    import sys\n    import yadisk\n\n    def main():\n        answer = input(\"Are you sure about this? (y/[n]) \")\n        if answer.lower() not in (\"y\", \"yes\"):\n            print(\"Not going to do anything\")\n            return\n\n        with yadisk.Client(token=\"<application-token>\") as client:\n            print(\"Emptying the trash bin...\")\n            print(\"It might take a while...\")\n\n            client.remove_trash(\"/\")\n\n            print(\"Success!\")\n\n    main()\n\nSpecifying HTTP client library\n##############################\n\n.. code:: python\n\n   import yadisk\n\n   # Will use httpx for making requests\n   with yadisk.Client(token=\"<token>\", session=\"httpx\") as client:\n       print(client.check_token())\n\nAsynchronous API\n----------------\n\n.. code:: python\n\n    import yadisk\n    import aiofiles\n\n    client = yadisk.AsyncClient(token=\"<token>\")\n    # or\n    # client = yadisk.AsyncClient(\"<application-id>\", \"<application-secret>\", \"<token>\")\n\n    # You can either use the with statement or manually call client.close() later\n    async with client:\n        # Check if the token is valid\n        print(await client.check_token())\n\n        # Get disk information\n        print(await client.get_disk_info())\n\n        # Print files and directories at \"/some/path\"\n        print([i async for i in client.listdir(\"/some/path\")])\n\n        # Upload \"file_to_upload.txt\" to \"/destination.txt\"\n        await client.upload(\"file_to_upload.txt\", \"/destination.txt\")\n\n        # Same thing\n        async with aiofiles.open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # Same thing but with regular files\n        with open(\"file_to_upload.txt\", \"rb\") as f:\n            await client.upload(f, \"/destination.txt\")\n\n        # Download \"/some-file-to-download.txt\" to \"downloaded.txt\"\n        await client.download(\"/some-file-to-download.txt\", \"downloaded.txt\")\n\n        # Same thing\n        async with aiofiles.open(\"downloaded.txt\", \"wb\") as f:\n            await client.download(\"/some-file-to-download.txt\", f)\n\n        # Permanently remove \"/file-to-remove\"\n        await client.remove(\"/file-to-remove\", permanently=True)\n\n        # Create a new directory at \"/test-dir\"\n        print(await client.mkdir(\"/test-dir\"))\n\nReceiving token with confirmation code\n######################################\n\n.. code:: python\n\n    import asyncio\n    import sys\n    import yadisk\n\n    async def main():\n        async with yadisk.AsyncClient(\"application-id>\", \"<application-secret>\") as client:\n            url = client.get_code_url()\n\n            print(f\"Go to the following url: {url}\")\n            code = input(\"Enter the confirmation code: \")\n\n            try:\n                response = await client.get_token(code)\n            except yadisk.exceptions.BadRequestError:\n                print(\"Bad code\")\n                return\n\n            client.token = response.access_token\n\n            if await client.check_token():\n                print(\"Sucessfully received token!\")\n            else:\n                print(\"Something went wrong. Not sure how though...\")\n\n    asyncio.run(main())\n\nRecursive upload\n################\n\n.. code:: python\n\n    import asyncio\n    import posixpath\n    import os\n    import yadisk\n\n    async def recursive_upload(from_dir: str, to_dir: str, n_parallel_requests: int = 5):\n        async with yadisk.AsyncClient(token=\"<application-token>\") as client:\n            async def upload_files(queue):\n                while queue:\n                    in_path, out_path = queue.pop(0)\n\n                    print(f\"Uploading {in_path} -> {out_path}\")\n\n                    try:\n                        await client.upload(in_path, out_path)\n                    except yadisk.exceptions.PathExistsError:\n                        print(f\"{out_path} already exists\")\n\n            async def create_dirs(queue):\n                while queue:\n                    path = queue.pop(0)\n\n                    print(f\"Creating directory {path}\")\n\n                    try:\n                        await client.mkdir(path)\n                    except yadisk.exceptions.PathExistsError:\n                        print(f\"{path} already exists\")\n\n            mkdir_queue = []\n            upload_queue = []\n\n            print(f\"Creating directory {to_dir}\")\n\n            try:\n                await client.mkdir(to_dir)\n            except yadisk.exceptions.PathExistsError:\n                print(f\"{to_dir} already exists\")\n\n            for root, dirs, files in os.walk(from_dir):\n                rel_dir_path = root.split(from_dir)[1].strip(os.path.sep)\n                rel_dir_path = rel_dir_path.replace(os.path.sep, \"/\")\n                dir_path = posixpath.join(to_dir, rel_dir_path)\n\n                for dirname in dirs:\n                    mkdir_queue.append(posixpath.join(dir_path, dirname))\n\n                for filename in files:\n                    out_path = posixpath.join(dir_path, filename)\n                    rel_dir_path_sys = rel_dir_path.replace(\"/\", os.path.sep)\n                    in_path = os.path.join(from_dir, rel_dir_path_sys, filename)\n\n                    upload_queue.append((in_path, out_path))\n\n                tasks = [upload_files(upload_queue) for i in range(n_parallel_requests)]\n                tasks.extend(create_dirs(mkdir_queue) for i in range(n_parallel_requests))\n\n                await asyncio.gather(*tasks)\n\n    from_dir = input(\"Directory to upload: \")\n    to_dir = input(\"Destination directory: \")\n\n    asyncio.run(recursive_upload(from_dir, to_dir, 5))\n\nSetting custom properties of files\n##################################\n\n.. code:: python\n\n    import asyncio\n    import yadisk\n\n    async def main():\n        async with yadisk.AsyncClient(token=\"<application-token>\") as client:\n            path = input(\"Enter a path to patch: \")\n            properties = {\"speed_of_light\":       299792458,\n                          \"speed_of_light_units\": \"meters per second\",\n                          \"message_for_owner\":    \"MWAHAHA! Your file has been patched by an evil script!\"}\n\n            meta = await client.patch(path, properties)\n            print(\"\\nNew properties: \")\n\n            for k, v in meta.custom_properties.items():\n                print(f\"{k}: {repr(v)}\")\n\n            answer = input(\"\\nWant to get rid of them? (y/[n]) \")\n\n            if answer.lower() in (\"y\", \"yes\"):\n                properties = {k: None for k in properties}\n                await client.patch(path, properties)\n                print(\"Everything's back as usual\")\n\n    asyncio.run(main())\n\nEmptying the trash bin\n######################\n\n.. code:: python\n\n    import asyncio\n    import sys\n    import yadisk\n\n    async def main():\n        answer = input(\"Are you sure about this? (y/[n]) \")\n\n        if answer not in (\"y\", \"yes\"):\n            print(\"Not going to do anything\")\n            return\n\n        async with yadisk.AsyncClient(token=\"<application-token>\") as client:\n            print(\"Emptying the trash bin...\")\n            print(\"It might take a while...\")\n\n            await client.remove_trash(\"/\")\n            print(\"Success!\")\n\n    asyncio.run(main())\n\nSpecifying HTTP client library\n##############################\n\n.. code:: python\n\n   import yadisk\n\n   # Will use aiohttp for making requests\n   async with yadisk.AsyncClient(token=\"<token>\", session=\"aiohttp\") as client:\n       print(await client.check_token())\n"
  },
  {
    "path": "docs/known_issues.rst",
    "content": "Known Issues\n============\n\nVery Slow Upload of Certain Types of Files\n##########################################\n\nYandex.Disk's REST API limits upload speeds up to 128 KiB/s for certain MIME types of files.\nMore specifically, throttling takes place based on value of :code:`media_type`\n(see :any:`yadisk.Client.get_meta`).\nIt appears there are 3 types of media types that are throttled:\n\n1) :code:`data` (.db, .dat, etc.)\n2) :code:`compressed` (.zip, .gz, .tgz, .rar, .etc)\n3) :code:`video` (.3gp, .mp4, .avi, etc.)\n\nThis behavior of throttling is predetermined at the moment of requesting an\nupload link (with :any:`yadisk.Client.get_upload_link`). The content of the\nuploaded file does not matter.\n\nThe reason why this problem cannot be observed when uploading through the\nofficial website, is that this throttling does not apply to internal services\n(the Yandex.Disk website uses an intermediate internal API to obtain upload links).\n\nWhile it is not clear what the purpose of this throttling is, it is certain at\nthis point that this is not a bug.\n\nOne workaround is to upload files with changed filename extensions (or without them entirely).\nFor example, if you want to upload a file named :code:`\"my_database.db\"`, you can initially\nupload it under the name :code:`\"my_database.some_other_extension\"` and then rename it back\nto :code:`\"my_database.db\"`.\n\nAnother workaround is to spoof user agent (see `PR#57 <https://github.com/ivknv/yadisk/pull/57>`_).\nStarting with version :code:`3.3.0`, the user agent is spoofed by default (see\n:any:`yadisk.Client.get_upload_link()`'s :code:`spoof_user_agent` parameter).\n\nLow Upload Speed on Windows When Using requests\n###############################################\n\n.. _requests: https://pypi.org/project/requests\n.. _httpx: https://pypi.org/project/httpx\n\nIf you use `requests`_ and experience low upload speeds on Windows, the reason\nmight be due to Python's standard library internally using :code:`select()` to\nwait for sockets. The best way around it is to use a different HTTP library\n(e.g. `httpx`_, see :doc:`/api_reference/sessions`)\n"
  },
  {
    "path": "docs/locales/ru/LC_MESSAGES/api_reference.po",
    "content": "# api_reference/*.rst translations.\n# Copyright (C) 2025, Ivan Konovalov\n# This file is distributed under the same license as the YaDisk package.\n# Ivan Konovalov <ivknv0@gmail.com>, 2025.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: YaDisk 3.4.0\\n\"\n\"Report-Msgid-Bugs-To: ivknv0@gmail.com\\n\"\n\"POT-Creation-Date: 2025-07-10 18:15+0500\\n\"\n\"PO-Revision-Date: 2025-07-10 18:19+0500\\n\"\n\"Last-Translator: Ivan Konovalov <ivknv0@gmail.com>\\n\"\n\"Language-Team: Russian\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../api_reference/async_api.rst:2\nmsgid \"Asynchronous API\"\nmsgstr \"Асинхронный API\"\n\n#: of yadisk._async_client.AsyncClient:1\nmsgid \"Implements access to Yandex.Disk REST API (provides asynchronous API).\"\nmsgstr \"Реализует доступ к REST API Яндекс.Диска (реализует асинхронный API).\"\n\n#: of yadisk._async_client.AsyncClient:3\nmsgid \"\"\n\"HTTP client implementation can be specified using the :code:`session` \"\n\"parameter. :any:`AsyncHTTPXSession` is used by default. For other \"\n\"options, see :doc:`/api_reference/sessions`.\"\nmsgstr \"\"\n\"Реализация HTTP-клиента может быть указана с помощью параметра \"\n\":code:`session`. По умолчанию используется :any:`AsyncHTTPXSession`. см. \"\n\":doc:`/api_reference/sessions` для других списка других доступных \"\n\"вариантов.\"\n\n#: of yadisk._async_client.AsyncClient:7\nmsgid \"\"\n\"Almost all methods of :any:`AsyncClient` (the ones that accept \"\n\"`**kwargs`) accept some additional arguments:\"\nmsgstr \"\"\n\"Почти все методы :any:`AsyncClient` (те, которые принимают `**kwargs`) \"\n\"принимают некоторые дополнительные параметры:\"\n\n#: of yadisk._async_client.AsyncClient:10 yadisk._client.Client:10\nmsgid \"**n_retries** - `int`, maximum number of retries for a request\"\nmsgstr \"**n_retries** - `int`, максимальное число повторных попыток запроса\"\n\n#: of yadisk._async_client.AsyncClient:11 yadisk._client.Client:11\nmsgid \"**retry_interval** - `float`, delay between retries (in seconds)\"\nmsgstr \"\"\n\"**retry_interval** - `float`, задержка между повторными попытками (в \"\n\"секундах)\"\n\n#: of yadisk._async_client.AsyncClient:12 yadisk._client.Client:12\nmsgid \"**headers** - `dict` or `None`, additional request headers\"\nmsgstr \"**headers** - `dict` или `None`, дополнительные заголовки запроса\"\n\n#: of yadisk._async_client.AsyncClient:13 yadisk._client.Client:13\nmsgid \"\"\n\"**timeout** - `tuple` (:code:`(<connect timeout>, <read timeout>)`) or \"\n\"`float` (specifies both connect and read timeout), request timeout (in \"\n\"seconds)\"\nmsgstr \"\"\n\"**timeout** - `tuple` (:code:`(<connect timeout>, <read timeout>)`) или \"\n\"`float` (указывает одновременно и connect и read timeout), таймаут \"\n\"запроса в секундах\"\n\n#: of yadisk._async_client.AsyncClient:17\nmsgid \"\"\n\"Additional parameters, specific to a given HTTP client library can also \"\n\"be passed, see documentation for specific :any:`AsyncSession` subclasses \"\n\"(:doc:`/api_reference/sessions`).\"\nmsgstr \"\"\n\"Дополнительные параметры, относящиеся к конкретной HTTP библиотеке могут \"\n\"также быть переданы, см. документацию для конкретных подклассов \"\n\":any:`AsyncSession` (:doc:`/api_reference/sessions`).\"\n\n#: of yadisk._async_client.AsyncClient:22\nmsgid \"\"\n\"Do not forget to call :any:`AsyncClient.close` or use the `async with` \"\n\"statement to close all the connections. Otherwise, you may get a warning.\"\nmsgstr \"\"\n\"Не забывайте вызывать :any:`AsyncClient.close` или используйте `async \"\n\"with`, чтобы закрыть все соединения. Иначе, вы можете получить \"\n\"предупреждение.\"\n\n#: of yadisk._async_client.AsyncClient:25\nmsgid \"\"\n\"In :any:`Client` this is handled in the destructor, but since \"\n\":any:`AsyncClient.close` is a coroutine function the same cannot be done \"\n\"here, so you have to do it explicitly.\"\nmsgstr \"\"\n\"В :any:`Client` это делалается в деструкторе, но т.к. \"\n\":any:`AsyncClient.close` - корутина, здесь этого сделать нельзя, поэтому \"\n\"приходится делать это явно.\"\n\n#: of yadisk._async_client.AsyncClient\n#: yadisk._async_client.AsyncClient.check_token\n#: yadisk._async_client.AsyncClient.copy\n#: yadisk._async_client.AsyncClient.download\n#: yadisk._async_client.AsyncClient.download_by_link\n#: yadisk._async_client.AsyncClient.download_public\n#: yadisk._async_client.AsyncClient.exists\n#: yadisk._async_client.AsyncClient.get_all_public_resources\n#: yadisk._async_client.AsyncClient.get_auth_url\n#: yadisk._async_client.AsyncClient.get_code_url\n#: yadisk._async_client.AsyncClient.get_device_code\n#: yadisk._async_client.AsyncClient.get_disk_info\n#: yadisk._async_client.AsyncClient.get_download_link\n#: yadisk._async_client.AsyncClient.get_files\n#: yadisk._async_client.AsyncClient.get_last_uploaded\n#: yadisk._async_client.AsyncClient.get_meta\n#: yadisk._async_client.AsyncClient.get_operation_status\n#: yadisk._async_client.AsyncClient.get_public_available_settings\n#: yadisk._async_client.AsyncClient.get_public_download_link\n#: yadisk._async_client.AsyncClient.get_public_meta\n#: yadisk._async_client.AsyncClient.get_public_resources\n#: yadisk._async_client.AsyncClient.get_public_settings\n#: yadisk._async_client.AsyncClient.get_public_type\n#: yadisk._async_client.AsyncClient.get_token\n#: yadisk._async_client.AsyncClient.get_token_from_device_code\n#: yadisk._async_client.AsyncClient.get_trash_meta\n#: yadisk._async_client.AsyncClient.get_trash_type\n#: yadisk._async_client.AsyncClient.get_type\n#: yadisk._async_client.AsyncClient.get_upload_link\n#: yadisk._async_client.AsyncClient.get_upload_link_object\n#: yadisk._async_client.AsyncClient.is_dir\n#: yadisk._async_client.AsyncClient.is_file\n#: yadisk._async_client.AsyncClient.is_public_dir\n#: yadisk._async_client.AsyncClient.is_public_file\n#: yadisk._async_client.AsyncClient.is_trash_dir\n#: yadisk._async_client.AsyncClient.is_trash_file\n#: yadisk._async_client.AsyncClient.listdir\n#: yadisk._async_client.AsyncClient.makedirs\n#: yadisk._async_client.AsyncClient.mkdir yadisk._async_client.AsyncClient.move\n#: yadisk._async_client.AsyncClient.patch\n#: yadisk._async_client.AsyncClient.public_exists\n#: yadisk._async_client.AsyncClient.publish\n#: yadisk._async_client.AsyncClient.refresh_token\n#: yadisk._async_client.AsyncClient.remove\n#: yadisk._async_client.AsyncClient.remove_trash\n#: yadisk._async_client.AsyncClient.rename\n#: yadisk._async_client.AsyncClient.restore_trash\n#: yadisk._async_client.AsyncClient.revoke_token\n#: yadisk._async_client.AsyncClient.save_to_disk\n#: yadisk._async_client.AsyncClient.trash_exists\n#: yadisk._async_client.AsyncClient.trash_listdir\n#: yadisk._async_client.AsyncClient.unpublish\n#: yadisk._async_client.AsyncClient.update_public_settings\n#: yadisk._async_client.AsyncClient.upload\n#: yadisk._async_client.AsyncClient.upload_by_link\n#: yadisk._async_client.AsyncClient.upload_url\n#: yadisk._async_client.AsyncClient.wait_for_operation\n#: yadisk._async_session.AsyncResponse.download\n#: yadisk._async_session.AsyncSession.send_request yadisk._client.Client\n#: yadisk._client.Client.check_token yadisk._client.Client.copy\n#: yadisk._client.Client.download yadisk._client.Client.download_by_link\n#: yadisk._client.Client.download_public yadisk._client.Client.exists\n#: yadisk._client.Client.get_all_public_resources\n#: yadisk._client.Client.get_auth_url yadisk._client.Client.get_code_url\n#: yadisk._client.Client.get_device_code yadisk._client.Client.get_disk_info\n#: yadisk._client.Client.get_download_link yadisk._client.Client.get_files\n#: yadisk._client.Client.get_last_uploaded yadisk._client.Client.get_meta\n#: yadisk._client.Client.get_operation_status\n#: yadisk._client.Client.get_public_available_settings\n#: yadisk._client.Client.get_public_download_link\n#: yadisk._client.Client.get_public_meta\n#: yadisk._client.Client.get_public_resources\n#: yadisk._client.Client.get_public_settings\n#: yadisk._client.Client.get_public_type yadisk._client.Client.get_token\n#: yadisk._client.Client.get_token_from_device_code\n#: yadisk._client.Client.get_trash_meta yadisk._client.Client.get_trash_type\n#: yadisk._client.Client.get_type yadisk._client.Client.get_upload_link\n#: yadisk._client.Client.get_upload_link_object yadisk._client.Client.is_dir\n#: yadisk._client.Client.is_file yadisk._client.Client.is_public_dir\n#: yadisk._client.Client.is_public_file yadisk._client.Client.is_trash_dir\n#: yadisk._client.Client.is_trash_file yadisk._client.Client.listdir\n#: yadisk._client.Client.makedirs yadisk._client.Client.mkdir\n#: yadisk._client.Client.move yadisk._client.Client.patch\n#: yadisk._client.Client.public_exists yadisk._client.Client.publish\n#: yadisk._client.Client.refresh_token yadisk._client.Client.remove\n#: yadisk._client.Client.remove_trash yadisk._client.Client.rename\n#: yadisk._client.Client.restore_trash yadisk._client.Client.revoke_token\n#: yadisk._client.Client.save_to_disk yadisk._client.Client.trash_exists\n#: yadisk._client.Client.trash_listdir yadisk._client.Client.unpublish\n#: yadisk._client.Client.update_public_settings yadisk._client.Client.upload\n#: yadisk._client.Client.upload_by_link yadisk._client.Client.upload_url\n#: yadisk._client.Client.wait_for_operation\n#: yadisk._import_session.import_async_session\n#: yadisk._import_session.import_session yadisk._session.Response.download\n#: yadisk._session.Session.send_request yadisk.exceptions.YaDiskError\n#: yadisk.objects._auth.DeviceCodeObject yadisk.objects._auth.TokenObject\n#: yadisk.objects._auth.TokenRevokeStatusObject\n#: yadisk.objects._disk.DiskInfoObject yadisk.objects._disk.SystemFoldersObject\n#: yadisk.objects._disk.UserObject yadisk.objects._disk.UserPublicInfoObject\n#: yadisk.objects._error_object.ErrorObject\n#: yadisk.objects._link_object.LinkObject\n#: yadisk.objects._operations.AsyncOperationLinkObject\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait\n#: yadisk.objects._operations.OperationLinkObject\n#: yadisk.objects._operations.OperationStatusObject\n#: yadisk.objects._operations.SyncOperationLinkObject\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status\n#: yadisk.objects._operations.SyncOperationLinkObject.wait\n#: yadisk.objects._resources.AsyncFilesResourceListObject\n#: yadisk.objects._resources.AsyncLastUploadedResourceListObject\n#: yadisk.objects._resources.AsyncPublicResourceLinkObject\n#: yadisk.objects._resources.AsyncPublicResourceListObject\n#: yadisk.objects._resources.AsyncPublicResourceObject\n#: yadisk.objects._resources.AsyncPublicResourcesListObject\n#: yadisk.objects._resources.AsyncResourceLinkObject\n#: yadisk.objects._resources.AsyncResourceListObject\n#: yadisk.objects._resources.AsyncResourceObject\n#: yadisk.objects._resources.AsyncTrashResourceListObject\n#: yadisk.objects._resources.AsyncTrashResourceObject\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore\n#: yadisk.objects._resources.CommentIDsObject\n#: yadisk.objects._resources.EXIFObject\n#: yadisk.objects._resources.FilesResourceListObject\n#: yadisk.objects._resources.LastUploadedResourceListObject\n#: yadisk.objects._resources.PublicResourceLinkObject\n#: yadisk.objects._resources.PublicResourceListObject\n#: yadisk.objects._resources.PublicResourceObject\n#: yadisk.objects._resources.PublicResourcesListObject\n#: yadisk.objects._resources.ResourceDownloadLinkObject\n#: yadisk.objects._resources.ResourceLinkObject\n#: yadisk.objects._resources.ResourceListObject\n#: yadisk.objects._resources.ResourceObject\n#: yadisk.objects._resources.ResourceUploadLinkObject\n#: yadisk.objects._resources.ShareInfoObject\n#: yadisk.objects._resources.SyncFilesResourceListObject\n#: yadisk.objects._resources.SyncLastUploadedResourceListObject\n#: yadisk.objects._resources.SyncPublicResourceLinkObject\n#: yadisk.objects._resources.SyncPublicResourceListObject\n#: yadisk.objects._resources.SyncPublicResourceObject\n#: yadisk.objects._resources.SyncPublicResourcesListObject\n#: yadisk.objects._resources.SyncResourceLinkObject\n#: yadisk.objects._resources.SyncResourceListObject\n#: yadisk.objects._resources.SyncResourceObject\n#: yadisk.objects._resources.SyncTrashResourceListObject\n#: yadisk.objects._resources.SyncTrashResourceObject\n#: yadisk.objects._resources.SyncTrashResourceObject.exists\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir\n#: yadisk.objects._resources.SyncTrashResourceObject.remove\n#: yadisk.objects._resources.SyncTrashResourceObject.restore\n#: yadisk.objects._resources.TrashResourceListObject\n#: yadisk.objects._resources.TrashResourceObject\n#: yadisk.objects._yadisk_object.YaDiskObject\n#: yadisk.objects._yadisk_object.YaDiskObject.__matmul__\n#: yadisk.objects._yadisk_object.YaDiskObject.field\n#: yadisk.objects._yadisk_object.YaDiskObject.import_fields\n#: yadisk.objects._yadisk_object.YaDiskObject.remove_alias\n#: yadisk.objects._yadisk_object.YaDiskObject.remove_field\n#: yadisk.objects._yadisk_object.YaDiskObject.set_alias\n#: yadisk.objects._yadisk_object.YaDiskObject.set_field_type\n#: yadisk.objects._yadisk_object.YaDiskObject.set_field_types\n#: yadisk.types.AsyncFileLike.read yadisk.types.AsyncFileLike.seek\n#: yadisk.types.AsyncFileLike.write yadisk.types.BinaryAsyncFileLike.read\n#: yadisk.types.BinaryAsyncFileLike.seek yadisk.types.BinaryAsyncFileLike.write\n#: yadisk.utils.async_auto_retry yadisk.utils.auto_retry\n#: yadisk.utils.get_exception\nmsgid \"Parameters\"\nmsgstr \"Параметры\"\n\n#: of yadisk._async_client.AsyncClient:29 yadisk._client.Client:21\nmsgid \"application ID\"\nmsgstr \"идентификатор приложения\"\n\n#: of yadisk._async_client.AsyncClient:30 yadisk._client.Client:22\nmsgid \"application secret password\"\nmsgstr \"пароль приложения\"\n\n#: of yadisk._async_client.AsyncClient:31 yadisk._client.Client:23\nmsgid \"application token\"\nmsgstr \"токен\"\n\n#: of yadisk._async_client.AsyncClient:32 yadisk._client.Client:24\nmsgid \"\"\n\"`dict` or `None`, default arguments for methods. Can be used to set the \"\n\"default timeout, headers, etc.\"\nmsgstr \"\"\n\"`dict` или `None`, аргументы по умолчанию для методов. Можно \"\n\"использовать, чтобы задать стандартный таймаут, заголовки и т.д.\"\n\n#: of yadisk._async_client.AsyncClient:34\nmsgid \"\"\n\"`None`, `str` or an instance of :any:`AsyncSession`. If :code:`session` \"\n\"is a string, the appropriate session class will be imported, it must be \"\n\"one of the following values:    * :code:`\\\"aiohttp\\\"` - \"\n\":any:`AIOHTTPSession`   * :code:`\\\"httpx\\\"` - :any:`AsyncHTTPXSession`\"\nmsgstr \"\"\n\"`None`, `str` или объект :any:`AsyncSession`. Если :code:`session` - \"\n\"строка, то нужный класс будет автоматически импортирован, допустимые \"\n\"значения:    * :code:`\\\"aiohttp\\\"` - :any:`AIOHTTPSession`   * \"\n\":code:`\\\"httpx\\\"` - :any:`AsyncHTTPXSession`\"\n\n#: of yadisk._async_client.AsyncClient:34\nmsgid \"\"\n\"`None`, `str` or an instance of :any:`AsyncSession`. If :code:`session` \"\n\"is a string, the appropriate session class will be imported, it must be \"\n\"one of the following values:\"\nmsgstr \"\"\n\"`None`, `str` или объект :any:`AsyncSession`. Если :code:`session` - \"\n\"строка, то нужный класс будет автоматически импортирован, допустимые \"\n\"значения:\"\n\n#: of yadisk._async_client.AsyncClient:39\n#: yadisk._import_session.import_async_session:7\nmsgid \":code:`\\\"aiohttp\\\"` - :any:`AIOHTTPSession`\"\nmsgstr \":code:`\\\"aiohttp\\\"` - :any:`AIOHTTPSession`\"\n\n#: of yadisk._async_client.AsyncClient:40\n#: yadisk._import_session.import_async_session:8\nmsgid \":code:`\\\"httpx\\\"` - :any:`AsyncHTTPXSession`\"\nmsgstr \":code:`\\\"httpx\\\"` - :any:`AsyncHTTPXSession`\"\n\n#: of yadisk._async_client.AsyncClient:42\nmsgid \"\"\n\"`None` or an async function that opens a file for reading or writing \"\n\"(:code:`aiofiles.open()` by default)\"\nmsgstr \"\"\n\"`None` или асинхронная функция, которая открывает файл для чтения или \"\n\"записи (:code:`aiofiles.open()` по умолчанию)\"\n\n#: of yadisk._async_client.AsyncClient:44\nmsgid \"\"\n\"kept for compatibility, callable that returns an instance of \"\n\":any:`AsyncSession`\"\nmsgstr \"\"\n\"оставлен для совместимости, функция, возвращающая объект \"\n\":any:`AsyncSession`\"\n\n#: of yadisk._async_client.AsyncClient yadisk._async_session.AsyncResponse\n#: yadisk._client.Client yadisk._session.Response yadisk.exceptions.YaDiskError\n#: yadisk.objects._auth.DeviceCodeObject yadisk.objects._auth.TokenObject\n#: yadisk.objects._auth.TokenRevokeStatusObject\n#: yadisk.objects._disk.DiskInfoObject yadisk.objects._disk.SystemFoldersObject\n#: yadisk.objects._disk.UserObject yadisk.objects._disk.UserPublicInfoObject\n#: yadisk.objects._error_object.ErrorObject\n#: yadisk.objects._link_object.LinkObject\n#: yadisk.objects._operations.AsyncOperationLinkObject\n#: yadisk.objects._operations.OperationLinkObject\n#: yadisk.objects._operations.OperationStatusObject\n#: yadisk.objects._operations.SyncOperationLinkObject\n#: yadisk.objects._resources.AsyncFilesResourceListObject\n#: yadisk.objects._resources.AsyncLastUploadedResourceListObject\n#: yadisk.objects._resources.AsyncPublicResourceLinkObject\n#: yadisk.objects._resources.AsyncPublicResourceListObject\n#: yadisk.objects._resources.AsyncPublicResourceObject\n#: yadisk.objects._resources.AsyncPublicResourcesListObject\n#: yadisk.objects._resources.AsyncResourceLinkObject\n#: yadisk.objects._resources.AsyncResourceListObject\n#: yadisk.objects._resources.AsyncResourceObject\n#: yadisk.objects._resources.AsyncTrashResourceListObject\n#: yadisk.objects._resources.AsyncTrashResourceObject\n#: yadisk.objects._resources.AvailableUntilVerboseObject\n#: yadisk.objects._resources.CommentIDsObject\n#: yadisk.objects._resources.EXIFObject\n#: yadisk.objects._resources.ExternalOrganizationIdVerboseObject\n#: yadisk.objects._resources.FilesResourceListObject\n#: yadisk.objects._resources.LastUploadedResourceListObject\n#: yadisk.objects._resources.PasswordVerboseObject\n#: yadisk.objects._resources.PublicAccessObject\n#: yadisk.objects._resources.PublicAvailableSettingsObject\n#: yadisk.objects._resources.PublicDefaultObject\n#: yadisk.objects._resources.PublicResourceLinkObject\n#: yadisk.objects._resources.PublicResourceListObject\n#: yadisk.objects._resources.PublicResourceObject\n#: yadisk.objects._resources.PublicResourcesListObject\n#: yadisk.objects._resources.PublicSettingsObject\n#: yadisk.objects._resources.ResourceDownloadLinkObject\n#: yadisk.objects._resources.ResourceLinkObject\n#: yadisk.objects._resources.ResourceListObject\n#: yadisk.objects._resources.ResourceObject\n#: yadisk.objects._resources.ResourceUploadLinkObject\n#: yadisk.objects._resources.ShareInfoObject\n#: yadisk.objects._resources.SyncFilesResourceListObject\n#: yadisk.objects._resources.SyncLastUploadedResourceListObject\n#: yadisk.objects._resources.SyncPublicResourceLinkObject\n#: yadisk.objects._resources.SyncPublicResourceListObject\n#: yadisk.objects._resources.SyncPublicResourceObject\n#: yadisk.objects._resources.SyncPublicResourcesListObject\n#: yadisk.objects._resources.SyncResourceLinkObject\n#: yadisk.objects._resources.SyncResourceListObject\n#: yadisk.objects._resources.SyncResourceObject\n#: yadisk.objects._resources.SyncTrashResourceListObject\n#: yadisk.objects._resources.SyncTrashResourceObject\n#: yadisk.objects._resources.TrashResourceListObject\n#: yadisk.objects._resources.TrashResourceObject\n#: yadisk.sessions.aiohttp_session.AIOHTTPSession\n#: yadisk.sessions.async_httpx_session.AsyncHTTPXSession\n#: yadisk.sessions.httpx_session.HTTPXSession\n#: yadisk.sessions.requests_session.RequestsSession\n#: yadisk.types.AvailableUntilVerbose\n#: yadisk.types.ExternalOrganizationIdVerbose yadisk.types.PasswordVerbose\n#: yadisk.types.PublicSettings yadisk.types.PublicSettingsAccess\nmsgid \"Variables\"\nmsgstr \"Атрибуты\"\n\n#: of yadisk._async_client.AsyncClient:47 yadisk._client.Client:40\nmsgid \"`str`, application ID\"\nmsgstr \"`str`, идентификатор приложения\"\n\n#: of yadisk._async_client.AsyncClient:48 yadisk._client.Client:41\nmsgid \"`str`, application secret password\"\nmsgstr \"`str`, пароль приложения\"\n\n#: of yadisk._async_client.AsyncClient:49 yadisk._client.Client:42\nmsgid \"`str`, application token\"\nmsgstr \"`str`, токен\"\n\n#: of yadisk._async_client.AsyncClient:50 yadisk._client.Client:43\nmsgid \"\"\n\"`dict`, default arguments for methods. Can be used to set the default \"\n\"timeout, headers, etc.\"\nmsgstr \"\"\n\"`dict`, аргументы по умолчанию для методов. Можно использовать, чтобы \"\n\"задать стандартный таймаут, заголовки и т.д.\"\n\n#: of yadisk._async_client.AsyncClient:52\nmsgid \"current session (:any:`AsyncSession` instance)\"\nmsgstr \"текущая сессия (объект :any:`AsyncSession`)\"\n\n#: of yadisk._async_client.AsyncClient:53\nmsgid \"\"\n\"async function that opens a file for reading or writing \"\n\"(:code:`aiofiles.open()` by default)\"\nmsgstr \"\"\n\"асинхронная функция, которая открывает файл для чтения или записи \"\n\"(:code:`aiofiles.open()` по умолчанию)\"\n\n#: of yadisk._async_client.AsyncClient:56 yadisk._client.Client:49\nmsgid \"The following exceptions may be raised by most API requests:\"\nmsgstr \"Большинство запросов к API могут вызвать следующие исключения:\"\n\n#: of yadisk._async_client.AsyncClient yadisk._async_client.AsyncClient.copy\n#: yadisk._async_client.AsyncClient.download\n#: yadisk._async_client.AsyncClient.download_public\n#: yadisk._async_client.AsyncClient.exists\n#: yadisk._async_client.AsyncClient.get_all_public_resources\n#: yadisk._async_client.AsyncClient.get_auth_url\n#: yadisk._async_client.AsyncClient.get_code_url\n#: yadisk._async_client.AsyncClient.get_device_code\n#: yadisk._async_client.AsyncClient.get_disk_info\n#: yadisk._async_client.AsyncClient.get_download_link\n#: yadisk._async_client.AsyncClient.get_files\n#: yadisk._async_client.AsyncClient.get_last_uploaded\n#: yadisk._async_client.AsyncClient.get_meta\n#: yadisk._async_client.AsyncClient.get_operation_status\n#: yadisk._async_client.AsyncClient.get_public_available_settings\n#: yadisk._async_client.AsyncClient.get_public_download_link\n#: yadisk._async_client.AsyncClient.get_public_meta\n#: yadisk._async_client.AsyncClient.get_public_resources\n#: yadisk._async_client.AsyncClient.get_public_settings\n#: yadisk._async_client.AsyncClient.get_public_type\n#: yadisk._async_client.AsyncClient.get_token\n#: yadisk._async_client.AsyncClient.get_token_from_device_code\n#: yadisk._async_client.AsyncClient.get_trash_meta\n#: yadisk._async_client.AsyncClient.get_trash_type\n#: yadisk._async_client.AsyncClient.get_type\n#: yadisk._async_client.AsyncClient.get_upload_link\n#: yadisk._async_client.AsyncClient.get_upload_link_object\n#: yadisk._async_client.AsyncClient.is_dir\n#: yadisk._async_client.AsyncClient.is_file\n#: yadisk._async_client.AsyncClient.is_public_dir\n#: yadisk._async_client.AsyncClient.is_public_file\n#: yadisk._async_client.AsyncClient.is_trash_dir\n#: yadisk._async_client.AsyncClient.is_trash_file\n#: yadisk._async_client.AsyncClient.listdir\n#: yadisk._async_client.AsyncClient.makedirs\n#: yadisk._async_client.AsyncClient.mkdir yadisk._async_client.AsyncClient.move\n#: yadisk._async_client.AsyncClient.patch\n#: yadisk._async_client.AsyncClient.public_exists\n#: yadisk._async_client.AsyncClient.publish\n#: yadisk._async_client.AsyncClient.refresh_token\n#: yadisk._async_client.AsyncClient.remove\n#: yadisk._async_client.AsyncClient.remove_trash\n#: yadisk._async_client.AsyncClient.rename\n#: yadisk._async_client.AsyncClient.restore_trash\n#: yadisk._async_client.AsyncClient.revoke_token\n#: yadisk._async_client.AsyncClient.save_to_disk\n#: yadisk._async_client.AsyncClient.trash_exists\n#: yadisk._async_client.AsyncClient.trash_listdir\n#: yadisk._async_client.AsyncClient.unpublish\n#: yadisk._async_client.AsyncClient.update_public_settings\n#: yadisk._async_client.AsyncClient.upload\n#: yadisk._async_client.AsyncClient.upload_by_link\n#: yadisk._async_client.AsyncClient.upload_url\n#: yadisk._async_client.AsyncClient.wait_for_operation\n#: yadisk._async_session.AsyncResponse.download\n#: yadisk._async_session.AsyncResponse.json yadisk._client.Client\n#: yadisk._client.Client.copy yadisk._client.Client.download\n#: yadisk._client.Client.download_public yadisk._client.Client.exists\n#: yadisk._client.Client.get_all_public_resources\n#: yadisk._client.Client.get_auth_url yadisk._client.Client.get_code_url\n#: yadisk._client.Client.get_device_code yadisk._client.Client.get_disk_info\n#: yadisk._client.Client.get_download_link yadisk._client.Client.get_files\n#: yadisk._client.Client.get_last_uploaded yadisk._client.Client.get_meta\n#: yadisk._client.Client.get_operation_status\n#: yadisk._client.Client.get_public_available_settings\n#: yadisk._client.Client.get_public_download_link\n#: yadisk._client.Client.get_public_meta\n#: yadisk._client.Client.get_public_resources\n#: yadisk._client.Client.get_public_settings\n#: yadisk._client.Client.get_public_type yadisk._client.Client.get_token\n#: yadisk._client.Client.get_token_from_device_code\n#: yadisk._client.Client.get_trash_meta yadisk._client.Client.get_trash_type\n#: yadisk._client.Client.get_type yadisk._client.Client.get_upload_link\n#: yadisk._client.Client.get_upload_link_object yadisk._client.Client.is_dir\n#: yadisk._client.Client.is_file yadisk._client.Client.is_public_dir\n#: yadisk._client.Client.is_public_file yadisk._client.Client.is_trash_dir\n#: yadisk._client.Client.is_trash_file yadisk._client.Client.listdir\n#: yadisk._client.Client.makedirs yadisk._client.Client.mkdir\n#: yadisk._client.Client.move yadisk._client.Client.patch\n#: yadisk._client.Client.public_exists yadisk._client.Client.publish\n#: yadisk._client.Client.refresh_token yadisk._client.Client.remove\n#: yadisk._client.Client.remove_trash yadisk._client.Client.rename\n#: yadisk._client.Client.restore_trash yadisk._client.Client.revoke_token\n#: yadisk._client.Client.save_to_disk yadisk._client.Client.trash_exists\n#: yadisk._client.Client.trash_listdir yadisk._client.Client.unpublish\n#: yadisk._client.Client.update_public_settings yadisk._client.Client.upload\n#: yadisk._client.Client.upload_by_link yadisk._client.Client.upload_url\n#: yadisk._client.Client.wait_for_operation\n#: yadisk._import_session.import_async_session\n#: yadisk._import_session.import_session yadisk._session.Response.download\n#: yadisk._session.Response.json\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status\n#: yadisk.objects._operations.SyncOperationLinkObject.wait\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore\n#: yadisk.objects._resources.SyncTrashResourceObject.exists\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir\n#: yadisk.objects._resources.SyncTrashResourceObject.remove\n#: yadisk.objects._resources.SyncTrashResourceObject.restore\n#: yadisk.objects._yadisk_object.YaDiskObject.__matmul__\n#: yadisk.objects._yadisk_object.YaDiskObject.field\nmsgid \"Raises\"\nmsgstr \"Вызывает\"\n\n#: of yadisk._async_client.AsyncClient:58 yadisk._client.Client:51\nmsgid \"HTTP client raised an exception while making a request\"\nmsgstr \"HTTP-клиент вызвал исключение во время отправления запроса\"\n\n#: of yadisk._async_client.AsyncClient:59 yadisk._client.Client:52\nmsgid \"server returned HTTP code 400\"\nmsgstr \"сервер вернул код 400.\"\n\n#: of yadisk._async_client.AsyncClient:60 yadisk._client.Client:53\nmsgid \"request contains fields with invalid data\"\nmsgstr \"запрос содежит поля с некорректными данными.\"\n\n#: of yadisk._async_client.AsyncClient:61 yadisk._client.Client:54\nmsgid \"server returned HTTP code 401\"\nmsgstr \"сервер вернул код 401.\"\n\n#: of yadisk._async_client.AsyncClient:62 yadisk._client.Client:55\nmsgid \"server returned HTTP code 403\"\nmsgstr \"сервер вернул код 403.\"\n\n#: of yadisk._async_client.AsyncClient:63 yadisk._client.Client:56\nmsgid \"server returned HTTP code 406\"\nmsgstr \"сервер вернул код 406.\"\n\n#: of yadisk._async_client.AsyncClient:64 yadisk._client.Client:57\nmsgid \"server returned HTTP code 409\"\nmsgstr \"сервер вернул код 409.\"\n\n#: of yadisk._async_client.AsyncClient:65 yadisk._client.Client:58\nmsgid \"server returned code 413\"\nmsgstr \"сервер вернул код 413.\"\n\n#: of yadisk._async_client.AsyncClient:66 yadisk._client.Client:59\nmsgid \"server returned HTTP code 415\"\nmsgstr \"сервер вернул код 415.\"\n\n#: of yadisk._async_client.AsyncClient:67 yadisk._client.Client:60\nmsgid \"server returned HTTP code 423\"\nmsgstr \"сервер вернул код 423.\"\n\n#: of yadisk._async_client.AsyncClient:68 yadisk._client.Client:61\nmsgid \"server returned HTTP code 429\"\nmsgstr \"сервер вернул код 429.\"\n\n#: of yadisk._async_client.AsyncClient:69 yadisk._client.Client:62\nmsgid \"server returned HTTP code 500\"\nmsgstr \"сервер вернул код 500.\"\n\n#: of yadisk._async_client.AsyncClient:70 yadisk._client.Client:63\nmsgid \"server returned HTTP code 502\"\nmsgstr \"сервер вернул код 502.\"\n\n#: of yadisk._async_client.AsyncClient:71 yadisk._client.Client:64\nmsgid \"server returned HTTP code 503\"\nmsgstr \"сервер вернул код 503.\"\n\n#: of yadisk._async_client.AsyncClient:72 yadisk._client.Client:65\nmsgid \"server returned HTTP code 504\"\nmsgstr \"сервер вернул код 504.\"\n\n#: of yadisk._async_client.AsyncClient:73 yadisk._client.Client:66\nmsgid \"server returned HTTP code 509\"\nmsgstr \"сервер вернул код 509.\"\n\n#: of yadisk._async_client.AsyncClient:74 yadisk._client.Client:67\nmsgid \"other unknown error\"\nmsgstr \"другая неизвестная ошибка\"\n\n#: of yadisk._async_client.AsyncClient.close:1 yadisk._client.Client.close:1\nmsgid \"\"\n\"Closes the session. Do not call this method while there are other active \"\n\"threads using this object.\"\nmsgstr \"\"\n\"Закрывает сессию. Не вызывайте этот метод, пока другие потоки используют \"\n\"этот объект.\"\n\n#: of yadisk._async_client.AsyncClient.close:4\nmsgid \"\"\n\"This method can also be called implicitly by using the `async with` \"\n\"statement.\"\nmsgstr \"Этот метод неявно вызывается конструкцией `async with`.\"\n\n#: ../../api_reference/async_api.rst:11 ../../api_reference/sync_api.rst:11\nmsgid \"Authentication\"\nmsgstr \"Аутентификация\"\n\n#: of yadisk._async_client.AsyncClient.check_token:1\n#: yadisk._client.Client.check_token:1\nmsgid \"Check whether the token is valid.\"\nmsgstr \"Проверяет, действителен ли токен.\"\n\n#: of yadisk._async_client.AsyncClient.check_token:3\n#: yadisk._client.Client.check_token:3\nmsgid \"token to check, equivalent to `self.token` if `None`\"\nmsgstr \"токен, подлежащий проверке, то же самое, что `self.token` при `None`\"\n\n#: of yadisk._async_client.AsyncClient.check_token:4\n#: yadisk._async_client.AsyncClient.copy:15\n#: yadisk._async_client.AsyncClient.download:5\n#: yadisk._async_client.AsyncClient.download_by_link:5\n#: yadisk._async_client.AsyncClient.download_public:6\n#: yadisk._async_client.AsyncClient.exists:4\n#: yadisk._async_client.AsyncClient.get_device_code:12\n#: yadisk._async_client.AsyncClient.get_disk_info:5\n#: yadisk._async_client.AsyncClient.get_download_link:4\n#: yadisk._async_client.AsyncClient.get_files:11\n#: yadisk._async_client.AsyncClient.get_last_uploaded:8\n#: yadisk._async_client.AsyncClient.get_meta:10\n#: yadisk._async_client.AsyncClient.get_operation_status:4\n#: yadisk._async_client.AsyncClient.get_public_download_link:5\n#: yadisk._async_client.AsyncClient.get_public_meta:13\n#: yadisk._async_client.AsyncClient.get_public_resources:9\n#: yadisk._async_client.AsyncClient.get_public_type:5\n#: yadisk._async_client.AsyncClient.get_token:6\n#: yadisk._async_client.AsyncClient.get_trash_meta:10\n#: yadisk._async_client.AsyncClient.get_trash_type:4\n#: yadisk._async_client.AsyncClient.get_type:4\n#: yadisk._async_client.AsyncClient.get_upload_link:8\n#: yadisk._async_client.AsyncClient.is_dir:4\n#: yadisk._async_client.AsyncClient.is_file:4\n#: yadisk._async_client.AsyncClient.is_public_dir:5\n#: yadisk._async_client.AsyncClient.is_public_file:5\n#: yadisk._async_client.AsyncClient.is_trash_dir:4\n#: yadisk._async_client.AsyncClient.is_trash_file:4\n#: yadisk._async_client.AsyncClient.listdir:10\n#: yadisk._async_client.AsyncClient.makedirs:6\n#: yadisk._async_client.AsyncClient.mkdir:5\n#: yadisk._async_client.AsyncClient.move:12\n#: yadisk._async_client.AsyncClient.patch:6\n#: yadisk._async_client.AsyncClient.public_exists:5\n#: yadisk._async_client.AsyncClient.publish:8\n#: yadisk._async_client.AsyncClient.refresh_token:4\n#: yadisk._async_client.AsyncClient.remove:13\n#: yadisk._async_client.AsyncClient.remove_trash:10\n#: yadisk._async_client.AsyncClient.rename:13\n#: yadisk._async_client.AsyncClient.restore_trash:13\n#: yadisk._async_client.AsyncClient.revoke_token:4\n#: yadisk._async_client.AsyncClient.save_to_disk:15\n#: yadisk._async_client.AsyncClient.trash_exists:4\n#: yadisk._async_client.AsyncClient.trash_listdir:10\n#: yadisk._async_client.AsyncClient.unpublish:7\n#: yadisk._async_client.AsyncClient.upload:10\n#: yadisk._async_client.AsyncClient.upload_by_link:7\n#: yadisk._async_client.AsyncClient.upload_url:11\nmsgid \"`float`, `tuple` or `None`, request timeout\"\nmsgstr \"`float`, `tuple` или `None`, таймаут запроса\"\n\n#: of yadisk._async_client.AsyncClient.check_token:5\n#: yadisk._async_client.AsyncClient.copy:16\n#: yadisk._async_client.AsyncClient.download:6\n#: yadisk._async_client.AsyncClient.download_by_link:6\n#: yadisk._async_client.AsyncClient.download_public:7\n#: yadisk._async_client.AsyncClient.exists:5\n#: yadisk._async_client.AsyncClient.get_all_public_resources:11\n#: yadisk._async_client.AsyncClient.get_device_code:13\n#: yadisk._async_client.AsyncClient.get_disk_info:6\n#: yadisk._async_client.AsyncClient.get_download_link:5\n#: yadisk._async_client.AsyncClient.get_files:12\n#: yadisk._async_client.AsyncClient.get_last_uploaded:9\n#: yadisk._async_client.AsyncClient.get_meta:11\n#: yadisk._async_client.AsyncClient.get_operation_status:5\n#: yadisk._async_client.AsyncClient.get_public_available_settings:5\n#: yadisk._async_client.AsyncClient.get_public_download_link:6\n#: yadisk._async_client.AsyncClient.get_public_meta:14\n#: yadisk._async_client.AsyncClient.get_public_resources:10\n#: yadisk._async_client.AsyncClient.get_public_settings:7\n#: yadisk._async_client.AsyncClient.get_public_type:6\n#: yadisk._async_client.AsyncClient.get_token:7\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:8\n#: yadisk._async_client.AsyncClient.get_trash_meta:11\n#: yadisk._async_client.AsyncClient.get_trash_type:5\n#: yadisk._async_client.AsyncClient.get_type:5\n#: yadisk._async_client.AsyncClient.get_upload_link:9\n#: yadisk._async_client.AsyncClient.get_upload_link_object:13\n#: yadisk._async_client.AsyncClient.is_dir:5\n#: yadisk._async_client.AsyncClient.is_file:5\n#: yadisk._async_client.AsyncClient.is_public_dir:6\n#: yadisk._async_client.AsyncClient.is_public_file:6\n#: yadisk._async_client.AsyncClient.is_trash_dir:5\n#: yadisk._async_client.AsyncClient.is_trash_file:5\n#: yadisk._async_client.AsyncClient.listdir:11\n#: yadisk._async_client.AsyncClient.makedirs:7\n#: yadisk._async_client.AsyncClient.mkdir:6\n#: yadisk._async_client.AsyncClient.move:13\n#: yadisk._async_client.AsyncClient.patch:7\n#: yadisk._async_client.AsyncClient.public_exists:6\n#: yadisk._async_client.AsyncClient.publish:9\n#: yadisk._async_client.AsyncClient.refresh_token:5\n#: yadisk._async_client.AsyncClient.remove:14\n#: yadisk._async_client.AsyncClient.remove_trash:11\n#: yadisk._async_client.AsyncClient.rename:14\n#: yadisk._async_client.AsyncClient.restore_trash:14\n#: yadisk._async_client.AsyncClient.revoke_token:5\n#: yadisk._async_client.AsyncClient.save_to_disk:16\n#: yadisk._async_client.AsyncClient.trash_exists:5\n#: yadisk._async_client.AsyncClient.trash_listdir:11\n#: yadisk._async_client.AsyncClient.unpublish:8\n#: yadisk._async_client.AsyncClient.update_public_settings:6\n#: yadisk._async_client.AsyncClient.upload:11\n#: yadisk._async_client.AsyncClient.upload_by_link:8\n#: yadisk._async_client.AsyncClient.upload_url:12\n#: yadisk._async_client.AsyncClient.wait_for_operation:9\n#: yadisk._client.Client.check_token:5 yadisk._client.Client.copy:16\n#: yadisk._client.Client.download:6 yadisk._client.Client.download_by_link:6\n#: yadisk._client.Client.download_public:7 yadisk._client.Client.exists:5\n#: yadisk._client.Client.get_all_public_resources:11\n#: yadisk._client.Client.get_device_code:12\n#: yadisk._client.Client.get_disk_info:6\n#: yadisk._client.Client.get_download_link:5 yadisk._client.Client.get_files:12\n#: yadisk._client.Client.get_last_uploaded:9 yadisk._client.Client.get_meta:11\n#: yadisk._client.Client.get_operation_status:5\n#: yadisk._client.Client.get_public_available_settings:5\n#: yadisk._client.Client.get_public_download_link:6\n#: yadisk._client.Client.get_public_meta:14\n#: yadisk._client.Client.get_public_resources:10\n#: yadisk._client.Client.get_public_settings:7\n#: yadisk._client.Client.get_public_type:6 yadisk._client.Client.get_token:8\n#: yadisk._client.Client.get_token_from_device_code:7\n#: yadisk._client.Client.get_trash_meta:11\n#: yadisk._client.Client.get_trash_type:5 yadisk._client.Client.get_type:5\n#: yadisk._client.Client.get_upload_link:9\n#: yadisk._client.Client.get_upload_link_object:13\n#: yadisk._client.Client.is_dir:5 yadisk._client.Client.is_file:5\n#: yadisk._client.Client.is_public_dir:6 yadisk._client.Client.is_public_file:6\n#: yadisk._client.Client.is_trash_dir:5 yadisk._client.Client.is_trash_file:5\n#: yadisk._client.Client.listdir:11 yadisk._client.Client.makedirs:7\n#: yadisk._client.Client.mkdir:6 yadisk._client.Client.move:13\n#: yadisk._client.Client.patch:7 yadisk._client.Client.public_exists:6\n#: yadisk._client.Client.publish:9 yadisk._client.Client.refresh_token:5\n#: yadisk._client.Client.remove:14 yadisk._client.Client.remove_trash:11\n#: yadisk._client.Client.rename:14 yadisk._client.Client.restore_trash:14\n#: yadisk._client.Client.revoke_token:5 yadisk._client.Client.save_to_disk:16\n#: yadisk._client.Client.trash_exists:5 yadisk._client.Client.trash_listdir:11\n#: yadisk._client.Client.unpublish:6\n#: yadisk._client.Client.update_public_settings:6\n#: yadisk._client.Client.upload:12 yadisk._client.Client.upload_by_link:9\n#: yadisk._client.Client.upload_url:12\n#: yadisk._client.Client.wait_for_operation:9\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:4\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:8\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:4\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:8\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:5\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:11\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:5\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:5\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:5\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:11\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:11\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:19\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:5\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:11\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:5\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:5\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:5\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:11\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:11\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:19\nmsgid \"`dict` or `None`, additional request headers\"\nmsgstr \"`dict` или `None`, дополнительные заголовки запроса\"\n\n#: of yadisk._async_client.AsyncClient.check_token:6\n#: yadisk._async_client.AsyncClient.copy:17\n#: yadisk._async_client.AsyncClient.download:7\n#: yadisk._async_client.AsyncClient.download_by_link:7\n#: yadisk._async_client.AsyncClient.download_public:8\n#: yadisk._async_client.AsyncClient.exists:6\n#: yadisk._async_client.AsyncClient.get_all_public_resources:12\n#: yadisk._async_client.AsyncClient.get_device_code:14\n#: yadisk._async_client.AsyncClient.get_disk_info:7\n#: yadisk._async_client.AsyncClient.get_download_link:6\n#: yadisk._async_client.AsyncClient.get_files:13\n#: yadisk._async_client.AsyncClient.get_last_uploaded:10\n#: yadisk._async_client.AsyncClient.get_meta:12\n#: yadisk._async_client.AsyncClient.get_operation_status:6\n#: yadisk._async_client.AsyncClient.get_public_available_settings:6\n#: yadisk._async_client.AsyncClient.get_public_download_link:7\n#: yadisk._async_client.AsyncClient.get_public_meta:15\n#: yadisk._async_client.AsyncClient.get_public_resources:11\n#: yadisk._async_client.AsyncClient.get_public_settings:8\n#: yadisk._async_client.AsyncClient.get_public_type:7\n#: yadisk._async_client.AsyncClient.get_token:8\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:9\n#: yadisk._async_client.AsyncClient.get_trash_meta:12\n#: yadisk._async_client.AsyncClient.get_trash_type:6\n#: yadisk._async_client.AsyncClient.get_type:6\n#: yadisk._async_client.AsyncClient.get_upload_link:10\n#: yadisk._async_client.AsyncClient.get_upload_link_object:14\n#: yadisk._async_client.AsyncClient.is_dir:6\n#: yadisk._async_client.AsyncClient.is_file:6\n#: yadisk._async_client.AsyncClient.is_public_dir:7\n#: yadisk._async_client.AsyncClient.is_public_file:7\n#: yadisk._async_client.AsyncClient.is_trash_dir:6\n#: yadisk._async_client.AsyncClient.is_trash_file:6\n#: yadisk._async_client.AsyncClient.listdir:12\n#: yadisk._async_client.AsyncClient.makedirs:8\n#: yadisk._async_client.AsyncClient.mkdir:7\n#: yadisk._async_client.AsyncClient.move:14\n#: yadisk._async_client.AsyncClient.patch:8\n#: yadisk._async_client.AsyncClient.public_exists:7\n#: yadisk._async_client.AsyncClient.publish:10\n#: yadisk._async_client.AsyncClient.refresh_token:6\n#: yadisk._async_client.AsyncClient.remove:15\n#: yadisk._async_client.AsyncClient.remove_trash:12\n#: yadisk._async_client.AsyncClient.rename:15\n#: yadisk._async_client.AsyncClient.restore_trash:15\n#: yadisk._async_client.AsyncClient.revoke_token:6\n#: yadisk._async_client.AsyncClient.save_to_disk:17\n#: yadisk._async_client.AsyncClient.trash_exists:6\n#: yadisk._async_client.AsyncClient.trash_listdir:12\n#: yadisk._async_client.AsyncClient.unpublish:9\n#: yadisk._async_client.AsyncClient.update_public_settings:7\n#: yadisk._async_client.AsyncClient.upload:12\n#: yadisk._async_client.AsyncClient.upload_by_link:9\n#: yadisk._async_client.AsyncClient.upload_url:13\n#: yadisk._async_client.AsyncClient.wait_for_operation:10\n#: yadisk._client.Client.check_token:6 yadisk._client.Client.copy:17\n#: yadisk._client.Client.download:7 yadisk._client.Client.download_by_link:7\n#: yadisk._client.Client.download_public:8 yadisk._client.Client.exists:6\n#: yadisk._client.Client.get_all_public_resources:12\n#: yadisk._client.Client.get_device_code:13\n#: yadisk._client.Client.get_disk_info:7\n#: yadisk._client.Client.get_download_link:6 yadisk._client.Client.get_files:13\n#: yadisk._client.Client.get_last_uploaded:10 yadisk._client.Client.get_meta:12\n#: yadisk._client.Client.get_operation_status:6\n#: yadisk._client.Client.get_public_available_settings:6\n#: yadisk._client.Client.get_public_download_link:7\n#: yadisk._client.Client.get_public_meta:15\n#: yadisk._client.Client.get_public_resources:11\n#: yadisk._client.Client.get_public_settings:8\n#: yadisk._client.Client.get_public_type:7 yadisk._client.Client.get_token:9\n#: yadisk._client.Client.get_token_from_device_code:8\n#: yadisk._client.Client.get_trash_meta:12\n#: yadisk._client.Client.get_trash_type:6 yadisk._client.Client.get_type:6\n#: yadisk._client.Client.get_upload_link:10\n#: yadisk._client.Client.get_upload_link_object:14\n#: yadisk._client.Client.is_dir:6 yadisk._client.Client.is_file:6\n#: yadisk._client.Client.is_public_dir:7 yadisk._client.Client.is_public_file:7\n#: yadisk._client.Client.is_trash_dir:6 yadisk._client.Client.is_trash_file:6\n#: yadisk._client.Client.listdir:12 yadisk._client.Client.makedirs:8\n#: yadisk._client.Client.mkdir:7 yadisk._client.Client.move:14\n#: yadisk._client.Client.patch:8 yadisk._client.Client.public_exists:7\n#: yadisk._client.Client.publish:10 yadisk._client.Client.refresh_token:6\n#: yadisk._client.Client.remove:15 yadisk._client.Client.remove_trash:12\n#: yadisk._client.Client.rename:15 yadisk._client.Client.restore_trash:15\n#: yadisk._client.Client.revoke_token:6 yadisk._client.Client.save_to_disk:17\n#: yadisk._client.Client.trash_exists:6 yadisk._client.Client.trash_listdir:12\n#: yadisk._client.Client.unpublish:7\n#: yadisk._client.Client.update_public_settings:7\n#: yadisk._client.Client.upload:13 yadisk._client.Client.upload_by_link:10\n#: yadisk._client.Client.upload_url:13\n#: yadisk._client.Client.wait_for_operation:10\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:5\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:9\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:5\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:9\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:6\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:12\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:6\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:6\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:6\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:12\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:12\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:20\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:6\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:12\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:6\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:6\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:6\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:12\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:12\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:20\n#: yadisk.utils.async_auto_retry:6 yadisk.utils.auto_retry:6\nmsgid \"`int`, maximum number of retries\"\nmsgstr \"`int`, максимальное число повторных попыток запроса\"\n\n#: of yadisk._async_client.AsyncClient.check_token:7\n#: yadisk._async_client.AsyncClient.copy:18\n#: yadisk._async_client.AsyncClient.download:8\n#: yadisk._async_client.AsyncClient.download_by_link:8\n#: yadisk._async_client.AsyncClient.download_public:9\n#: yadisk._async_client.AsyncClient.exists:7\n#: yadisk._async_client.AsyncClient.get_all_public_resources:13\n#: yadisk._async_client.AsyncClient.get_device_code:15\n#: yadisk._async_client.AsyncClient.get_disk_info:8\n#: yadisk._async_client.AsyncClient.get_download_link:7\n#: yadisk._async_client.AsyncClient.get_files:14\n#: yadisk._async_client.AsyncClient.get_last_uploaded:11\n#: yadisk._async_client.AsyncClient.get_meta:13\n#: yadisk._async_client.AsyncClient.get_operation_status:7\n#: yadisk._async_client.AsyncClient.get_public_available_settings:7\n#: yadisk._async_client.AsyncClient.get_public_download_link:8\n#: yadisk._async_client.AsyncClient.get_public_meta:16\n#: yadisk._async_client.AsyncClient.get_public_resources:12\n#: yadisk._async_client.AsyncClient.get_public_settings:9\n#: yadisk._async_client.AsyncClient.get_public_type:8\n#: yadisk._async_client.AsyncClient.get_token:9\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:10\n#: yadisk._async_client.AsyncClient.get_trash_meta:13\n#: yadisk._async_client.AsyncClient.get_trash_type:7\n#: yadisk._async_client.AsyncClient.get_type:7\n#: yadisk._async_client.AsyncClient.get_upload_link:11\n#: yadisk._async_client.AsyncClient.get_upload_link_object:15\n#: yadisk._async_client.AsyncClient.is_dir:7\n#: yadisk._async_client.AsyncClient.is_file:7\n#: yadisk._async_client.AsyncClient.is_public_dir:8\n#: yadisk._async_client.AsyncClient.is_public_file:8\n#: yadisk._async_client.AsyncClient.is_trash_dir:7\n#: yadisk._async_client.AsyncClient.is_trash_file:7\n#: yadisk._async_client.AsyncClient.listdir:13\n#: yadisk._async_client.AsyncClient.makedirs:9\n#: yadisk._async_client.AsyncClient.mkdir:8\n#: yadisk._async_client.AsyncClient.move:15\n#: yadisk._async_client.AsyncClient.patch:9\n#: yadisk._async_client.AsyncClient.public_exists:8\n#: yadisk._async_client.AsyncClient.publish:11\n#: yadisk._async_client.AsyncClient.refresh_token:7\n#: yadisk._async_client.AsyncClient.remove:16\n#: yadisk._async_client.AsyncClient.remove_trash:13\n#: yadisk._async_client.AsyncClient.rename:16\n#: yadisk._async_client.AsyncClient.restore_trash:16\n#: yadisk._async_client.AsyncClient.revoke_token:7\n#: yadisk._async_client.AsyncClient.save_to_disk:18\n#: yadisk._async_client.AsyncClient.trash_exists:7\n#: yadisk._async_client.AsyncClient.trash_listdir:13\n#: yadisk._async_client.AsyncClient.unpublish:10\n#: yadisk._async_client.AsyncClient.update_public_settings:8\n#: yadisk._async_client.AsyncClient.upload:13\n#: yadisk._async_client.AsyncClient.upload_by_link:10\n#: yadisk._async_client.AsyncClient.upload_url:14\n#: yadisk._async_client.AsyncClient.wait_for_operation:11\n#: yadisk._client.Client.check_token:7 yadisk._client.Client.copy:18\n#: yadisk._client.Client.download:8 yadisk._client.Client.download_by_link:8\n#: yadisk._client.Client.download_public:9 yadisk._client.Client.exists:7\n#: yadisk._client.Client.get_all_public_resources:13\n#: yadisk._client.Client.get_device_code:14\n#: yadisk._client.Client.get_disk_info:8\n#: yadisk._client.Client.get_download_link:7 yadisk._client.Client.get_files:14\n#: yadisk._client.Client.get_last_uploaded:11 yadisk._client.Client.get_meta:13\n#: yadisk._client.Client.get_operation_status:7\n#: yadisk._client.Client.get_public_available_settings:7\n#: yadisk._client.Client.get_public_download_link:8\n#: yadisk._client.Client.get_public_meta:16\n#: yadisk._client.Client.get_public_resources:12\n#: yadisk._client.Client.get_public_settings:9\n#: yadisk._client.Client.get_public_type:8 yadisk._client.Client.get_token:10\n#: yadisk._client.Client.get_token_from_device_code:9\n#: yadisk._client.Client.get_trash_meta:13\n#: yadisk._client.Client.get_trash_type:7 yadisk._client.Client.get_type:7\n#: yadisk._client.Client.get_upload_link:11\n#: yadisk._client.Client.get_upload_link_object:15\n#: yadisk._client.Client.is_dir:7 yadisk._client.Client.is_file:7\n#: yadisk._client.Client.is_public_dir:8 yadisk._client.Client.is_public_file:8\n#: yadisk._client.Client.is_trash_dir:7 yadisk._client.Client.is_trash_file:7\n#: yadisk._client.Client.listdir:13 yadisk._client.Client.makedirs:9\n#: yadisk._client.Client.mkdir:8 yadisk._client.Client.move:15\n#: yadisk._client.Client.patch:9 yadisk._client.Client.public_exists:8\n#: yadisk._client.Client.publish:11 yadisk._client.Client.refresh_token:7\n#: yadisk._client.Client.remove:16 yadisk._client.Client.remove_trash:13\n#: yadisk._client.Client.rename:16 yadisk._client.Client.restore_trash:16\n#: yadisk._client.Client.revoke_token:7 yadisk._client.Client.save_to_disk:18\n#: yadisk._client.Client.trash_exists:7 yadisk._client.Client.trash_listdir:13\n#: yadisk._client.Client.unpublish:8\n#: yadisk._client.Client.update_public_settings:8\n#: yadisk._client.Client.upload:14 yadisk._client.Client.upload_by_link:11\n#: yadisk._client.Client.upload_url:14\n#: yadisk._client.Client.wait_for_operation:11\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:6\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:10\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:6\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:10\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:7\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:13\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:7\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:7\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:7\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:13\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:13\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:21\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:7\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:13\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:7\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:7\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:7\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:13\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:13\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:21\nmsgid \"delay between retries in seconds\"\nmsgstr \"задержка между повторными попытками в секундах\"\n\n#: of yadisk._async_client.AsyncClient.check_token:8\n#: yadisk._async_client.AsyncClient.copy:19\n#: yadisk._async_client.AsyncClient.download:9\n#: yadisk._async_client.AsyncClient.download_by_link:9\n#: yadisk._async_client.AsyncClient.download_public:10\n#: yadisk._async_client.AsyncClient.exists:8\n#: yadisk._async_client.AsyncClient.get_all_public_resources:14\n#: yadisk._async_client.AsyncClient.get_device_code:16\n#: yadisk._async_client.AsyncClient.get_disk_info:9\n#: yadisk._async_client.AsyncClient.get_download_link:8\n#: yadisk._async_client.AsyncClient.get_files:15\n#: yadisk._async_client.AsyncClient.get_last_uploaded:12\n#: yadisk._async_client.AsyncClient.get_meta:14\n#: yadisk._async_client.AsyncClient.get_operation_status:8\n#: yadisk._async_client.AsyncClient.get_public_available_settings:8\n#: yadisk._async_client.AsyncClient.get_public_download_link:9\n#: yadisk._async_client.AsyncClient.get_public_meta:17\n#: yadisk._async_client.AsyncClient.get_public_resources:13\n#: yadisk._async_client.AsyncClient.get_public_settings:10\n#: yadisk._async_client.AsyncClient.get_public_type:9\n#: yadisk._async_client.AsyncClient.get_token:10\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:11\n#: yadisk._async_client.AsyncClient.get_trash_meta:14\n#: yadisk._async_client.AsyncClient.get_trash_type:8\n#: yadisk._async_client.AsyncClient.get_type:8\n#: yadisk._async_client.AsyncClient.get_upload_link:12\n#: yadisk._async_client.AsyncClient.get_upload_link_object:16\n#: yadisk._async_client.AsyncClient.is_dir:8\n#: yadisk._async_client.AsyncClient.is_file:8\n#: yadisk._async_client.AsyncClient.is_public_dir:9\n#: yadisk._async_client.AsyncClient.is_public_file:9\n#: yadisk._async_client.AsyncClient.is_trash_dir:8\n#: yadisk._async_client.AsyncClient.is_trash_file:8\n#: yadisk._async_client.AsyncClient.listdir:14\n#: yadisk._async_client.AsyncClient.makedirs:10\n#: yadisk._async_client.AsyncClient.mkdir:9\n#: yadisk._async_client.AsyncClient.move:16\n#: yadisk._async_client.AsyncClient.patch:10\n#: yadisk._async_client.AsyncClient.public_exists:9\n#: yadisk._async_client.AsyncClient.publish:12\n#: yadisk._async_client.AsyncClient.refresh_token:8\n#: yadisk._async_client.AsyncClient.remove:17\n#: yadisk._async_client.AsyncClient.remove_trash:14\n#: yadisk._async_client.AsyncClient.rename:17\n#: yadisk._async_client.AsyncClient.restore_trash:17\n#: yadisk._async_client.AsyncClient.revoke_token:8\n#: yadisk._async_client.AsyncClient.save_to_disk:19\n#: yadisk._async_client.AsyncClient.trash_exists:8\n#: yadisk._async_client.AsyncClient.trash_listdir:14\n#: yadisk._async_client.AsyncClient.unpublish:11\n#: yadisk._async_client.AsyncClient.update_public_settings:9\n#: yadisk._async_client.AsyncClient.upload:14\n#: yadisk._async_client.AsyncClient.upload_by_link:11\n#: yadisk._async_client.AsyncClient.upload_url:15\n#: yadisk._async_client.AsyncClient.wait_for_operation:12\n#: yadisk._client.Client.check_token:8 yadisk._client.Client.copy:19\n#: yadisk._client.Client.download:9 yadisk._client.Client.download_by_link:9\n#: yadisk._client.Client.download_public:10 yadisk._client.Client.exists:8\n#: yadisk._client.Client.get_all_public_resources:14\n#: yadisk._client.Client.get_device_code:15\n#: yadisk._client.Client.get_disk_info:9\n#: yadisk._client.Client.get_download_link:8 yadisk._client.Client.get_files:15\n#: yadisk._client.Client.get_last_uploaded:12 yadisk._client.Client.get_meta:14\n#: yadisk._client.Client.get_operation_status:8\n#: yadisk._client.Client.get_public_available_settings:8\n#: yadisk._client.Client.get_public_download_link:9\n#: yadisk._client.Client.get_public_meta:17\n#: yadisk._client.Client.get_public_resources:13\n#: yadisk._client.Client.get_public_settings:10\n#: yadisk._client.Client.get_public_type:9 yadisk._client.Client.get_token:11\n#: yadisk._client.Client.get_token_from_device_code:10\n#: yadisk._client.Client.get_trash_meta:14\n#: yadisk._client.Client.get_trash_type:8 yadisk._client.Client.get_type:8\n#: yadisk._client.Client.get_upload_link:12\n#: yadisk._client.Client.get_upload_link_object:16\n#: yadisk._client.Client.is_dir:8 yadisk._client.Client.is_file:8\n#: yadisk._client.Client.is_public_dir:9 yadisk._client.Client.is_public_file:9\n#: yadisk._client.Client.is_trash_dir:8 yadisk._client.Client.is_trash_file:8\n#: yadisk._client.Client.listdir:14 yadisk._client.Client.makedirs:10\n#: yadisk._client.Client.mkdir:9 yadisk._client.Client.move:16\n#: yadisk._client.Client.patch:10 yadisk._client.Client.public_exists:9\n#: yadisk._client.Client.publish:12 yadisk._client.Client.refresh_token:8\n#: yadisk._client.Client.remove:17 yadisk._client.Client.remove_trash:14\n#: yadisk._client.Client.rename:17 yadisk._client.Client.restore_trash:17\n#: yadisk._client.Client.revoke_token:8 yadisk._client.Client.save_to_disk:19\n#: yadisk._client.Client.trash_exists:8 yadisk._client.Client.trash_listdir:14\n#: yadisk._client.Client.unpublish:9\n#: yadisk._client.Client.update_public_settings:9\n#: yadisk._client.Client.upload:15 yadisk._client.Client.upload_by_link:12\n#: yadisk._client.Client.upload_url:15\n#: yadisk._client.Client.wait_for_operation:12\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:7\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:11\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:7\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:11\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:8\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:14\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:8\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:8\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:8\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:14\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:14\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:22\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:8\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:14\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:8\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:8\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:8\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:14\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:14\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:22\n#: yadisk.utils.async_auto_retry:10 yadisk.utils.auto_retry:10\nmsgid \"`tuple`, additional exception classes to retry on\"\nmsgstr \"\"\n\"`tuple`, дополнительные классы исключений, которые вызовут повторную \"\n\"попытку\"\n\n#: of yadisk._async_client.AsyncClient.check_token:9\n#: yadisk._async_client.AsyncClient.copy:20\n#: yadisk._async_client.AsyncClient.download:10\n#: yadisk._async_client.AsyncClient.download_by_link:10\n#: yadisk._async_client.AsyncClient.download_public:11\n#: yadisk._async_client.AsyncClient.exists:9\n#: yadisk._async_client.AsyncClient.get_device_code:17\n#: yadisk._async_client.AsyncClient.get_disk_info:10\n#: yadisk._async_client.AsyncClient.get_download_link:9\n#: yadisk._async_client.AsyncClient.get_files:16\n#: yadisk._async_client.AsyncClient.get_last_uploaded:13\n#: yadisk._async_client.AsyncClient.get_meta:15\n#: yadisk._async_client.AsyncClient.get_operation_status:9\n#: yadisk._async_client.AsyncClient.get_public_available_settings:9\n#: yadisk._async_client.AsyncClient.get_public_download_link:10\n#: yadisk._async_client.AsyncClient.get_public_meta:18\n#: yadisk._async_client.AsyncClient.get_public_resources:14\n#: yadisk._async_client.AsyncClient.get_public_settings:11\n#: yadisk._async_client.AsyncClient.get_public_type:10\n#: yadisk._async_client.AsyncClient.get_token:11\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:12\n#: yadisk._async_client.AsyncClient.get_trash_meta:15\n#: yadisk._async_client.AsyncClient.get_trash_type:9\n#: yadisk._async_client.AsyncClient.get_type:9\n#: yadisk._async_client.AsyncClient.get_upload_link:13\n#: yadisk._async_client.AsyncClient.get_upload_link_object:17\n#: yadisk._async_client.AsyncClient.is_dir:9\n#: yadisk._async_client.AsyncClient.is_file:9\n#: yadisk._async_client.AsyncClient.is_public_dir:10\n#: yadisk._async_client.AsyncClient.is_public_file:10\n#: yadisk._async_client.AsyncClient.is_trash_dir:9\n#: yadisk._async_client.AsyncClient.is_trash_file:9\n#: yadisk._async_client.AsyncClient.listdir:15\n#: yadisk._async_client.AsyncClient.makedirs:11\n#: yadisk._async_client.AsyncClient.mkdir:10\n#: yadisk._async_client.AsyncClient.move:17\n#: yadisk._async_client.AsyncClient.patch:11\n#: yadisk._async_client.AsyncClient.public_exists:10\n#: yadisk._async_client.AsyncClient.publish:13\n#: yadisk._async_client.AsyncClient.refresh_token:9\n#: yadisk._async_client.AsyncClient.remove:18\n#: yadisk._async_client.AsyncClient.remove_trash:15\n#: yadisk._async_client.AsyncClient.rename:18\n#: yadisk._async_client.AsyncClient.restore_trash:18\n#: yadisk._async_client.AsyncClient.revoke_token:9\n#: yadisk._async_client.AsyncClient.save_to_disk:20\n#: yadisk._async_client.AsyncClient.trash_exists:9\n#: yadisk._async_client.AsyncClient.trash_listdir:15\n#: yadisk._async_client.AsyncClient.unpublish:12\n#: yadisk._async_client.AsyncClient.update_public_settings:10\n#: yadisk._async_client.AsyncClient.upload:15\n#: yadisk._async_client.AsyncClient.upload_by_link:12\n#: yadisk._async_client.AsyncClient.upload_url:16\n#: yadisk._async_client.AsyncClient.wait_for_operation:13\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:8\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:12\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:9\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:15\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:9\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:9\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:9\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:15\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:15\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:23\nmsgid \"`dict`, additional parameters for :any:`AIOHTTPSession`\"\nmsgstr \"`dict`, дополнительные параметры для :any:`AIOHTTPSession`\"\n\n#: of yadisk._async_client.AsyncClient.check_token:10\n#: yadisk._async_client.AsyncClient.copy:21\n#: yadisk._async_client.AsyncClient.download:11\n#: yadisk._async_client.AsyncClient.download_by_link:11\n#: yadisk._async_client.AsyncClient.download_public:12\n#: yadisk._async_client.AsyncClient.exists:10\n#: yadisk._async_client.AsyncClient.get_device_code:18\n#: yadisk._async_client.AsyncClient.get_disk_info:11\n#: yadisk._async_client.AsyncClient.get_download_link:10\n#: yadisk._async_client.AsyncClient.get_files:17\n#: yadisk._async_client.AsyncClient.get_last_uploaded:14\n#: yadisk._async_client.AsyncClient.get_meta:16\n#: yadisk._async_client.AsyncClient.get_operation_status:10\n#: yadisk._async_client.AsyncClient.get_public_available_settings:10\n#: yadisk._async_client.AsyncClient.get_public_download_link:11\n#: yadisk._async_client.AsyncClient.get_public_meta:19\n#: yadisk._async_client.AsyncClient.get_public_resources:15\n#: yadisk._async_client.AsyncClient.get_public_settings:12\n#: yadisk._async_client.AsyncClient.get_public_type:11\n#: yadisk._async_client.AsyncClient.get_token:12\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:13\n#: yadisk._async_client.AsyncClient.get_trash_meta:16\n#: yadisk._async_client.AsyncClient.get_trash_type:10\n#: yadisk._async_client.AsyncClient.get_type:10\n#: yadisk._async_client.AsyncClient.get_upload_link:14\n#: yadisk._async_client.AsyncClient.get_upload_link_object:18\n#: yadisk._async_client.AsyncClient.is_dir:10\n#: yadisk._async_client.AsyncClient.is_file:10\n#: yadisk._async_client.AsyncClient.is_public_dir:11\n#: yadisk._async_client.AsyncClient.is_public_file:11\n#: yadisk._async_client.AsyncClient.is_trash_dir:10\n#: yadisk._async_client.AsyncClient.is_trash_file:10\n#: yadisk._async_client.AsyncClient.listdir:16\n#: yadisk._async_client.AsyncClient.makedirs:12\n#: yadisk._async_client.AsyncClient.mkdir:11\n#: yadisk._async_client.AsyncClient.move:18\n#: yadisk._async_client.AsyncClient.patch:12\n#: yadisk._async_client.AsyncClient.public_exists:11\n#: yadisk._async_client.AsyncClient.publish:14\n#: yadisk._async_client.AsyncClient.refresh_token:10\n#: yadisk._async_client.AsyncClient.remove:19\n#: yadisk._async_client.AsyncClient.remove_trash:16\n#: yadisk._async_client.AsyncClient.rename:19\n#: yadisk._async_client.AsyncClient.restore_trash:19\n#: yadisk._async_client.AsyncClient.revoke_token:10\n#: yadisk._async_client.AsyncClient.save_to_disk:21\n#: yadisk._async_client.AsyncClient.trash_exists:10\n#: yadisk._async_client.AsyncClient.trash_listdir:16\n#: yadisk._async_client.AsyncClient.unpublish:13\n#: yadisk._async_client.AsyncClient.update_public_settings:11\n#: yadisk._async_client.AsyncClient.upload:16\n#: yadisk._async_client.AsyncClient.upload_by_link:13\n#: yadisk._async_client.AsyncClient.upload_url:17\n#: yadisk._async_client.AsyncClient.wait_for_operation:14\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:9\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:13\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:10\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:16\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:10\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:10\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:10\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:16\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:16\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:24\nmsgid \"`dict`, additional parameters for :any:`AsyncHTTPXSession`\"\nmsgstr \"`dict`, дополнительные параметры для :any:`AsyncHTTPXSession`\"\n\n#: of yadisk._async_client.AsyncClient.check_token:11\n#: yadisk._async_client.AsyncClient.copy:22\n#: yadisk._async_client.AsyncClient.download:12\n#: yadisk._async_client.AsyncClient.download_by_link:12\n#: yadisk._async_client.AsyncClient.download_public:13\n#: yadisk._async_client.AsyncClient.exists:11\n#: yadisk._async_client.AsyncClient.get_all_public_resources:18\n#: yadisk._async_client.AsyncClient.get_device_code:19\n#: yadisk._async_client.AsyncClient.get_disk_info:12\n#: yadisk._async_client.AsyncClient.get_download_link:11\n#: yadisk._async_client.AsyncClient.get_files:18\n#: yadisk._async_client.AsyncClient.get_last_uploaded:15\n#: yadisk._async_client.AsyncClient.get_meta:17\n#: yadisk._async_client.AsyncClient.get_operation_status:11\n#: yadisk._async_client.AsyncClient.get_public_available_settings:11\n#: yadisk._async_client.AsyncClient.get_public_download_link:12\n#: yadisk._async_client.AsyncClient.get_public_meta:20\n#: yadisk._async_client.AsyncClient.get_public_resources:16\n#: yadisk._async_client.AsyncClient.get_public_settings:13\n#: yadisk._async_client.AsyncClient.get_public_type:12\n#: yadisk._async_client.AsyncClient.get_token:13\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:14\n#: yadisk._async_client.AsyncClient.get_trash_meta:17\n#: yadisk._async_client.AsyncClient.get_trash_type:11\n#: yadisk._async_client.AsyncClient.get_type:11\n#: yadisk._async_client.AsyncClient.get_upload_link:15\n#: yadisk._async_client.AsyncClient.get_upload_link_object:19\n#: yadisk._async_client.AsyncClient.is_dir:11\n#: yadisk._async_client.AsyncClient.is_file:11\n#: yadisk._async_client.AsyncClient.is_public_dir:12\n#: yadisk._async_client.AsyncClient.is_public_file:12\n#: yadisk._async_client.AsyncClient.is_trash_dir:11\n#: yadisk._async_client.AsyncClient.is_trash_file:11\n#: yadisk._async_client.AsyncClient.listdir:17\n#: yadisk._async_client.AsyncClient.makedirs:13\n#: yadisk._async_client.AsyncClient.mkdir:12\n#: yadisk._async_client.AsyncClient.move:19\n#: yadisk._async_client.AsyncClient.patch:13\n#: yadisk._async_client.AsyncClient.public_exists:12\n#: yadisk._async_client.AsyncClient.publish:15\n#: yadisk._async_client.AsyncClient.refresh_token:11\n#: yadisk._async_client.AsyncClient.remove:20\n#: yadisk._async_client.AsyncClient.remove_trash:17\n#: yadisk._async_client.AsyncClient.rename:20\n#: yadisk._async_client.AsyncClient.restore_trash:20\n#: yadisk._async_client.AsyncClient.revoke_token:11\n#: yadisk._async_client.AsyncClient.save_to_disk:22\n#: yadisk._async_client.AsyncClient.trash_exists:11\n#: yadisk._async_client.AsyncClient.trash_listdir:17\n#: yadisk._async_client.AsyncClient.unpublish:14\n#: yadisk._async_client.AsyncClient.update_public_settings:12\n#: yadisk._async_client.AsyncClient.upload:17\n#: yadisk._async_client.AsyncClient.upload_by_link:14\n#: yadisk._async_client.AsyncClient.upload_url:18\n#: yadisk._async_client.AsyncClient.wait_for_operation:15\n#: yadisk._client.Client.check_token:12 yadisk._client.Client.copy:23\n#: yadisk._client.Client.download:13 yadisk._client.Client.download_by_link:13\n#: yadisk._client.Client.download_public:14 yadisk._client.Client.exists:12\n#: yadisk._client.Client.get_all_public_resources:18\n#: yadisk._client.Client.get_device_code:19\n#: yadisk._client.Client.get_disk_info:13\n#: yadisk._client.Client.get_download_link:12\n#: yadisk._client.Client.get_files:19\n#: yadisk._client.Client.get_last_uploaded:16 yadisk._client.Client.get_meta:18\n#: yadisk._client.Client.get_operation_status:12\n#: yadisk._client.Client.get_public_available_settings:12\n#: yadisk._client.Client.get_public_download_link:13\n#: yadisk._client.Client.get_public_meta:21\n#: yadisk._client.Client.get_public_resources:17\n#: yadisk._client.Client.get_public_settings:14\n#: yadisk._client.Client.get_public_type:13 yadisk._client.Client.get_token:15\n#: yadisk._client.Client.get_token_from_device_code:14\n#: yadisk._client.Client.get_trash_meta:18\n#: yadisk._client.Client.get_trash_type:12 yadisk._client.Client.get_type:12\n#: yadisk._client.Client.get_upload_link:16\n#: yadisk._client.Client.get_upload_link_object:20\n#: yadisk._client.Client.is_dir:12 yadisk._client.Client.is_file:12\n#: yadisk._client.Client.is_public_dir:13\n#: yadisk._client.Client.is_public_file:13\n#: yadisk._client.Client.is_trash_dir:12 yadisk._client.Client.is_trash_file:12\n#: yadisk._client.Client.listdir:18 yadisk._client.Client.makedirs:14\n#: yadisk._client.Client.mkdir:13 yadisk._client.Client.move:20\n#: yadisk._client.Client.patch:14 yadisk._client.Client.public_exists:13\n#: yadisk._client.Client.publish:16 yadisk._client.Client.refresh_token:12\n#: yadisk._client.Client.remove:21 yadisk._client.Client.remove_trash:18\n#: yadisk._client.Client.rename:21 yadisk._client.Client.restore_trash:21\n#: yadisk._client.Client.revoke_token:12 yadisk._client.Client.save_to_disk:23\n#: yadisk._client.Client.trash_exists:12 yadisk._client.Client.trash_listdir:18\n#: yadisk._client.Client.unpublish:13\n#: yadisk._client.Client.update_public_settings:13\n#: yadisk._client.Client.upload:19 yadisk._client.Client.upload_by_link:16\n#: yadisk._client.Client.upload_url:19\n#: yadisk._client.Client.wait_for_operation:16\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:10\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:14\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:11\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:15\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:11\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:17\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:11\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:11\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:11\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:17\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:17\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:25\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:12\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:18\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:12\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:12\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:12\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:18\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:18\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:26\nmsgid \"any other parameters, accepted by :any:`Session.send_request()`\"\nmsgstr \"другие параметры для :any:`Session.send_request()`\"\n\n#: of yadisk._async_client.AsyncClient.check_token\n#: yadisk._async_client.AsyncClient.copy\n#: yadisk._async_client.AsyncClient.download\n#: yadisk._async_client.AsyncClient.download_public\n#: yadisk._async_client.AsyncClient.exists\n#: yadisk._async_client.AsyncClient.get_all_public_resources\n#: yadisk._async_client.AsyncClient.get_auth_url\n#: yadisk._async_client.AsyncClient.get_code_url\n#: yadisk._async_client.AsyncClient.get_device_code\n#: yadisk._async_client.AsyncClient.get_disk_info\n#: yadisk._async_client.AsyncClient.get_download_link\n#: yadisk._async_client.AsyncClient.get_files\n#: yadisk._async_client.AsyncClient.get_last_uploaded\n#: yadisk._async_client.AsyncClient.get_meta\n#: yadisk._async_client.AsyncClient.get_operation_status\n#: yadisk._async_client.AsyncClient.get_public_available_settings\n#: yadisk._async_client.AsyncClient.get_public_download_link\n#: yadisk._async_client.AsyncClient.get_public_meta\n#: yadisk._async_client.AsyncClient.get_public_resources\n#: yadisk._async_client.AsyncClient.get_public_settings\n#: yadisk._async_client.AsyncClient.get_public_type\n#: yadisk._async_client.AsyncClient.get_token\n#: yadisk._async_client.AsyncClient.get_token_from_device_code\n#: yadisk._async_client.AsyncClient.get_trash_meta\n#: yadisk._async_client.AsyncClient.get_trash_type\n#: yadisk._async_client.AsyncClient.get_type\n#: yadisk._async_client.AsyncClient.get_upload_link\n#: yadisk._async_client.AsyncClient.get_upload_link_object\n#: yadisk._async_client.AsyncClient.is_dir\n#: yadisk._async_client.AsyncClient.is_file\n#: yadisk._async_client.AsyncClient.is_public_dir\n#: yadisk._async_client.AsyncClient.is_public_file\n#: yadisk._async_client.AsyncClient.is_trash_dir\n#: yadisk._async_client.AsyncClient.is_trash_file\n#: yadisk._async_client.AsyncClient.listdir\n#: yadisk._async_client.AsyncClient.makedirs\n#: yadisk._async_client.AsyncClient.mkdir yadisk._async_client.AsyncClient.move\n#: yadisk._async_client.AsyncClient.patch\n#: yadisk._async_client.AsyncClient.public_exists\n#: yadisk._async_client.AsyncClient.publish\n#: yadisk._async_client.AsyncClient.refresh_token\n#: yadisk._async_client.AsyncClient.remove\n#: yadisk._async_client.AsyncClient.remove_trash\n#: yadisk._async_client.AsyncClient.rename\n#: yadisk._async_client.AsyncClient.restore_trash\n#: yadisk._async_client.AsyncClient.revoke_token\n#: yadisk._async_client.AsyncClient.save_to_disk\n#: yadisk._async_client.AsyncClient.trash_exists\n#: yadisk._async_client.AsyncClient.trash_listdir\n#: yadisk._async_client.AsyncClient.unpublish\n#: yadisk._async_client.AsyncClient.update_public_settings\n#: yadisk._async_client.AsyncClient.upload\n#: yadisk._async_client.AsyncClient.upload_url\n#: yadisk._async_session.AsyncResponse.get_exception\n#: yadisk._async_session.AsyncResponse.json\n#: yadisk._async_session.AsyncSession.send_request\n#: yadisk._client.Client.check_token yadisk._client.Client.copy\n#: yadisk._client.Client.download yadisk._client.Client.download_public\n#: yadisk._client.Client.exists yadisk._client.Client.get_all_public_resources\n#: yadisk._client.Client.get_auth_url yadisk._client.Client.get_code_url\n#: yadisk._client.Client.get_device_code yadisk._client.Client.get_disk_info\n#: yadisk._client.Client.get_download_link yadisk._client.Client.get_files\n#: yadisk._client.Client.get_last_uploaded yadisk._client.Client.get_meta\n#: yadisk._client.Client.get_operation_status\n#: yadisk._client.Client.get_public_available_settings\n#: yadisk._client.Client.get_public_download_link\n#: yadisk._client.Client.get_public_meta\n#: yadisk._client.Client.get_public_resources\n#: yadisk._client.Client.get_public_settings\n#: yadisk._client.Client.get_public_type yadisk._client.Client.get_token\n#: yadisk._client.Client.get_token_from_device_code\n#: yadisk._client.Client.get_trash_meta yadisk._client.Client.get_trash_type\n#: yadisk._client.Client.get_type yadisk._client.Client.get_upload_link\n#: yadisk._client.Client.get_upload_link_object yadisk._client.Client.is_dir\n#: yadisk._client.Client.is_file yadisk._client.Client.is_public_dir\n#: yadisk._client.Client.is_public_file yadisk._client.Client.is_trash_dir\n#: yadisk._client.Client.is_trash_file yadisk._client.Client.listdir\n#: yadisk._client.Client.makedirs yadisk._client.Client.mkdir\n#: yadisk._client.Client.move yadisk._client.Client.patch\n#: yadisk._client.Client.public_exists yadisk._client.Client.publish\n#: yadisk._client.Client.refresh_token yadisk._client.Client.remove\n#: yadisk._client.Client.remove_trash yadisk._client.Client.rename\n#: yadisk._client.Client.restore_trash yadisk._client.Client.revoke_token\n#: yadisk._client.Client.save_to_disk yadisk._client.Client.trash_exists\n#: yadisk._client.Client.trash_listdir yadisk._client.Client.unpublish\n#: yadisk._client.Client.update_public_settings yadisk._client.Client.upload\n#: yadisk._client.Client.upload_url yadisk._import_session.import_async_session\n#: yadisk._import_session.import_session yadisk._session.Response.get_exception\n#: yadisk._session.Response.json yadisk._session.Session.send_request\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore\n#: yadisk.objects._resources.SyncTrashResourceObject.exists\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir\n#: yadisk.objects._resources.SyncTrashResourceObject.remove\n#: yadisk.objects._resources.SyncTrashResourceObject.restore\n#: yadisk.objects._yadisk_object.YaDiskObject.__matmul__\n#: yadisk.objects._yadisk_object.YaDiskObject.field\n#: yadisk.types.AsyncFileLike.read yadisk.types.AsyncFileLike.seek\n#: yadisk.types.AsyncFileLike.tell yadisk.types.AsyncFileLike.write\n#: yadisk.types.BinaryAsyncFileLike.read yadisk.types.BinaryAsyncFileLike.seek\n#: yadisk.types.BinaryAsyncFileLike.tell yadisk.types.BinaryAsyncFileLike.write\n#: yadisk.utils.async_auto_retry yadisk.utils.auto_retry\n#: yadisk.utils.get_exception\nmsgid \"Returns\"\nmsgstr \"Возвращает\"\n\n#: of yadisk._async_client.AsyncClient.check_token:13\n#: yadisk._async_client.AsyncClient.exists:15\n#: yadisk._async_client.AsyncClient.public_exists:16\n#: yadisk._async_client.AsyncClient.trash_exists:15\n#: yadisk._client.Client.check_token:14 yadisk._client.Client.exists:16\n#: yadisk._client.Client.public_exists:17 yadisk._client.Client.trash_exists:16\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:15\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:16\nmsgid \"`bool`\"\nmsgstr \"`bool`\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:1\n#: yadisk._client.Client.get_auth_url:1\nmsgid \"\"\n\"Get authentication URL for the user to go to. This method doesn't send \"\n\"any HTTP requests and merely constructs the URL.\"\nmsgstr \"\"\n\"Получает URL для аутентификации для пользователя. Данный метод не \"\n\"отправляет никаких HTTP запросов.\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:4\n#: yadisk._client.Client.get_auth_url:4\nmsgid \"\"\n\"response type (\\\"code\\\" to get the confirmation code or \\\"token\\\" to get \"\n\"the token automatically)\"\nmsgstr \"\"\n\"тип ответа (\\\"code\\\", чтобы получить код подтверждения или \\\"token\\\", \"\n\"чтобы получить токен автоматически)\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:5\n#: yadisk._async_client.AsyncClient.get_code_url:5\n#: yadisk._client.Client.get_auth_url:5 yadisk._client.Client.get_code_url:5\nmsgid \"unique device ID, must be between 6 and 50 characters\"\nmsgstr \"уникальный идентификатор устройства, от 6 до 50 символов\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:6\n#: yadisk._async_client.AsyncClient.get_code_url:6\n#: yadisk._async_client.AsyncClient.get_device_code:9\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:5\n#: yadisk._client.Client.get_auth_url:6 yadisk._client.Client.get_code_url:6\n#: yadisk._client.Client.get_device_code:8 yadisk._client.Client.get_token:5\n#: yadisk._client.Client.get_token_from_device_code:5\nmsgid \"device name, should not be longer than 100 characters\"\nmsgstr \"имя устройства, не более 100 символов\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:7\n#: yadisk._async_client.AsyncClient.get_code_url:7\n#: yadisk._client.Client.get_auth_url:7 yadisk._client.Client.get_code_url:7\nmsgid \"\"\n\"the URL to redirect the user to after they allow access to the app, by \"\n\"default, the first redirect URI specified in the app settings is used\"\nmsgstr \"\"\n\"URL на который пользователь будет перенаправлен после предоставления \"\n\"доступа приложению, по умолчанию используется первый URI, указанный в \"\n\"настройках приложения\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:10\n#: yadisk._async_client.AsyncClient.get_code_url:10\n#: yadisk._client.Client.get_auth_url:10 yadisk._client.Client.get_code_url:10\nmsgid \"doesn't do anything, kept for compatibility\"\nmsgstr \"ничего не делает, оставлен для совместимости\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:11\n#: yadisk._async_client.AsyncClient.get_code_url:11\n#: yadisk._client.Client.get_auth_url:11 yadisk._client.Client.get_code_url:11\nmsgid \"username or email for the account the token is being requested for\"\nmsgstr \"username или email аккаунта, для которого будет получен токен\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:12\n#: yadisk._async_client.AsyncClient.get_code_url:12\n#: yadisk._async_client.AsyncClient.get_device_code:10\n#: yadisk._client.Client.get_auth_url:12 yadisk._client.Client.get_code_url:12\n#: yadisk._client.Client.get_device_code:9\nmsgid \"`str`, list of permissions for the application\"\nmsgstr \"`str`, список разрешений для приложения\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:13\n#: yadisk._async_client.AsyncClient.get_code_url:13\n#: yadisk._async_client.AsyncClient.get_device_code:11\n#: yadisk._client.Client.get_auth_url:13 yadisk._client.Client.get_code_url:13\n#: yadisk._client.Client.get_device_code:10\nmsgid \"`str`, list of optional permissions for the application\"\nmsgstr \"`str`, список опциональных разрешений для приложения\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:14\n#: yadisk._async_client.AsyncClient.get_code_url:14\n#: yadisk._client.Client.get_auth_url:14 yadisk._client.Client.get_code_url:14\nmsgid \"\"\n\"if True, user will be required to confirm access to the account even if \"\n\"the user has already granted access for the application\"\nmsgstr \"\"\n\"Если `True`, пользователь должен будет разрешить доступ к аккаунту, даже \"\n\"если он уже это сделал до этого\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:16\n#: yadisk._async_client.AsyncClient.get_code_url:16\n#: yadisk._client.Client.get_auth_url:16 yadisk._client.Client.get_code_url:16\nmsgid \"\"\n\"The state string, which Yandex.OAuth returns without any changes (<= 1024\"\n\" characters)\"\nmsgstr \"\"\n\"Строка состояния, которую Яндекс.OAuth возвращает без изменений (<= 1024 \"\n\"символов)\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:17\n#: yadisk._async_client.AsyncClient.get_code_url:17\n#: yadisk._client.Client.get_auth_url:17 yadisk._client.Client.get_code_url:17\nmsgid \"\"\n\"string derived from the generated :code:`code_verifier` value using one \"\n\"of the two possible transformations (plain or S256)\"\nmsgstr \"\"\n\"строка, полученная из сгенерированного значения :code:`code_verifier` с \"\n\"помощью одного из двух возможных преобразований (plain или S256)\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:19\n#: yadisk._async_client.AsyncClient.get_code_url:19\n#: yadisk._client.Client.get_auth_url:19 yadisk._client.Client.get_code_url:19\nmsgid \"\"\n\"specifies what function was used to transform the :code:`code_verifier` \"\n\"value to :code:`code_challenge`, allowed values are :code:`\\\"plain\\\"` and\"\n\" :code:`\\\"S256\\\"` (recommended). If :code:`\\\"S256\\\"` is used, \"\n\":code:`code_challenge` must be produced by hashing the \"\n\":code:`code_verifier` value and encoding it to base64\"\nmsgstr \"\"\n\"Указывает функцию, которая будет использована для преобразования значения\"\n\" :code:`code_verifier`, возможные значения: :code:`\\\"plain\\\"` и \"\n\":code:`\\\"S256\\\"` (рекомендуется). Если используется :code:`\\\"S256\\\"`, \"\n\"значение :code:`code_challenge` должно быть получено путём хэширования \"\n\"значения :code:`code_verifier` и кодирования в base64\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:25\n#: yadisk._async_client.AsyncClient.get_code_url:25\n#: yadisk._client.Client.get_auth_url:25 yadisk._client.Client.get_code_url:25\nmsgid \"invalid arguments were passed\"\nmsgstr \"были переданы неправильные аргументы\"\n\n#: of yadisk._async_client.AsyncClient.get_auth_url:27\n#: yadisk._async_client.AsyncClient.get_code_url:27\n#: yadisk._client.Client.get_auth_url:27 yadisk._client.Client.get_code_url:27\nmsgid \"authentication URL\"\nmsgstr \"URL для аутентификации\"\n\n#: of yadisk._async_client.AsyncClient.get_code_url:1\n#: yadisk._client.Client.get_code_url:1\nmsgid \"\"\n\"Get the URL for the user to get the confirmation code. The confirmation \"\n\"code can later be used to get the token. This method doesn't send any \"\n\"HTTP requests and merely constructs the URL.\"\nmsgstr \"\"\n\"Получает URL для получения пользователем кода подтверждения. Он может \"\n\"быть использован для получения токена. Данный метод не отправляет никаких\"\n\" HTTP запросов.\"\n\n#: of yadisk._async_client.AsyncClient.get_device_code:1\nmsgid \"\"\n\"This request is used for authorization using the Yandex OAuth page. In \"\n\"this case the user must enter the verification code (:code:`user_code`) \"\n\"in the browser on the Yandex OAuth page. After the user has entered the \"\n\"code on the OAuth page, the application can exchange the \"\n\":code:`device_code` for the token using the \"\n\":any:`AsyncClient.get_token_from_device_code()`.\"\nmsgstr \"\"\n\"Данный запрос используется для авторизации с помощью страницы Яндекс \"\n\"OAuth. В данном случае пользователь должен ввести код подтверждения \"\n\"(:code:`user_code`) в браузере на странице Яндекс OAuth. После того как \"\n\"пользователь ввёл код, приложение может обменять :code:`device_code` на \"\n\"токен с помощью метода :any:`AsyncClient.get_token_from_device_code()`.\"\n\n#: of yadisk._async_client.AsyncClient.get_device_code:8\n#: yadisk._async_client.AsyncClient.get_token:4\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:4\n#: yadisk._client.Client.get_device_code:7 yadisk._client.Client.get_token:4\n#: yadisk._client.Client.get_token_from_device_code:4\nmsgid \"unique device ID (between 6 and 50 characters)\"\nmsgstr \"уникальный идентификатор устройства (между 6 и 50 символами)\"\n\n#: of yadisk._async_client.AsyncClient.get_device_code:21\n#: yadisk._async_client.AsyncClient.get_token:17\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:19\n#: yadisk._async_client.AsyncClient.refresh_token:15\n#: yadisk._async_client.AsyncClient.revoke_token:14\n#: yadisk._client.Client.get_token:19\n#: yadisk._client.Client.get_token_from_device_code:19\n#: yadisk._client.Client.refresh_token:16 yadisk._client.Client.revoke_token:15\nmsgid \"invalid client ID or client secret\"\nmsgstr \"неправильный идентификатор или пароль приложения\"\n\n#: of yadisk._async_client.AsyncClient.get_device_code:22\n#: yadisk._async_client.AsyncClient.get_token:18\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:20\n#: yadisk._async_client.AsyncClient.refresh_token:16\n#: yadisk._async_client.AsyncClient.revoke_token:17\n#: yadisk._client.Client.get_device_code:22 yadisk._client.Client.get_token:20\n#: yadisk._client.Client.get_token_from_device_code:20\n#: yadisk._client.Client.refresh_token:17 yadisk._client.Client.revoke_token:18\nmsgid \"invalid request parameters\"\nmsgstr \"неправильные параметры запроса\"\n\n#: of yadisk._async_client.AsyncClient.get_device_code:24\n#: yadisk._client.Client.get_device_code:24\nmsgid \"\"\n\":any:`DeviceCodeObject` containing :code:`user_code` and \"\n\":code:`device_code`\"\nmsgstr \"\"\n\":any:`DeviceCodeObject`, содержащий :code:`user_code` и \"\n\":code:`device_code`\"\n\n#: of yadisk._async_client.AsyncClient.get_token:1\n#: yadisk._client.Client.get_token:1\nmsgid \"Get a new token.\"\nmsgstr \"Получает новый токен.\"\n\n#: of yadisk._async_client.AsyncClient.get_token:3\n#: yadisk._client.Client.get_token:3\nmsgid \"confirmation code\"\nmsgstr \"код подтверждения\"\n\n#: of yadisk._async_client.AsyncClient.get_token:5\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:6\n#: yadisk._client.Client.get_token:6\nmsgid \"`str`, verifier code, used with the PKCE authorization flow\"\nmsgstr \"`str`, код верификатора, используемый при авторизации с PKCE\"\n\n#: of yadisk._async_client.AsyncClient.get_token:15\n#: yadisk._client.Client.get_token:17\nmsgid \"confirmation code has invalid format\"\nmsgstr \"неправильный формат кода подтверждения\"\n\n#: of yadisk._async_client.AsyncClient.get_token:16\n#: yadisk._client.Client.get_token:18\nmsgid \"invalid or expired confirmation code\"\nmsgstr \"неправильный или истекший код\"\n\n#: of yadisk._async_client.AsyncClient.get_token:20\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:22\n#: yadisk._async_client.AsyncClient.refresh_token:18\n#: yadisk._client.Client.get_token:22\n#: yadisk._client.Client.get_token_from_device_code:22\n#: yadisk._client.Client.refresh_token:19\nmsgid \":any:`TokenObject`\"\nmsgstr \":any:`TokenObject`\"\n\n#: of yadisk._async_client.AsyncClient.get_token_from_device_code:1\nmsgid \"\"\n\"Get a new token from a device code, previously obtained with \"\n\":any:`AsyncClient.get_device_code()`.\"\nmsgstr \"\"\n\"Получает новый токен с помощью кода устройства (device_code), полученного\"\n\" с помощью :any:`AsyncClient.get_device_code()`\"\n\n#: of yadisk._async_client.AsyncClient.get_token_from_device_code:3\nmsgid \"device code, obtained from :any:`AsyncClient.get_device_code()`\"\nmsgstr \"код устройства, полученный с помощью :any:`AsyncClient.get_device_code()`\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:10\n#: yadisk._async_client.AsyncClient.get_public_available_settings:4\n#: yadisk._async_client.AsyncClient.get_public_settings:6\n#: yadisk._async_client.AsyncClient.get_token_from_device_code:7\n#: yadisk._async_client.AsyncClient.get_upload_link_object:12\n#: yadisk._async_client.AsyncClient.update_public_settings:5\n#: yadisk._async_client.AsyncClient.wait_for_operation:8\n#: yadisk._client.Client.check_token:4 yadisk._client.Client.copy:15\n#: yadisk._client.Client.download:5 yadisk._client.Client.download_by_link:5\n#: yadisk._client.Client.download_public:6 yadisk._client.Client.exists:4\n#: yadisk._client.Client.get_all_public_resources:10\n#: yadisk._client.Client.get_device_code:11\n#: yadisk._client.Client.get_disk_info:5\n#: yadisk._client.Client.get_download_link:4 yadisk._client.Client.get_files:11\n#: yadisk._client.Client.get_last_uploaded:8 yadisk._client.Client.get_meta:10\n#: yadisk._client.Client.get_operation_status:4\n#: yadisk._client.Client.get_public_available_settings:4\n#: yadisk._client.Client.get_public_download_link:5\n#: yadisk._client.Client.get_public_meta:13\n#: yadisk._client.Client.get_public_resources:9\n#: yadisk._client.Client.get_public_settings:6\n#: yadisk._client.Client.get_public_type:5 yadisk._client.Client.get_token:7\n#: yadisk._client.Client.get_token_from_device_code:6\n#: yadisk._client.Client.get_trash_meta:10\n#: yadisk._client.Client.get_trash_type:4 yadisk._client.Client.get_type:4\n#: yadisk._client.Client.get_upload_link:8\n#: yadisk._client.Client.get_upload_link_object:12\n#: yadisk._client.Client.is_dir:4 yadisk._client.Client.is_file:4\n#: yadisk._client.Client.is_public_dir:5 yadisk._client.Client.is_public_file:5\n#: yadisk._client.Client.is_trash_dir:4 yadisk._client.Client.is_trash_file:4\n#: yadisk._client.Client.listdir:10 yadisk._client.Client.makedirs:6\n#: yadisk._client.Client.mkdir:5 yadisk._client.Client.move:12\n#: yadisk._client.Client.patch:6 yadisk._client.Client.public_exists:5\n#: yadisk._client.Client.publish:8 yadisk._client.Client.refresh_token:4\n#: yadisk._client.Client.remove:13 yadisk._client.Client.remove_trash:10\n#: yadisk._client.Client.rename:13 yadisk._client.Client.restore_trash:13\n#: yadisk._client.Client.revoke_token:4 yadisk._client.Client.save_to_disk:15\n#: yadisk._client.Client.trash_exists:4 yadisk._client.Client.trash_listdir:10\n#: yadisk._client.Client.unpublish:5\n#: yadisk._client.Client.update_public_settings:5\n#: yadisk._client.Client.upload:11 yadisk._client.Client.upload_by_link:8\n#: yadisk._client.Client.upload_url:11\n#: yadisk._client.Client.wait_for_operation:8\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:3\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:7\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:3\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:7\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:4\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:10\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:4\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:4\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:4\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:10\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:10\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:18\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:4\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:10\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:4\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:4\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:4\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:10\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:10\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:18\nmsgid \"`float` or `tuple`, request timeout\"\nmsgstr \"`float` или `tuple`, таймаут запроса\"\n\n#: of yadisk._async_client.AsyncClient.get_token_from_device_code:16\n#: yadisk._client.Client.get_token_from_device_code:16\nmsgid \"user has not authorized the application yet\"\nmsgstr \"пользователь ещё не авторизовал приложение\"\n\n#: of yadisk._async_client.AsyncClient.get_token_from_device_code:17\n#: yadisk._client.Client.get_token_from_device_code:17\nmsgid \":code:`device_code` has invalid format\"\nmsgstr \"неправильный формат :code:`device_code`\"\n\n#: of yadisk._async_client.AsyncClient.get_token_from_device_code:18\n#: yadisk._client.Client.get_token_from_device_code:18\nmsgid \"invalid or expired :code:`device_code`\"\nmsgstr \"неправильный или истекший :code:`device_code`\"\n\n#: of yadisk._async_client.AsyncClient.refresh_token:1\n#: yadisk._client.Client.refresh_token:1\nmsgid \"Refresh an existing token.\"\nmsgstr \"Обновляет существующий токен.\"\n\n#: of yadisk._async_client.AsyncClient.refresh_token:3\n#: yadisk._client.Client.refresh_token:3\nmsgid \"the refresh token that was received with the token\"\nmsgstr \"refresh-токен, полученный вместе с токеном\"\n\n#: of yadisk._async_client.AsyncClient.refresh_token:13\n#: yadisk._client.Client.refresh_token:14\nmsgid \"invalid or expired refresh token or it doesn't belong to this application\"\nmsgstr \"\"\n\"неправильный или истекший refresh-токен или он не принадлежит этому \"\n\"приложению\"\n\n#: of yadisk._async_client.AsyncClient.revoke_token:1\n#: yadisk._client.Client.revoke_token:1\nmsgid \"Revoke the token.\"\nmsgstr \"Отзывает токен.\"\n\n#: of yadisk._async_client.AsyncClient.revoke_token:3\nmsgid \"token to revoke, equivalent to `self.token` if `None`\"\nmsgstr \"токен, подлежащий отзыву, то же самое, что `self.token`, если `None`\"\n\n#: of yadisk._async_client.AsyncClient.revoke_token:13\n#: yadisk._client.Client.revoke_token:14\nmsgid \"specified token doesn't belong to this application\"\nmsgstr \"указанный токен не принадлежит данному приложению\"\n\n#: of yadisk._async_client.AsyncClient.revoke_token:15\n#: yadisk._client.Client.revoke_token:16\nmsgid \"token could not be revoked because it doesn't have a :code:`device_id`\"\nmsgstr \"не удалось отозвать токен, потому что у него нет :code:`device_id`\"\n\n#: of yadisk._async_client.AsyncClient.revoke_token:19\n#: yadisk._client.Client.revoke_token:20\nmsgid \":any:`TokenRevokeStatusObject`\"\nmsgstr \":any:`TokenRevokeStatusObject`\"\n\n#: ../../api_reference/async_api.rst:23 ../../api_reference/sync_api.rst:23\nmsgid \"Disk Info\"\nmsgstr \"Информация о диске\"\n\n#: of yadisk._async_client.AsyncClient.get_disk_info:1\n#: yadisk._client.Client.get_disk_info:1\nmsgid \"Get disk information.\"\nmsgstr \"Получает информацию о диске.\"\n\n#: of yadisk._async_client.AsyncClient.get_disk_info:3\n#: yadisk._client.Client.get_disk_info:3\nmsgid \"list of additional keys to be included in the response\"\nmsgstr \"список дополнительных ключей, которые будут включены в ответ\"\n\n#: of yadisk._async_client.AsyncClient.copy:10\n#: yadisk._async_client.AsyncClient.get_all_public_resources:9\n#: yadisk._async_client.AsyncClient.get_disk_info:4\n#: yadisk._async_client.AsyncClient.get_files:10\n#: yadisk._async_client.AsyncClient.get_last_uploaded:7\n#: yadisk._async_client.AsyncClient.get_meta:9\n#: yadisk._async_client.AsyncClient.get_public_meta:12\n#: yadisk._async_client.AsyncClient.get_public_resources:8\n#: yadisk._async_client.AsyncClient.get_trash_meta:9\n#: yadisk._async_client.AsyncClient.get_upload_link_object:8\n#: yadisk._async_client.AsyncClient.listdir:9\n#: yadisk._async_client.AsyncClient.makedirs:5\n#: yadisk._async_client.AsyncClient.mkdir:4\n#: yadisk._async_client.AsyncClient.move:7\n#: yadisk._async_client.AsyncClient.patch:5\n#: yadisk._async_client.AsyncClient.publish:7\n#: yadisk._async_client.AsyncClient.remove:8\n#: yadisk._async_client.AsyncClient.remove_trash:5\n#: yadisk._async_client.AsyncClient.rename:8\n#: yadisk._async_client.AsyncClient.restore_trash:8\n#: yadisk._async_client.AsyncClient.save_to_disk:10\n#: yadisk._async_client.AsyncClient.trash_listdir:9\n#: yadisk._async_client.AsyncClient.unpublish:6\n#: yadisk._async_client.AsyncClient.upload_url:6 yadisk._client.Client.copy:10\n#: yadisk._client.Client.get_all_public_resources:9\n#: yadisk._client.Client.get_disk_info:4 yadisk._client.Client.get_files:10\n#: yadisk._client.Client.get_last_uploaded:7 yadisk._client.Client.get_meta:9\n#: yadisk._client.Client.get_public_meta:12\n#: yadisk._client.Client.get_public_resources:8\n#: yadisk._client.Client.get_trash_meta:9\n#: yadisk._client.Client.get_upload_link_object:8\n#: yadisk._client.Client.listdir:9 yadisk._client.Client.makedirs:5\n#: yadisk._client.Client.mkdir:4 yadisk._client.Client.move:7\n#: yadisk._client.Client.patch:5 yadisk._client.Client.publish:7\n#: yadisk._client.Client.remove:12 yadisk._client.Client.remove_trash:5\n#: yadisk._client.Client.rename:8 yadisk._client.Client.restore_trash:8\n#: yadisk._client.Client.save_to_disk:10 yadisk._client.Client.trash_listdir:9\n#: yadisk._client.Client.unpublish:4 yadisk._client.Client.upload_url:6\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:9\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:9\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:5\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:13\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:9\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:9\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:5\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:13\nmsgid \"list of keys to be included in the response\"\nmsgstr \"список ключей, которые будут включены в ответ\"\n\n#: of yadisk._async_client.AsyncClient.copy:26\n#: yadisk._async_client.AsyncClient.download:15\n#: yadisk._async_client.AsyncClient.download_public:16\n#: yadisk._async_client.AsyncClient.exists:13\n#: yadisk._async_client.AsyncClient.get_all_public_resources:20\n#: yadisk._async_client.AsyncClient.get_disk_info:14\n#: yadisk._async_client.AsyncClient.get_download_link:14\n#: yadisk._async_client.AsyncClient.get_files:20\n#: yadisk._async_client.AsyncClient.get_last_uploaded:17\n#: yadisk._async_client.AsyncClient.get_meta:20\n#: yadisk._async_client.AsyncClient.get_public_available_settings:14\n#: yadisk._async_client.AsyncClient.get_public_download_link:15\n#: yadisk._async_client.AsyncClient.get_public_meta:23\n#: yadisk._async_client.AsyncClient.get_public_resources:18\n#: yadisk._async_client.AsyncClient.get_public_settings:16\n#: yadisk._async_client.AsyncClient.get_public_type:15\n#: yadisk._async_client.AsyncClient.get_trash_meta:20\n#: yadisk._async_client.AsyncClient.get_trash_type:14\n#: yadisk._async_client.AsyncClient.get_type:14\n#: yadisk._async_client.AsyncClient.get_upload_link:19\n#: yadisk._async_client.AsyncClient.get_upload_link_object:23\n#: yadisk._async_client.AsyncClient.is_dir:13\n#: yadisk._async_client.AsyncClient.is_file:13\n#: yadisk._async_client.AsyncClient.is_public_dir:14\n#: yadisk._async_client.AsyncClient.is_public_file:14\n#: yadisk._async_client.AsyncClient.is_trash_dir:13\n#: yadisk._async_client.AsyncClient.is_trash_file:13\n#: yadisk._async_client.AsyncClient.listdir:20\n#: yadisk._async_client.AsyncClient.makedirs:17\n#: yadisk._async_client.AsyncClient.mkdir:17\n#: yadisk._async_client.AsyncClient.move:23\n#: yadisk._async_client.AsyncClient.patch:16\n#: yadisk._async_client.AsyncClient.public_exists:14\n#: yadisk._async_client.AsyncClient.publish:18\n#: yadisk._async_client.AsyncClient.remove:23\n#: yadisk._async_client.AsyncClient.remove_trash:20\n#: yadisk._async_client.AsyncClient.rename:24\n#: yadisk._async_client.AsyncClient.restore_trash:24\n#: yadisk._async_client.AsyncClient.save_to_disk:25\n#: yadisk._async_client.AsyncClient.trash_exists:13\n#: yadisk._async_client.AsyncClient.trash_listdir:20\n#: yadisk._async_client.AsyncClient.unpublish:17\n#: yadisk._async_client.AsyncClient.update_public_settings:15\n#: yadisk._async_client.AsyncClient.upload:22\n#: yadisk._async_client.AsyncClient.upload_url:23 yadisk._client.Client.copy:27\n#: yadisk._client.Client.download:16 yadisk._client.Client.download_public:17\n#: yadisk._client.Client.exists:14\n#: yadisk._client.Client.get_all_public_resources:20\n#: yadisk._client.Client.get_disk_info:15\n#: yadisk._client.Client.get_download_link:15\n#: yadisk._client.Client.get_files:21\n#: yadisk._client.Client.get_last_uploaded:18 yadisk._client.Client.get_meta:21\n#: yadisk._client.Client.get_public_available_settings:15\n#: yadisk._client.Client.get_public_download_link:16\n#: yadisk._client.Client.get_public_meta:24\n#: yadisk._client.Client.get_public_resources:19\n#: yadisk._client.Client.get_public_settings:17\n#: yadisk._client.Client.get_public_type:16\n#: yadisk._client.Client.get_trash_meta:21\n#: yadisk._client.Client.get_trash_type:15 yadisk._client.Client.get_type:15\n#: yadisk._client.Client.get_upload_link:20\n#: yadisk._client.Client.get_upload_link_object:24\n#: yadisk._client.Client.is_dir:14 yadisk._client.Client.is_file:14\n#: yadisk._client.Client.is_public_dir:15\n#: yadisk._client.Client.is_public_file:15\n#: yadisk._client.Client.is_trash_dir:14 yadisk._client.Client.is_trash_file:14\n#: yadisk._client.Client.listdir:21 yadisk._client.Client.makedirs:18\n#: yadisk._client.Client.mkdir:18 yadisk._client.Client.move:24\n#: yadisk._client.Client.patch:17 yadisk._client.Client.public_exists:15\n#: yadisk._client.Client.publish:19 yadisk._client.Client.remove:24\n#: yadisk._client.Client.remove_trash:21 yadisk._client.Client.rename:25\n#: yadisk._client.Client.restore_trash:25 yadisk._client.Client.save_to_disk:26\n#: yadisk._client.Client.trash_exists:14 yadisk._client.Client.trash_listdir:21\n#: yadisk._client.Client.unpublish:16\n#: yadisk._client.Client.update_public_settings:16\n#: yadisk._client.Client.upload:24 yadisk._client.Client.upload_url:24\n#: yadisk.objects._resources.AsyncTrashResourceObject.exists:13\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:20\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:14\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:13\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:13\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:20\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:20\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:29\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:14\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:21\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:15\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:14\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:14\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:21\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:21\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:30\nmsgid \"application doesn't have enough rights for this request\"\nmsgstr \"у приложения не хватает прав, чтобы выполнить данный запрос\"\n\n#: of yadisk._async_client.AsyncClient.copy:36\n#: yadisk._async_client.AsyncClient.get_all_public_resources:22\n#: yadisk._async_client.AsyncClient.get_disk_info:16\n#: yadisk._async_client.AsyncClient.get_download_link:17\n#: yadisk._async_client.AsyncClient.get_files:22\n#: yadisk._async_client.AsyncClient.get_last_uploaded:19\n#: yadisk._async_client.AsyncClient.get_operation_status:15\n#: yadisk._async_client.AsyncClient.get_public_available_settings:17\n#: yadisk._async_client.AsyncClient.get_public_download_link:18\n#: yadisk._async_client.AsyncClient.get_public_meta:25\n#: yadisk._async_client.AsyncClient.get_public_resources:20\n#: yadisk._async_client.AsyncClient.get_public_settings:19\n#: yadisk._async_client.AsyncClient.get_trash_meta:22\n#: yadisk._async_client.AsyncClient.get_upload_link:24\n#: yadisk._async_client.AsyncClient.mkdir:20\n#: yadisk._async_client.AsyncClient.move:31\n#: yadisk._async_client.AsyncClient.patch:19\n#: yadisk._async_client.AsyncClient.publish:21\n#: yadisk._async_client.AsyncClient.remove:32\n#: yadisk._async_client.AsyncClient.remove_trash:28\n#: yadisk._async_client.AsyncClient.restore_trash:32\n#: yadisk._async_client.AsyncClient.save_to_disk:35\n#: yadisk._async_client.AsyncClient.unpublish:20\n#: yadisk._async_client.AsyncClient.update_public_settings:18\n#: yadisk._async_client.AsyncClient.upload_url:32 yadisk._client.Client.copy:37\n#: yadisk._client.Client.get_all_public_resources:22\n#: yadisk._client.Client.get_disk_info:17\n#: yadisk._client.Client.get_download_link:18\n#: yadisk._client.Client.get_files:23\n#: yadisk._client.Client.get_last_uploaded:20 yadisk._client.Client.get_meta:23\n#: yadisk._client.Client.get_operation_status:16\n#: yadisk._client.Client.get_public_available_settings:18\n#: yadisk._client.Client.get_public_download_link:19\n#: yadisk._client.Client.get_public_meta:26\n#: yadisk._client.Client.get_public_resources:21\n#: yadisk._client.Client.get_public_settings:20\n#: yadisk._client.Client.get_trash_meta:23\n#: yadisk._client.Client.get_upload_link:25 yadisk._client.Client.mkdir:21\n#: yadisk._client.Client.move:32 yadisk._client.Client.patch:20\n#: yadisk._client.Client.publish:22 yadisk._client.Client.remove:33\n#: yadisk._client.Client.remove_trash:29 yadisk._client.Client.restore_trash:33\n#: yadisk._client.Client.save_to_disk:36 yadisk._client.Client.unpublish:19\n#: yadisk._client.Client.update_public_settings:19\n#: yadisk._client.Client.upload_url:33\nmsgid \"More info about this request:\"\nmsgstr \"Дополнительная информация о данном запросе:\"\n\n#: of yadisk._async_client.AsyncClient.get_disk_info:18\n#: yadisk._client.Client.get_disk_info:19\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-\"\n\"api/doc/en/reference/capacity>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/capacity>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_disk_info:19\n#: yadisk._client.Client.get_disk_info:20\nmsgid \"`Polygon <https://yandex.com/dev/disk/poligon#!/v147disk/GetDisk>`__\"\nmsgstr \"`Полигон <https://yandex.ru/dev/disk/poligon#!/v147disk/GetDisk>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_disk_info:21\n#: yadisk._client.Client.get_disk_info:22\nmsgid \":any:`DiskInfoObject`\"\nmsgstr \":any:`DiskInfoObject`\"\n\n#: ../../api_reference/async_api.rst:28 ../../api_reference/sync_api.rst:28\nmsgid \"Metadata About Files\"\nmsgstr \"Метаданные о файлах\"\n\n#: of yadisk._async_client.AsyncClient.get_meta:1\n#: yadisk._client.Client.get_meta:1\nmsgid \"Get meta information about a file/directory.\"\nmsgstr \"Получает мета-информацию о ресурсе.\"\n\n#: of yadisk._async_client.AsyncClient.exists:3\n#: yadisk._async_client.AsyncClient.get_download_link:3\n#: yadisk._async_client.AsyncClient.get_meta:3\n#: yadisk._async_client.AsyncClient.get_public_available_settings:3\n#: yadisk._async_client.AsyncClient.get_public_settings:3\n#: yadisk._async_client.AsyncClient.get_type:3\n#: yadisk._async_client.AsyncClient.is_dir:3\n#: yadisk._async_client.AsyncClient.is_file:3\n#: yadisk._async_client.AsyncClient.patch:3\n#: yadisk._async_client.AsyncClient.update_public_settings:3\n#: yadisk._client.Client.exists:3 yadisk._client.Client.get_download_link:3\n#: yadisk._client.Client.get_meta:3\n#: yadisk._client.Client.get_public_available_settings:3\n#: yadisk._client.Client.get_public_settings:3 yadisk._client.Client.get_type:3\n#: yadisk._client.Client.is_dir:3 yadisk._client.Client.is_file:3\n#: yadisk._client.Client.patch:3 yadisk._client.Client.update_public_settings:3\nmsgid \"path to the resource\"\nmsgstr \"путь к ресурсу\"\n\n#: of yadisk._async_client.AsyncClient.get_meta:4\n#: yadisk._async_client.AsyncClient.get_trash_meta:4\n#: yadisk._async_client.AsyncClient.listdir:5\n#: yadisk._async_client.AsyncClient.trash_listdir:5\n#: yadisk._client.Client.get_meta:4 yadisk._client.Client.get_trash_meta:4\n#: yadisk._client.Client.listdir:5 yadisk._client.Client.trash_listdir:5\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:4\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:5\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:4\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:5\nmsgid \"number of children resources to be included in the response\"\nmsgstr \"количество ресурсов в папке, которые будут включены в ответ\"\n\n#: of yadisk._async_client.AsyncClient.get_meta:5\n#: yadisk._async_client.AsyncClient.get_trash_meta:5\n#: yadisk._async_client.AsyncClient.listdir:6\n#: yadisk._async_client.AsyncClient.trash_listdir:6\n#: yadisk._client.Client.get_meta:5 yadisk._client.Client.get_trash_meta:5\n#: yadisk._client.Client.listdir:6 yadisk._client.Client.trash_listdir:6\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:5\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:6\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:5\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:6\nmsgid \"number of children resources to be skipped in the response\"\nmsgstr \"количество ресурсов в папке, которые будут пропущены\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:6\n#: yadisk._async_client.AsyncClient.get_files:8\n#: yadisk._async_client.AsyncClient.get_last_uploaded:5\n#: yadisk._async_client.AsyncClient.get_meta:6\n#: yadisk._async_client.AsyncClient.get_public_resources:5\n#: yadisk._async_client.AsyncClient.get_trash_meta:6\n#: yadisk._async_client.AsyncClient.listdir:7\n#: yadisk._async_client.AsyncClient.trash_listdir:7\n#: yadisk._client.Client.get_all_public_resources:6\n#: yadisk._client.Client.get_files:8 yadisk._client.Client.get_last_uploaded:5\n#: yadisk._client.Client.get_meta:6\n#: yadisk._client.Client.get_public_resources:5\n#: yadisk._client.Client.get_trash_meta:6 yadisk._client.Client.listdir:7\n#: yadisk._client.Client.trash_listdir:7\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:6\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:7\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:6\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:7\nmsgid \"size of the file preview\"\nmsgstr \"размер превью файла\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:7\n#: yadisk._async_client.AsyncClient.get_files:9\n#: yadisk._async_client.AsyncClient.get_last_uploaded:6\n#: yadisk._async_client.AsyncClient.get_meta:7\n#: yadisk._async_client.AsyncClient.get_public_resources:6\n#: yadisk._async_client.AsyncClient.get_trash_meta:7\n#: yadisk._async_client.AsyncClient.listdir:8\n#: yadisk._async_client.AsyncClient.trash_listdir:8\n#: yadisk._client.Client.get_all_public_resources:7\n#: yadisk._client.Client.get_files:9 yadisk._client.Client.get_last_uploaded:6\n#: yadisk._client.Client.get_meta:7\n#: yadisk._client.Client.get_public_resources:6\n#: yadisk._client.Client.get_trash_meta:7 yadisk._client.Client.listdir:8\n#: yadisk._client.Client.trash_listdir:8\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:7\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:8\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:7\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:8\nmsgid \"`bool`, cut the preview to the size specified in the `preview_size`\"\nmsgstr \"`bool`, обрезает превью согласно размеру, заданному в `preview_size`\"\n\n#: of yadisk._async_client.AsyncClient.get_files:7\n#: yadisk._async_client.AsyncClient.get_meta:8\n#: yadisk._async_client.AsyncClient.get_public_meta:9\n#: yadisk._async_client.AsyncClient.get_trash_meta:8\n#: yadisk._client.Client.get_files:7 yadisk._client.Client.get_meta:8\n#: yadisk._client.Client.get_public_meta:9\n#: yadisk._client.Client.get_trash_meta:8\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:8\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:8\nmsgid \"`str`, field to be used as a key to sort children resources\"\nmsgstr \"`str`, поле используемое для сортировки вложенных ресурсов\"\n\n#: of yadisk._async_client.AsyncClient.copy:24\n#: yadisk._async_client.AsyncClient.download:14\n#: yadisk._async_client.AsyncClient.download_public:15\n#: yadisk._async_client.AsyncClient.get_download_link:13\n#: yadisk._async_client.AsyncClient.get_meta:19\n#: yadisk._async_client.AsyncClient.get_public_available_settings:13\n#: yadisk._async_client.AsyncClient.get_public_download_link:14\n#: yadisk._async_client.AsyncClient.get_public_meta:22\n#: yadisk._async_client.AsyncClient.get_public_settings:15\n#: yadisk._async_client.AsyncClient.get_public_type:14\n#: yadisk._async_client.AsyncClient.get_trash_meta:19\n#: yadisk._async_client.AsyncClient.get_trash_type:13\n#: yadisk._async_client.AsyncClient.get_type:13\n#: yadisk._async_client.AsyncClient.listdir:19\n#: yadisk._async_client.AsyncClient.move:21\n#: yadisk._async_client.AsyncClient.patch:15\n#: yadisk._async_client.AsyncClient.publish:17\n#: yadisk._async_client.AsyncClient.remove:22\n#: yadisk._async_client.AsyncClient.remove_trash:19\n#: yadisk._async_client.AsyncClient.rename:22\n#: yadisk._async_client.AsyncClient.restore_trash:22\n#: yadisk._async_client.AsyncClient.save_to_disk:24\n#: yadisk._async_client.AsyncClient.trash_listdir:19\n#: yadisk._async_client.AsyncClient.unpublish:16\n#: yadisk._async_client.AsyncClient.update_public_settings:14\n#: yadisk._client.Client.copy:25 yadisk._client.Client.download:15\n#: yadisk._client.Client.download_public:16\n#: yadisk._client.Client.get_download_link:14 yadisk._client.Client.get_meta:20\n#: yadisk._client.Client.get_public_available_settings:14\n#: yadisk._client.Client.get_public_download_link:15\n#: yadisk._client.Client.get_public_meta:23\n#: yadisk._client.Client.get_public_settings:16\n#: yadisk._client.Client.get_public_type:15\n#: yadisk._client.Client.get_trash_meta:20\n#: yadisk._client.Client.get_trash_type:14 yadisk._client.Client.get_type:14\n#: yadisk._client.Client.listdir:20 yadisk._client.Client.move:22\n#: yadisk._client.Client.patch:16 yadisk._client.Client.publish:18\n#: yadisk._client.Client.remove:23 yadisk._client.Client.remove_trash:20\n#: yadisk._client.Client.rename:23 yadisk._client.Client.restore_trash:23\n#: yadisk._client.Client.save_to_disk:25 yadisk._client.Client.trash_listdir:20\n#: yadisk._client.Client.unpublish:15\n#: yadisk._client.Client.update_public_settings:15\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:19\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:13\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:19\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:19\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:27\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:20\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:14\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:20\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:20\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:28\nmsgid \"resource was not found on Disk\"\nmsgstr \"ресурс не был найден на Диске\"\n\n#: of yadisk._async_client.AsyncClient.get_meta:22\n#: yadisk._async_client.AsyncClient.get_trash_meta:24\n#: yadisk._client.Client.get_meta:25 yadisk._client.Client.get_trash_meta:25\nmsgid \"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/meta>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/meta>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_meta:23\n#: yadisk._client.Client.get_meta:26\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/GetResource>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_meta:25\n#: yadisk._async_client.AsyncClient.patch:24\nmsgid \":any:`AsyncResourceObject`\"\nmsgstr \":any:`AsyncResourceObject`\"\n\n#: of yadisk._async_client.AsyncClient.listdir:1\n#: yadisk._client.Client.listdir:1\nmsgid \"Get contents of `path`.\"\nmsgstr \"Получает содержимое `path`.\"\n\n#: of yadisk._async_client.AsyncClient.listdir:3\n#: yadisk._client.Client.listdir:3\nmsgid \"path to the directory\"\nmsgstr \"путь к папке\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:3\n#: yadisk._async_client.AsyncClient.get_files:4\n#: yadisk._async_client.AsyncClient.listdir:4\n#: yadisk._async_client.AsyncClient.trash_listdir:4\n#: yadisk._client.Client.get_all_public_resources:3\n#: yadisk._client.Client.get_files:4 yadisk._client.Client.listdir:4\n#: yadisk._client.Client.trash_listdir:4\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:4\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:4\nmsgid \"`int` or `None`, maximum number of returned items (`None` means unlimited)\"\nmsgstr \"\"\n\"`int` или `None`, максимальное число возвращаемых элементов в списке \"\n\"(`None` означает неограниченное число)\"\n\n#: of yadisk._async_client.AsyncClient.listdir:21\n#: yadisk._async_client.AsyncClient.trash_listdir:21\n#: yadisk._client.Client.listdir:22 yadisk._client.Client.trash_listdir:22\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:21\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:22\nmsgid \"resource is not a directory\"\nmsgstr \"указанный ресурс не является папкой\"\n\n#: of yadisk._async_client.AsyncClient.get_files:27\n#: yadisk._async_client.AsyncClient.get_last_uploaded:24\n#: yadisk._async_client.AsyncClient.listdir:23\nmsgid \"async generator of :any:`AsyncResourceObject`\"\nmsgstr \"асинхронный генератор :any:`AsyncResourceObject`\"\n\n#: of yadisk._async_client.AsyncClient.exists:1 yadisk._client.Client.exists:1\nmsgid \"Check whether `path` exists.\"\nmsgstr \"Проверяет, существует ли `path`.\"\n\n#: of yadisk._async_client.AsyncClient.get_type:1\n#: yadisk._client.Client.get_type:1\nmsgid \"Get resource type.\"\nmsgstr \"Получает тип ресурса\"\n\n#: of yadisk._async_client.AsyncClient.get_public_type:17\n#: yadisk._async_client.AsyncClient.get_trash_type:16\n#: yadisk._async_client.AsyncClient.get_type:16\n#: yadisk._client.Client.get_public_type:18\n#: yadisk._client.Client.get_trash_type:17 yadisk._client.Client.get_type:17\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:16\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:17\nmsgid \"\\\"file\\\" or \\\"dir\\\"\"\nmsgstr \"\\\"file\\\" или \\\"dir\\\"\"\n\n#: of yadisk._async_client.AsyncClient.is_file:1\n#: yadisk._client.Client.is_file:1\nmsgid \"Check whether `path` is a file.\"\nmsgstr \"Проверяет, является ли `path` файлом.\"\n\n#: of yadisk._async_client.AsyncClient.is_file:15\n#: yadisk._client.Client.is_file:16 yadisk._client.Client.is_trash_file:16\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:15\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:16\nmsgid \"`True` if `path` is a file, `False` otherwise (even if it doesn't exist)\"\nmsgstr \"\"\n\"`True`, если `path` является файлом, `False`, в остальных случаях (даже \"\n\"если ресурс не существует)\"\n\n#: of yadisk._async_client.AsyncClient.is_dir:1 yadisk._client.Client.is_dir:1\nmsgid \"Check whether `path` is a directory.\"\nmsgstr \"Проверяет, является ли `path` папкой.\"\n\n#: of yadisk._async_client.AsyncClient.is_dir:15\n#: yadisk._async_client.AsyncClient.is_trash_dir:15\n#: yadisk._async_client.AsyncClient.is_trash_file:15\n#: yadisk._client.Client.is_dir:16 yadisk._client.Client.is_trash_dir:16\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:15\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:16\nmsgid \"\"\n\"`True` if `path` is a directory, `False` otherwise (even if it doesn't \"\n\"exist)\"\nmsgstr \"\"\n\"`True`, если `path` является папкой, `False`, в остальных случаях (даже \"\n\"если ресурс не существует)\"\n\n#: of yadisk._async_client.AsyncClient.get_files:1\n#: yadisk._client.Client.get_files:1\nmsgid \"Get a flat list of all files (that doesn't include directories).\"\nmsgstr \"Получить плоский список всех файлов (без папок).\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:4\n#: yadisk._async_client.AsyncClient.get_files:3\n#: yadisk._async_client.AsyncClient.get_public_resources:3\n#: yadisk._client.Client.get_all_public_resources:4\n#: yadisk._client.Client.get_files:3\n#: yadisk._client.Client.get_public_resources:3\nmsgid \"offset from the beginning of the list\"\nmsgstr \"отступ от начала списка\"\n\n#: of yadisk._async_client.AsyncClient.get_files:5\n#: yadisk._client.Client.get_files:5\nmsgid \"number of list elements to be included in each response\"\nmsgstr \"максимальное количество элементов списка в каждом запросе\"\n\n#: of yadisk._async_client.AsyncClient.get_files:6\n#: yadisk._async_client.AsyncClient.get_last_uploaded:4\n#: yadisk._client.Client.get_files:6 yadisk._client.Client.get_last_uploaded:4\nmsgid \"type of files to include in the list\"\nmsgstr \"тип файлов, которые будут включены в список\"\n\n#: of yadisk._async_client.AsyncClient.get_files:24\n#: yadisk._client.Client.get_files:25\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/all-\"\n\"files>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/all-files>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_files:25\n#: yadisk._client.Client.get_files:26\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetFlatFilesList>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/GetFlatFilesList>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_last_uploaded:1\n#: yadisk._client.Client.get_last_uploaded:1\nmsgid \"Get the list of latest uploaded files sorted by upload date.\"\nmsgstr \"\"\n\"Получает список последних загруженных файлов, отсортированный по дате \"\n\"загрузки.\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:5\n#: yadisk._async_client.AsyncClient.get_last_uploaded:3\n#: yadisk._async_client.AsyncClient.get_public_resources:4\n#: yadisk._client.Client.get_all_public_resources:5\n#: yadisk._client.Client.get_last_uploaded:3\n#: yadisk._client.Client.get_public_resources:4\nmsgid \"maximum number of elements in the list\"\nmsgstr \"максимальное число элементов в списке\"\n\n#: of yadisk._async_client.AsyncClient.get_last_uploaded:21\n#: yadisk._client.Client.get_last_uploaded:22\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/recent-\"\n\"upload>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/recent-upload>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_last_uploaded:22\n#: yadisk._client.Client.get_last_uploaded:23\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetLastUploadedFilesList>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/GetLastUploadedFilesList>`__\"\n\n#: ../../api_reference/async_api.rst:40 ../../api_reference/sync_api.rst:40\nmsgid \"Uploading Files\"\nmsgstr \"Загрузка файлов на Диск\"\n\n#: of yadisk._async_client.AsyncClient.upload:1 yadisk._client.Client.upload:1\nmsgid \"Upload a file to disk.\"\nmsgstr \"Загружает файл на диск.\"\n\n#: of yadisk._async_client.AsyncClient.upload:3\n#: yadisk._async_client.AsyncClient.upload_by_link:3\nmsgid \"path, file-like object or an async generator function to be uploaded\"\nmsgstr \"\"\n\"путь к файлу, файл-подобный объект или функция, возвращающая асинхронный \"\n\"генератор для загрузки\"\n\n#: of yadisk._async_client.AsyncClient.copy:6\n#: yadisk._async_client.AsyncClient.get_upload_link:3\n#: yadisk._async_client.AsyncClient.get_upload_link_object:6\n#: yadisk._async_client.AsyncClient.move:4\n#: yadisk._async_client.AsyncClient.restore_trash:5\n#: yadisk._async_client.AsyncClient.upload:4\n#: yadisk._async_client.AsyncClient.upload_url:4 yadisk._client.Client.copy:6\n#: yadisk._client.Client.get_upload_link:3\n#: yadisk._client.Client.get_upload_link_object:6 yadisk._client.Client.move:4\n#: yadisk._client.Client.restore_trash:5 yadisk._client.Client.upload:5\n#: yadisk._client.Client.upload_url:4\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:10\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:10\nmsgid \"destination path\"\nmsgstr \"путь назначения\"\n\n#: of yadisk._async_client.AsyncClient.upload:5\n#: yadisk._async_client.AsyncClient.upload_by_link:5\n#: yadisk._client.Client.upload:6 yadisk._client.Client.upload_by_link:6\nmsgid \"\"\n\"if `True`, the resource will be overwritten if it already exists, an \"\n\"error will be raised otherwise\"\nmsgstr \"\"\n\"если `True`, путь назначения может быть перезаписан, иначе будет вызвана \"\n\"ошибка\"\n\n#: of yadisk._async_client.AsyncClient.get_upload_link:5\n#: yadisk._async_client.AsyncClient.get_upload_link_object:9\n#: yadisk._async_client.AsyncClient.upload:7\n#: yadisk._client.Client.get_upload_link:5\n#: yadisk._client.Client.get_upload_link_object:9\n#: yadisk._client.Client.upload:8\nmsgid \"\"\n\"`bool`, if `True` (default), the `User-Agent` header will be set to a \"\n\"special value, which should allow bypassing of Yandex.Disk's upload speed\"\n\" limit\"\nmsgstr \"\"\n\"`bool`, если `True` (по умолчанию), будет задано специальное значение \"\n\"заголовка `User-Agent`, которое должно позволить обходить ограничение \"\n\"скорости загрузки файлов на Диск\"\n\n#: of yadisk._async_client.AsyncClient.get_upload_link:17\n#: yadisk._async_client.AsyncClient.get_upload_link_object:21\n#: yadisk._async_client.AsyncClient.mkdir:14\n#: yadisk._async_client.AsyncClient.upload:19\n#: yadisk._async_client.AsyncClient.upload_url:20\n#: yadisk._client.Client.get_upload_link:18\n#: yadisk._client.Client.get_upload_link_object:22\n#: yadisk._client.Client.mkdir:15 yadisk._client.Client.upload:21\n#: yadisk._client.Client.upload_url:21\nmsgid \"parent directory doesn't exist\"\nmsgstr \"родительская папка не существует\"\n\n#: of yadisk._async_client.AsyncClient.copy:25\n#: yadisk._async_client.AsyncClient.get_upload_link:18\n#: yadisk._async_client.AsyncClient.get_upload_link_object:22\n#: yadisk._async_client.AsyncClient.makedirs:15\n#: yadisk._async_client.AsyncClient.mkdir:15\n#: yadisk._async_client.AsyncClient.move:22\n#: yadisk._async_client.AsyncClient.rename:23\n#: yadisk._async_client.AsyncClient.restore_trash:23\n#: yadisk._async_client.AsyncClient.upload:20\n#: yadisk._async_client.AsyncClient.upload_url:21 yadisk._client.Client.copy:26\n#: yadisk._client.Client.get_upload_link:19\n#: yadisk._client.Client.get_upload_link_object:23\n#: yadisk._client.Client.makedirs:16 yadisk._client.Client.mkdir:16\n#: yadisk._client.Client.move:23 yadisk._client.Client.rename:24\n#: yadisk._client.Client.restore_trash:24 yadisk._client.Client.upload:22\n#: yadisk._client.Client.upload_url:22\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:28\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:29\nmsgid \"destination path already exists\"\nmsgstr \"путь назначения уже существует\"\n\n#: of yadisk._async_client.AsyncClient.get_upload_link:21\n#: yadisk._async_client.AsyncClient.get_upload_link_object:25\n#: yadisk._async_client.AsyncClient.save_to_disk:27\n#: yadisk._async_client.AsyncClient.upload:21\n#: yadisk._async_client.AsyncClient.upload_by_link:16\n#: yadisk._async_client.AsyncClient.upload_url:22\n#: yadisk._client.Client.get_upload_link:22\n#: yadisk._client.Client.get_upload_link_object:26\n#: yadisk._client.Client.save_to_disk:28 yadisk._client.Client.upload:23\n#: yadisk._client.Client.upload_by_link:18 yadisk._client.Client.upload_url:23\nmsgid \"cannot upload file due to lack of storage space\"\nmsgstr \"невозможно загрузить файл из-за нехватки места на Диске\"\n\n#: of yadisk._async_client.AsyncClient.copy:28\n#: yadisk._async_client.AsyncClient.download:16\n#: yadisk._async_client.AsyncClient.download_public:17\n#: yadisk._async_client.AsyncClient.get_download_link:15\n#: yadisk._async_client.AsyncClient.get_public_available_settings:15\n#: yadisk._async_client.AsyncClient.get_public_download_link:16\n#: yadisk._async_client.AsyncClient.get_public_settings:17\n#: yadisk._async_client.AsyncClient.get_upload_link:20\n#: yadisk._async_client.AsyncClient.get_upload_link_object:24\n#: yadisk._async_client.AsyncClient.makedirs:18\n#: yadisk._async_client.AsyncClient.mkdir:18\n#: yadisk._async_client.AsyncClient.move:24\n#: yadisk._async_client.AsyncClient.patch:17\n#: yadisk._async_client.AsyncClient.publish:19\n#: yadisk._async_client.AsyncClient.remove:25\n#: yadisk._async_client.AsyncClient.remove_trash:21\n#: yadisk._async_client.AsyncClient.rename:25\n#: yadisk._async_client.AsyncClient.restore_trash:25\n#: yadisk._async_client.AsyncClient.save_to_disk:26\n#: yadisk._async_client.AsyncClient.unpublish:18\n#: yadisk._async_client.AsyncClient.update_public_settings:16\n#: yadisk._async_client.AsyncClient.upload:23\n#: yadisk._async_client.AsyncClient.upload_url:24 yadisk._client.Client.copy:29\n#: yadisk._client.Client.download:17 yadisk._client.Client.download_public:18\n#: yadisk._client.Client.get_download_link:16\n#: yadisk._client.Client.get_public_available_settings:16\n#: yadisk._client.Client.get_public_download_link:17\n#: yadisk._client.Client.get_public_settings:18\n#: yadisk._client.Client.get_upload_link:21\n#: yadisk._client.Client.get_upload_link_object:25\n#: yadisk._client.Client.makedirs:19 yadisk._client.Client.mkdir:19\n#: yadisk._client.Client.move:25 yadisk._client.Client.patch:18\n#: yadisk._client.Client.publish:20 yadisk._client.Client.remove:26\n#: yadisk._client.Client.remove_trash:22 yadisk._client.Client.rename:26\n#: yadisk._client.Client.restore_trash:26 yadisk._client.Client.save_to_disk:27\n#: yadisk._client.Client.unpublish:17\n#: yadisk._client.Client.update_public_settings:17\n#: yadisk._client.Client.upload:25 yadisk._client.Client.upload_url:25\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:21\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:30\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:22\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:31\nmsgid \"resource is locked by another request\"\nmsgstr \"запрашиваемый ресурс заблокирован другой операцией\"\n\n#: of yadisk._async_client.AsyncClient.copy:29\n#: yadisk._async_client.AsyncClient.get_upload_link:22\n#: yadisk._async_client.AsyncClient.get_upload_link_object:26\n#: yadisk._async_client.AsyncClient.save_to_disk:28\n#: yadisk._async_client.AsyncClient.upload:24\n#: yadisk._async_client.AsyncClient.upload_url:25 yadisk._client.Client.copy:30\n#: yadisk._client.Client.get_upload_link:23\n#: yadisk._client.Client.get_upload_link_object:27\n#: yadisk._client.Client.save_to_disk:29 yadisk._client.Client.upload:26\n#: yadisk._client.Client.upload_url:26\nmsgid \"upload limit has been exceeded\"\nmsgstr \"достигнут лимит на загрузку файлов\"\n\n#: of yadisk._async_client.AsyncClient.upload:26\nmsgid \":any:`AsyncResourceLinkObject`, link to the destination resource\"\nmsgstr \":any:`AsyncResourceLinkObject`, ссылка на загруженный ресурс\"\n\n#: of yadisk._async_client.AsyncClient.get_upload_link:1\n#: yadisk._client.Client.get_upload_link:1\nmsgid \"Get a link to upload the file using the PUT request.\"\nmsgstr \"Получает ссылку для загрузки файла на диск при помощи PUT запроса.\"\n\n#: of yadisk._async_client.AsyncClient.get_upload_link:4\n#: yadisk._async_client.AsyncClient.get_upload_link_object:7\n#: yadisk._async_client.AsyncClient.move:5\n#: yadisk._async_client.AsyncClient.rename:6\n#: yadisk._client.Client.get_upload_link:4\n#: yadisk._client.Client.get_upload_link_object:7 yadisk._client.Client.move:5\n#: yadisk._client.Client.rename:6\nmsgid \"`bool`, determines whether to overwrite the destination\"\nmsgstr \"`bool`, определяет, перезаписывать путь назначения или нет\"\n\n#: of yadisk._async_client.AsyncClient.get_upload_link:26\n#: yadisk._client.Client.get_upload_link:27\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-\"\n\"api/doc/en/reference/upload>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/upload>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_upload_link:27\n#: yadisk._client.Client.get_upload_link:28\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetResourceUploadLink>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/GetResourceUploadLink>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_download_link:22\n#: yadisk._async_client.AsyncClient.get_public_download_link:23\n#: yadisk._async_client.AsyncClient.get_upload_link:29\n#: yadisk._client.Client.get_download_link:23\n#: yadisk._client.Client.get_public_download_link:24\n#: yadisk._client.Client.get_upload_link:30\n#: yadisk.objects._yadisk_object.YaDiskObject.remove_alias:3\n#: yadisk.objects._yadisk_object.YaDiskObject.remove_field:3\n#: yadisk.objects._yadisk_object.YaDiskObject.set_field_type:3\nmsgid \"`str`\"\nmsgstr \"`str`\"\n\n#: of yadisk._async_client.AsyncClient.get_upload_link_object:1\nmsgid \"\"\n\"Get a link to upload the file using the PUT request. This is similar to \"\n\":any:`AsyncClient.get_upload_link()`, except it returns an instance of \"\n\":any:`ResourceUploadLinkObject` which also contains an asynchronous \"\n\"operation ID.\"\nmsgstr \"\"\n\"Получает ссылку для загрузки файла на диск при помощи PUT запроса. Этот \"\n\"метод аналогичен :any:`AsyncClient.get_upload_link()`, но возвращает \"\n\"объект :any:`ResourceUploadLinkObject`, который также содержит \"\n\"идентификатор асинхронной операции.\"\n\n#: of yadisk._async_client.AsyncClient.get_upload_link_object:28\n#: yadisk._client.Client.get_upload_link_object:29\nmsgid \":any:`ResourceUploadLinkObject`\"\nmsgstr \":any:`ResourceUploadLinkObject`\"\n\n#: of yadisk._async_client.AsyncClient.upload_by_link:1\n#: yadisk._client.Client.upload_by_link:1\nmsgid \"Upload a file to disk using an upload link.\"\nmsgstr \"Загружает файл на диск по уже полученной ссылке.\"\n\n#: of yadisk._async_client.AsyncClient.upload_by_link:4\n#: yadisk._client.Client.upload_by_link:5\nmsgid \"upload link\"\nmsgstr \"ссылка для загрузки файла\"\n\n#: of yadisk._async_client.AsyncClient.upload_url:1\n#: yadisk._client.Client.upload_url:1\nmsgid \"Upload a file from URL.\"\nmsgstr \"Загружает файл на диск по URL.\"\n\n#: of yadisk._async_client.AsyncClient.upload_url:3\n#: yadisk._client.Client.upload_url:3\nmsgid \"source URL\"\nmsgstr \"исходный URL\"\n\n#: of yadisk._async_client.AsyncClient.upload_url:5\n#: yadisk._client.Client.upload_url:5\nmsgid \"`bool`, forbid redirects\"\nmsgstr \"`bool`, запретить делать перенаправления\"\n\n#: of yadisk._async_client.AsyncClient.copy:11\n#: yadisk._async_client.AsyncClient.move:8\n#: yadisk._async_client.AsyncClient.remove:9\n#: yadisk._async_client.AsyncClient.remove_trash:6\n#: yadisk._async_client.AsyncClient.rename:9\n#: yadisk._async_client.AsyncClient.restore_trash:9\n#: yadisk._async_client.AsyncClient.save_to_disk:11\n#: yadisk._async_client.AsyncClient.upload_url:7 yadisk._client.Client.copy:11\n#: yadisk._client.Client.move:8 yadisk._client.Client.remove:8\n#: yadisk._client.Client.remove_trash:6 yadisk._client.Client.rename:9\n#: yadisk._client.Client.restore_trash:9 yadisk._client.Client.save_to_disk:11\n#: yadisk._client.Client.upload_url:7\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:6\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:14\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:6\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:14\nmsgid \"\"\n\"`bool`, if :code:`True`, the method will wait until the asynchronous \"\n\"operation is completed\"\nmsgstr \"\"\n\"`bool`, если :code:`True`, метод будет ожидать завершения асинхронной \"\n\"операции\"\n\n#: of yadisk._async_client.AsyncClient.copy:12\n#: yadisk._async_client.AsyncClient.move:9\n#: yadisk._async_client.AsyncClient.remove:10\n#: yadisk._async_client.AsyncClient.remove_trash:7\n#: yadisk._async_client.AsyncClient.rename:10\n#: yadisk._async_client.AsyncClient.restore_trash:10\n#: yadisk._async_client.AsyncClient.save_to_disk:12\n#: yadisk._async_client.AsyncClient.upload_url:8\n#: yadisk._async_client.AsyncClient.wait_for_operation:5\n#: yadisk._client.Client.copy:12 yadisk._client.Client.move:9\n#: yadisk._client.Client.remove:9 yadisk._client.Client.remove_trash:7\n#: yadisk._client.Client.rename:10 yadisk._client.Client.restore_trash:10\n#: yadisk._client.Client.save_to_disk:12 yadisk._client.Client.upload_url:8\n#: yadisk._client.Client.wait_for_operation:5\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:4\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:4\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:7\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:15\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:7\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:15\nmsgid \"`float`, interval in seconds between subsequent operation status queries\"\nmsgstr \"`float`, интервал в секундах между проверками статуса операции\"\n\n#: of yadisk._async_client.AsyncClient.copy:13\n#: yadisk._async_client.AsyncClient.move:10\n#: yadisk._async_client.AsyncClient.remove:11\n#: yadisk._async_client.AsyncClient.remove_trash:8\n#: yadisk._async_client.AsyncClient.rename:11\n#: yadisk._async_client.AsyncClient.restore_trash:11\n#: yadisk._async_client.AsyncClient.save_to_disk:13\n#: yadisk._async_client.AsyncClient.upload_url:9\n#: yadisk._async_client.AsyncClient.wait_for_operation:6\n#: yadisk._client.Client.copy:13 yadisk._client.Client.move:10\n#: yadisk._client.Client.remove:10 yadisk._client.Client.remove_trash:8\n#: yadisk._client.Client.rename:11 yadisk._client.Client.restore_trash:11\n#: yadisk._client.Client.save_to_disk:13 yadisk._client.Client.upload_url:9\n#: yadisk._client.Client.wait_for_operation:6\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:5\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:5\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:8\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:16\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:8\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:16\nmsgid \"\"\n\"`float` or `None`, total polling timeout (`None` means no timeout), if \"\n\"this timeout is exceeded, an exception is raised\"\nmsgstr \"\"\n\"`float` or `None`, таймаут ожидания операции (`None` означает отсутствие \"\n\"таймаута), если этот таймаут превышен, будет вызвано исключение\"\n\n#: of yadisk._async_client.AsyncClient.copy:30\n#: yadisk._async_client.AsyncClient.get_operation_status:13\n#: yadisk._async_client.AsyncClient.move:25\n#: yadisk._async_client.AsyncClient.remove:26\n#: yadisk._async_client.AsyncClient.remove_trash:22\n#: yadisk._async_client.AsyncClient.rename:27\n#: yadisk._async_client.AsyncClient.restore_trash:26\n#: yadisk._async_client.AsyncClient.save_to_disk:29\n#: yadisk._async_client.AsyncClient.upload_url:26\n#: yadisk._async_client.AsyncClient.wait_for_operation:17\n#: yadisk._client.Client.copy:31 yadisk._client.Client.get_operation_status:14\n#: yadisk._client.Client.move:26 yadisk._client.Client.remove:27\n#: yadisk._client.Client.remove_trash:23 yadisk._client.Client.rename:28\n#: yadisk._client.Client.restore_trash:27 yadisk._client.Client.save_to_disk:30\n#: yadisk._client.Client.upload_url:27\n#: yadisk._client.Client.wait_for_operation:18\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:12\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:16\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:13\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:17\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:22\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:31\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:23\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:32\nmsgid \"requested operation was not found\"\nmsgstr \"указанная операция не найдена\"\n\n#: of yadisk._async_client.AsyncClient.copy:31\n#: yadisk._async_client.AsyncClient.move:26\n#: yadisk._async_client.AsyncClient.remove:27\n#: yadisk._async_client.AsyncClient.remove_trash:23\n#: yadisk._async_client.AsyncClient.rename:28\n#: yadisk._async_client.AsyncClient.restore_trash:27\n#: yadisk._async_client.AsyncClient.save_to_disk:30\n#: yadisk._async_client.AsyncClient.upload_url:27\n#: yadisk._async_client.AsyncClient.wait_for_operation:18\n#: yadisk._client.Client.copy:32 yadisk._client.Client.move:27\n#: yadisk._client.Client.remove:28 yadisk._client.Client.remove_trash:24\n#: yadisk._client.Client.rename:29 yadisk._client.Client.restore_trash:28\n#: yadisk._client.Client.save_to_disk:31 yadisk._client.Client.upload_url:28\n#: yadisk._client.Client.wait_for_operation:19\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:17\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:18\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:23\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:32\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:24\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:33\nmsgid \"requested operation failed\"\nmsgstr \"не удалось совершить операцию\"\n\n#: of yadisk._async_client.AsyncClient.copy:32\n#: yadisk._async_client.AsyncClient.move:27\n#: yadisk._async_client.AsyncClient.remove:28\n#: yadisk._async_client.AsyncClient.remove_trash:24\n#: yadisk._async_client.AsyncClient.rename:29\n#: yadisk._async_client.AsyncClient.restore_trash:28\n#: yadisk._async_client.AsyncClient.save_to_disk:31\n#: yadisk._async_client.AsyncClient.upload_url:28\n#: yadisk._async_client.AsyncClient.wait_for_operation:19\n#: yadisk._client.Client.copy:33 yadisk._client.Client.move:28\n#: yadisk._client.Client.remove:29 yadisk._client.Client.remove_trash:25\n#: yadisk._client.Client.rename:30 yadisk._client.Client.restore_trash:29\n#: yadisk._client.Client.save_to_disk:32 yadisk._client.Client.upload_url:29\n#: yadisk._client.Client.wait_for_operation:20\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:18\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:19\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:24\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:33\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:25\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:34\nmsgid \"\"\n\"requested operation did not complete in specified time (when \"\n\"`poll_timeout` is not `None`)\"\nmsgstr \"\"\n\"указанная операция не завершилась в указанное время (когда `poll_timeout`\"\n\" не `None`)\"\n\n#: of yadisk._async_client.AsyncClient.upload_url:34\n#: yadisk._client.Client.upload_url:35\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/upload-\"\n\"ext>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/upload-ext>`__\"\n\n#: of yadisk._async_client.AsyncClient.upload_url:35\n#: yadisk._client.Client.upload_url:36\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/UploadExternalResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/UploadExternalResource>`__\"\n\n#: of yadisk._async_client.AsyncClient.upload_url:37\nmsgid \":any:`AsyncOperationLinkObject`, link to the asynchronous operation\"\nmsgstr \":any:`AsyncOperationLinkObject`, ссылка на асинхронную операцию\"\n\n#: ../../api_reference/async_api.rst:49 ../../api_reference/sync_api.rst:49\nmsgid \"Downloading Files\"\nmsgstr \"Скачивание файлов\"\n\n#: of yadisk._async_client.AsyncClient.download:1\n#: yadisk._client.Client.download:1\nmsgid \"Download the file.\"\nmsgstr \"Скачивает файл.\"\n\n#: of yadisk._async_client.AsyncClient.copy:5\n#: yadisk._async_client.AsyncClient.download:3 yadisk._client.Client.copy:5\n#: yadisk._client.Client.download:3\nmsgid \"source path\"\nmsgstr \"исходный путь\"\n\n#: of yadisk._async_client.AsyncClient.download:4\n#: yadisk._async_client.AsyncClient.download_by_link:4\n#: yadisk._async_client.AsyncClient.download_public:4\n#: yadisk._client.Client.download:4 yadisk._client.Client.download_by_link:4\n#: yadisk._client.Client.download_public:4\nmsgid \"destination path or file-like object\"\nmsgstr \"путь назначения или файл-подобный объект\"\n\n#: of yadisk._async_client.AsyncClient.download:18\nmsgid \":any:`AsyncResourceLinkObject`, link to the source resource\"\nmsgstr \":any:`AsyncResourceLinkObject`, ссылка на исходный ресурс\"\n\n#: of yadisk._async_client.AsyncClient.get_download_link:1\n#: yadisk._client.Client.get_download_link:1\nmsgid \"Get a download link for a file (or a directory).\"\nmsgstr \"Получает ссылку на скачивание файла (или папки).\"\n\n#: of yadisk._async_client.AsyncClient.get_download_link:19\n#: yadisk._client.Client.get_download_link:20\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-\"\n\"api/doc/en/reference/content>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/content>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_download_link:20\n#: yadisk._client.Client.get_download_link:21\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetResourceDownloadLink>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/GetResourceDownloadLink>`__\"\n\n#: of yadisk._async_client.AsyncClient.download_by_link:1\n#: yadisk._client.Client.download_by_link:1\nmsgid \"Download the file from the link.\"\nmsgstr \"Скачивает файл по уже полученной ссылке.\"\n\n#: of yadisk._async_client.AsyncClient.download_by_link:3\n#: yadisk._client.Client.download_by_link:3\nmsgid \"download link\"\nmsgstr \"ссылка для скачивания\"\n\n#: ../../api_reference/async_api.rst:57 ../../api_reference/sync_api.rst:57\nmsgid \"File Operations\"\nmsgstr \"Операции над файлами\"\n\n#: ../../api_reference/async_api.rst:60 ../../api_reference/sync_api.rst:60\nmsgid \"Creating Directories\"\nmsgstr \"Создаёт папок\"\n\n#: of yadisk._async_client.AsyncClient.mkdir:1 yadisk._client.Client.mkdir:1\nmsgid \"Create a new directory.\"\nmsgstr \"Создаёт новую папку.\"\n\n#: of yadisk._async_client.AsyncClient.makedirs:4\n#: yadisk._async_client.AsyncClient.mkdir:3 yadisk._client.Client.makedirs:4\n#: yadisk._client.Client.mkdir:3\nmsgid \"path to the directory to be created\"\nmsgstr \"путь к папке, подлежащей созданию\"\n\n#: of yadisk._async_client.AsyncClient.makedirs:16\n#: yadisk._async_client.AsyncClient.mkdir:16 yadisk._client.Client.makedirs:17\n#: yadisk._client.Client.mkdir:17\nmsgid \"cannot create directory due to lack of storage space\"\nmsgstr \"невозможно создать папку из-за нехватки места на Диске\"\n\n#: of yadisk._async_client.AsyncClient.mkdir:22 yadisk._client.Client.mkdir:23\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/create-\"\n\"folder>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/create-folder>`__\"\n\n#: of yadisk._async_client.AsyncClient.mkdir:23 yadisk._client.Client.mkdir:24\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/CreateResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/CreateResource>`__\"\n\n#: of yadisk._async_client.AsyncClient.makedirs:20\n#: yadisk._async_client.AsyncClient.mkdir:25\n#: yadisk._async_client.AsyncClient.unpublish:25\nmsgid \":any:`AsyncResourceLinkObject`\"\nmsgstr \":any:`AsyncResourceLinkObject`\"\n\n#: of yadisk._async_client.AsyncClient.makedirs:1\n#: yadisk._client.Client.makedirs:1\nmsgid \"\"\n\"Create a new directory at `path`. If its parent directory doesn't exist \"\n\"it will also be created recursively.\"\nmsgstr \"\"\n\"Создаёт новую папку. Если родительская папка не сущсетвует, то онабудет \"\n\"также создана рекурсивно.\"\n\n#: ../../api_reference/async_api.rst:67 ../../api_reference/sync_api.rst:67\nmsgid \"Removing Files\"\nmsgstr \"Удаление файлов\"\n\n#: of yadisk._async_client.AsyncClient.remove:1 yadisk._client.Client.remove:1\nmsgid \"Remove the resource.\"\nmsgstr \"Удаляет ресурс.\"\n\n#: of yadisk._async_client.AsyncClient.remove:3 yadisk._client.Client.remove:3\nmsgid \"path to the resource to be removed\"\nmsgstr \"путь к удаляемому ресурсу\"\n\n#: of yadisk._async_client.AsyncClient.remove:4 yadisk._client.Client.remove:4\nmsgid \"\"\n\"if `True`, the resource will be removed permanently, otherwise, it will \"\n\"be just moved to the trash\"\nmsgstr \"\"\n\"если `True`, ресурс будет безвозвратно удалён, иначе ресурс будет \"\n\"перемещён в корзину\"\n\n#: of yadisk._async_client.AsyncClient.remove:6 yadisk._client.Client.remove:6\nmsgid \"`str`, MD5 hash of the file to remove\"\nmsgstr \"`str`, MD5 хэш файла, подлежащего удалению\"\n\n#: of yadisk._async_client.AsyncClient.copy:9\n#: yadisk._async_client.AsyncClient.move:6\n#: yadisk._async_client.AsyncClient.remove:7\n#: yadisk._async_client.AsyncClient.remove_trash:4\n#: yadisk._async_client.AsyncClient.rename:7\n#: yadisk._async_client.AsyncClient.restore_trash:7\n#: yadisk._async_client.AsyncClient.save_to_disk:9 yadisk._client.Client.copy:9\n#: yadisk._client.Client.move:6 yadisk._client.Client.remove:7\n#: yadisk._client.Client.remove_trash:4 yadisk._client.Client.rename:7\n#: yadisk._client.Client.restore_trash:7 yadisk._client.Client.save_to_disk:9\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:4\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:12\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:4\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:12\nmsgid \"forces the operation to be executed asynchronously\"\nmsgstr \"заставляет выполнять операцию асинхронно\"\n\n#: of yadisk._async_client.AsyncClient.remove:24\n#: yadisk._client.Client.remove:25\nmsgid \"MD5 check is only available for files\"\nmsgstr \"проверка MD5 доступна только для файлов\"\n\n#: of yadisk._async_client.AsyncClient.remove:34\n#: yadisk._client.Client.remove:35\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-\"\n\"api/doc/en/reference/delete>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/delete>`__\"\n\n#: of yadisk._async_client.AsyncClient.remove:35\n#: yadisk._client.Client.remove:36\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/DeleteResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/DeleteResource>`__\"\n\n#: of yadisk._async_client.AsyncClient.remove:37\n#: yadisk._async_client.AsyncClient.remove_trash:33\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:28\nmsgid \"\"\n\":any:`AsyncOperationLinkObject` if the operation is performed \"\n\"asynchronously, `None` otherwise\"\nmsgstr \"\"\n\":any:`AsyncOperationLinkObject`, если операция выполняется асинхронно, \"\n\"иначе `None`\"\n\n#: ../../api_reference/async_api.rst:71 ../../api_reference/sync_api.rst:71\nmsgid \"Copying Files\"\nmsgstr \"Копирование файлов\"\n\n#: of yadisk._async_client.AsyncClient.copy:1 yadisk._client.Client.copy:1\nmsgid \"\"\n\"Copy `src_path` to `dst_path`. If the operation is performed \"\n\"asynchronously, returns the link to the operation, otherwise, returns the\"\n\" link to the newly created resource.\"\nmsgstr \"\"\n\"Копирует `src_path` в `dst_path`. Если операция выполняется асинхронно, \"\n\"возвращает ссылку на операцию, иначе, возвращает ссылку на новый ресурс.\"\n\n#: of yadisk._async_client.AsyncClient.copy:7 yadisk._client.Client.copy:7\nmsgid \"\"\n\"if `True` the destination path can be overwritten, otherwise, an error \"\n\"will be raised\"\nmsgstr \"\"\n\"если `True`, путь назначения может быть перезаписан, иначе будет вызвана \"\n\"ошибка\"\n\n#: of yadisk._async_client.AsyncClient.copy:27 yadisk._client.Client.copy:28\nmsgid \"cannot complete request due to lack of storage space\"\nmsgstr \"невозможно выполнить запрос из-за нехватки свободного места на Диске\"\n\n#: of yadisk._async_client.AsyncClient.copy:38 yadisk._client.Client.copy:39\nmsgid \"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/copy>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/copy>`__\"\n\n#: of yadisk._async_client.AsyncClient.copy:39 yadisk._client.Client.copy:40\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/CopyResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/CopyResource>`__\"\n\n#: of yadisk._async_client.AsyncClient.copy:41\n#: yadisk._async_client.AsyncClient.move:36\n#: yadisk._async_client.AsyncClient.rename:33\n#: yadisk._async_client.AsyncClient.restore_trash:37\n#: yadisk._async_client.AsyncClient.save_to_disk:40\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:37\nmsgid \":any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\"\nmsgstr \":any:`AsyncResourceLinkObject` или :any:`AsyncOperationLinkObject`\"\n\n#: ../../api_reference/async_api.rst:75 ../../api_reference/sync_api.rst:75\nmsgid \"Moving Files\"\nmsgstr \"Перемещение файлов\"\n\n#: of yadisk._async_client.AsyncClient.move:1 yadisk._client.Client.move:1\nmsgid \"Move `src_path` to `dst_path`.\"\nmsgstr \"Перемещает `src_path` в `dst_path`.\"\n\n#: of yadisk._async_client.AsyncClient.move:3\n#: yadisk._async_client.AsyncClient.rename:4 yadisk._client.Client.move:3\n#: yadisk._client.Client.rename:4\nmsgid \"source path to be moved\"\nmsgstr \"исходный путь, подлежащий перемещению\"\n\n#: of yadisk._async_client.AsyncClient.move:33 yadisk._client.Client.move:34\nmsgid \"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/move>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/move>`__\"\n\n#: of yadisk._async_client.AsyncClient.move:34 yadisk._client.Client.move:35\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/MoveResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/MoveResource>`__\"\n\n#: of yadisk._async_client.AsyncClient.rename:1 yadisk._client.Client.rename:1\nmsgid \"\"\n\"Rename `src_path` to have filename `new_name`. Does the same as `move()` \"\n\"but changes only the filename.\"\nmsgstr \"\"\n\"Переименовывает `src_path` в `new_name`. Делает то же самое, что и \"\n\"`move()`, за исключением того, что меняет только имя файла.\"\n\n#: of yadisk._async_client.AsyncClient.rename:5 yadisk._client.Client.rename:5\nmsgid \"target filename to rename to\"\nmsgstr \"новое имя файла, в которое следует переименовать ресурс\"\n\n#: of yadisk._async_client.AsyncClient.rename:26\n#: yadisk._client.Client.rename:27\nmsgid \"`new_name` is not a valid filename or `src_path` is root\"\nmsgstr \"\"\n\"`new_name` не является допустимым именем файла или `src_path` - корень \"\n\"диска\"\n\n#: ../../api_reference/async_api.rst:81 ../../api_reference/sync_api.rst:81\nmsgid \"Setting Custom Properties\"\nmsgstr \"Задание пользовательских свойств ресурсов\"\n\n#: of yadisk._async_client.AsyncClient.patch:1 yadisk._client.Client.patch:1\nmsgid \"Update custom properties of a resource.\"\nmsgstr \"Обновляет пользовательские свойства ресурса.\"\n\n#: of yadisk._async_client.AsyncClient.patch:4 yadisk._client.Client.patch:4\nmsgid \"`dict`, custom properties to update\"\nmsgstr \"`dict`, новые пользовательские свойства ресурса\"\n\n#: of yadisk._async_client.AsyncClient.patch:21 yadisk._client.Client.patch:22\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/meta-\"\n\"add>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/meta-add>`__\"\n\n#: of yadisk._async_client.AsyncClient.patch:22 yadisk._client.Client.patch:23\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/UpdateResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/UpdateResource>`__\"\n\n#: ../../api_reference/async_api.rst:86 ../../api_reference/sync_api.rst:86\nmsgid \"Public Files\"\nmsgstr \"Публичные файлы\"\n\n#: ../../api_reference/async_api.rst:89 ../../api_reference/sync_api.rst:89\nmsgid \"Publishing/Unpublishing Files\"\nmsgstr \"Предоставление и закрытие публичного доступа\"\n\n#: of yadisk._async_client.AsyncClient.publish:1\n#: yadisk._client.Client.publish:1\nmsgid \"Make a resource public.\"\nmsgstr \"Делает ресурс публичным.\"\n\n#: of yadisk._async_client.AsyncClient.publish:3\n#: yadisk._client.Client.publish:3\nmsgid \"path to the resource to be published\"\nmsgstr \"путь к публикуемому ресурсу\"\n\n#: of yadisk._async_client.AsyncClient.get_public_settings:4\n#: yadisk._async_client.AsyncClient.publish:4\n#: yadisk._async_client.AsyncClient.unpublish:4\n#: yadisk._client.Client.get_public_settings:4 yadisk._client.Client.publish:4\nmsgid \"\"\n\"`bool`, specifies the request format, i.e. with personal access settings \"\n\"(when set to `True`) or without\"\nmsgstr \"\"\n\"`bool`, определяет формат запроса, т.е. с персональными настройками \"\n\"доступа (если `True`) или без\"\n\n#: of yadisk._async_client.AsyncClient.publish:6\n#: yadisk._client.Client.publish:6\nmsgid \":any:`PublicSettings` or `None`, public access settings for the resource\"\nmsgstr \":any:`PublicSettings` или `None`, настройки доступа для ресурса\"\n\n#: of yadisk._async_client.AsyncClient.publish:23\n#: yadisk._client.Client.publish:24\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-\"\n\"api/doc/en/reference/publish>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/publish>`__\"\n\n#: of yadisk._async_client.AsyncClient.publish:24\n#: yadisk._client.Client.publish:25\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/PublishResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/PublishResource>`__\"\n\n#: of yadisk._async_client.AsyncClient.publish:26\nmsgid \":any:`AsyncResourceLinkObject`, link to the resource\"\nmsgstr \":any:`AsyncResourceLinkObject`, ссылка на ресурс\"\n\n#: of yadisk._async_client.AsyncClient.unpublish:1\n#: yadisk._client.Client.unpublish:1\nmsgid \"Make a public resource private.\"\nmsgstr \"Делает публичный ресурс приватным.\"\n\n#: of yadisk._async_client.AsyncClient.unpublish:3\n#: yadisk._client.Client.unpublish:3\nmsgid \"path to the resource to be unpublished\"\nmsgstr \"путь к ресурсу, подлежащему депубликации\"\n\n#: of yadisk._async_client.AsyncClient.unpublish:22\n#: yadisk._client.Client.unpublish:21\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-\"\n\"api/doc/en/reference/publish#unpublish-q>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/publish#unpublish-q>`__\"\n\n#: of yadisk._async_client.AsyncClient.unpublish:23\n#: yadisk._client.Client.unpublish:22\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/UnpublishResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/UnpublishResource>`__\"\n\n#: ../../api_reference/async_api.rst:95 ../../api_reference/sync_api.rst:96\nmsgid \"Metadata About Public Files\"\nmsgstr \"Получение мета-информации о публичных ресурсах\"\n\n#: of yadisk._async_client.AsyncClient.get_public_meta:1\n#: yadisk._client.Client.get_public_meta:1\nmsgid \"Get meta-information about a public resource.\"\nmsgstr \"Получает мета-информацию о публичном ресурсе.\"\n\n#: of yadisk._async_client.AsyncClient.download_public:3\n#: yadisk._async_client.AsyncClient.get_public_download_link:3\n#: yadisk._async_client.AsyncClient.get_public_meta:3\n#: yadisk._async_client.AsyncClient.get_public_type:3\n#: yadisk._async_client.AsyncClient.is_public_dir:3\n#: yadisk._async_client.AsyncClient.is_public_file:3\n#: yadisk._async_client.AsyncClient.public_exists:3\n#: yadisk._async_client.AsyncClient.save_to_disk:5\nmsgid \"public key or public URL of the resource\"\nmsgstr \"публичный ключ или URL к ресурсу\"\n\n#: of yadisk._async_client.AsyncClient.get_public_meta:4\n#: yadisk._client.Client.get_public_meta:4\nmsgid \"\"\n\"relative path to a resource in a public folder. By specifying the key of \"\n\"the published folder in `public_key`, you can request metainformation for\"\n\" any resource in the folder.\"\nmsgstr \"\"\n\"относительный путь к ресурсу внутри публичной папки. Указывая ключ \"\n\"опубликованной папки через `public_key`, вы можете запросить \"\n\"метаинформацию любого ресурса внутри неё.\"\n\n#: of yadisk._async_client.AsyncClient.get_public_meta:7\n#: yadisk._client.Client.get_public_meta:7\nmsgid \"offset from the beginning of the list of nested resources\"\nmsgstr \"отступ от начала списка вложенных ресурсов\"\n\n#: of yadisk._async_client.AsyncClient.get_public_meta:8\n#: yadisk._client.Client.get_public_meta:8\nmsgid \"maximum number of nested elements to be included in the list\"\nmsgstr \"максимальное количество элементов списка вложенных ресурсов\"\n\n#: of yadisk._async_client.AsyncClient.get_public_meta:10\n#: yadisk._client.Client.get_public_meta:10\nmsgid \"file preview size\"\nmsgstr \"размер превью файла\"\n\n#: of yadisk._async_client.AsyncClient.get_public_meta:11\n#: yadisk._client.Client.get_public_meta:11\nmsgid \"`bool`, allow preview crop\"\nmsgstr \"`bool`, разрешить обрезку превью\"\n\n#: of yadisk._async_client.AsyncClient.get_public_meta:27\n#: yadisk._client.Client.get_public_meta:28\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-\"\n\"api/doc/en/reference/public>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/public>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_public_meta:28\n#: yadisk._client.Client.get_public_meta:29\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/GetPublicResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47public47resources/GetPublicResource>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_public_meta:30\nmsgid \":any:`AsyncPublicResourceObject`\"\nmsgstr \":any:`AsyncPublicResourceObject`\"\n\n#: of yadisk._async_client.AsyncClient.get_public_type:1\n#: yadisk._client.Client.get_public_type:1\nmsgid \"Get public resource type.\"\nmsgstr \"Получает тип публичного ресурса.\"\n\n#: of yadisk._async_client.AsyncClient.download_public:5\n#: yadisk._async_client.AsyncClient.get_public_download_link:4\n#: yadisk._async_client.AsyncClient.get_public_type:4\n#: yadisk._async_client.AsyncClient.is_public_dir:4\n#: yadisk._async_client.AsyncClient.is_public_file:4\n#: yadisk._async_client.AsyncClient.public_exists:4\n#: yadisk._client.Client.download_public:5\n#: yadisk._client.Client.get_public_download_link:4\n#: yadisk._client.Client.get_public_type:4\n#: yadisk._client.Client.is_public_dir:4 yadisk._client.Client.is_public_file:4\n#: yadisk._client.Client.public_exists:4\nmsgid \"relative path to the resource within the public folder\"\nmsgstr \"относительный путь к ресурсу внутри публичной папки\"\n\n#: of yadisk._async_client.AsyncClient.is_public_dir:1\nmsgid \"Check whether `public_key` is a public directory.\"\nmsgstr \"Проверяет, является ли `public_key` публичной папкой.\"\n\n#: of yadisk._async_client.AsyncClient.is_public_dir:16\n#: yadisk._client.Client.is_public_dir:17\nmsgid \"\"\n\"`True` if `public_key` is a directory, `False` otherwise (even if it \"\n\"doesn't exist)\"\nmsgstr \"\"\n\"`True`, если `public_key` является папкой, `False`, в остальных случаях \"\n\"(даже если ресурс не существует)\"\n\n#: of yadisk._async_client.AsyncClient.is_public_file:1\nmsgid \"Check whether `public_key` is a public file.\"\nmsgstr \"Проверяет, является ли `public_key` публичным файлом.\"\n\n#: of yadisk._async_client.AsyncClient.is_public_file:16\n#: yadisk._client.Client.is_public_file:17\nmsgid \"\"\n\"`True` if `public_key` is a file, `False` otherwise (even if it doesn't \"\n\"exist)\"\nmsgstr \"\"\n\"`True`, если `public_key` является файлом, `False`, в остальных случаях \"\n\"(даже если ресурс не существует)\"\n\n#: of yadisk._async_client.AsyncClient.public_exists:1\n#: yadisk._client.Client.public_exists:1\nmsgid \"Check whether the public resource exists.\"\nmsgstr \"Проверяет, существует ли публичный ресурс.\"\n\n#: ../../api_reference/async_api.rst:104 ../../api_reference/sync_api.rst:105\nmsgid \"Downloading Public Files\"\nmsgstr \"Скачивание публичных ресурсов\"\n\n#: of yadisk._async_client.AsyncClient.get_public_download_link:1\n#: yadisk._client.Client.get_public_download_link:1\nmsgid \"Get a download link for a public resource.\"\nmsgstr \"Получает ссылку на скачивание публичного ресурса.\"\n\n#: of yadisk._async_client.AsyncClient.get_public_download_link:20\n#: yadisk._client.Client.get_public_download_link:21\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/public\"\n\"#download-request>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/public#download-request>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_public_download_link:21\n#: yadisk._client.Client.get_public_download_link:22\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/GetPublicResourceDownloadLink>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47public47resources/GetPublicResourceDownloadLink>`__\"\n\n#: of yadisk._async_client.AsyncClient.download_public:1\n#: yadisk._client.Client.download_public:1\nmsgid \"Download the public resource.\"\nmsgstr \"Скачивает публичный ресурс.\"\n\n#: of yadisk._async_client.AsyncClient.download_public:19\nmsgid \":any:`AsyncPublicResourceLinkObject`\"\nmsgstr \":any:`AsyncPublicResourceLinkObject`\"\n\n#: ../../api_reference/async_api.rst:110 ../../api_reference/sync_api.rst:111\nmsgid \"Saving Public Resources to Disk\"\nmsgstr \"Сохранение публичных ресурсов на Диск\"\n\n#: of yadisk._async_client.AsyncClient.save_to_disk:1\n#: yadisk._client.Client.save_to_disk:1\nmsgid \"\"\n\"Saves a public resource to the disk. Returns the link to the operation if\"\n\" it's performed asynchronously, or a link to the resource otherwise.\"\nmsgstr \"\"\n\"Сохраняет публичный ресурс на диск. Возвращает ссылку на операцию, если \"\n\"сохранение выполняется асинхронно, или возвращает ссылку на ресурс.\"\n\n#: of yadisk._async_client.AsyncClient.save_to_disk:6\n#: yadisk._client.Client.save_to_disk:6\nmsgid \"filename of the saved resource\"\nmsgstr \"имя файла/папки, под которым будет сохранён ресурс\"\n\n#: of yadisk._async_client.AsyncClient.save_to_disk:7\n#: yadisk._client.Client.save_to_disk:7\nmsgid \"path to the copied resource in the public folder\"\nmsgstr \"путь к копируемому ресурсу в публичной папке\"\n\n#: of yadisk._async_client.AsyncClient.save_to_disk:8\n#: yadisk._client.Client.save_to_disk:8\nmsgid \"path to the destination directory (downloads directory by default)\"\nmsgstr \"путь к папке назначения (загрузки по умолчанию)\"\n\n#: of yadisk._async_client.AsyncClient.save_to_disk:37\n#: yadisk._client.Client.save_to_disk:38\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-\"\n\"api/doc/en/reference/public#save>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/public#save>`__\"\n\n#: of yadisk._async_client.AsyncClient.save_to_disk:38\n#: yadisk._client.Client.save_to_disk:39\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/SaveToDiskPublicResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47public47resources/SaveToDiskPublicResource>`__\"\n\n#: ../../api_reference/async_api.rst:115 ../../api_reference/sync_api.rst:116\nmsgid \"Listing Public Files\"\nmsgstr \"Получение списка публичных ресурсов\"\n\n#: of yadisk._async_client.AsyncClient.get_public_resources:1\n#: yadisk._client.Client.get_public_resources:1\nmsgid \"Get a list of public resources.\"\nmsgstr \"Получает список публичных ресурсов.\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:8\n#: yadisk._async_client.AsyncClient.get_public_resources:7\n#: yadisk._client.Client.get_all_public_resources:8\n#: yadisk._client.Client.get_public_resources:7\nmsgid \"filter based on type of resources (\\\"file\\\" or \\\"dir\\\")\"\nmsgstr \"фильтр по типу ресурса (\\\"file\\\" или \\\"dir\\\")\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:24\n#: yadisk._async_client.AsyncClient.get_public_resources:22\n#: yadisk._client.Client.get_all_public_resources:24\n#: yadisk._client.Client.get_public_resources:23\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/recent-\"\n\"public>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/recent-public>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:25\n#: yadisk._async_client.AsyncClient.get_public_resources:23\n#: yadisk._client.Client.get_all_public_resources:25\n#: yadisk._client.Client.get_public_resources:24\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47resources/ListPublicResources>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47resources/ListPublicResources>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_public_resources:25\nmsgid \":any:`AsyncPublicResourcesListObject`\"\nmsgstr \":any:`AsyncPublicResourcesListObject`\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:1\n#: yadisk._client.Client.get_all_public_resources:1\nmsgid \"Get a list of all public resources.\"\nmsgstr \"Получает список всех публичных ресурсов.\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:15\n#: yadisk._client.Client.check_token:9 yadisk._client.Client.copy:20\n#: yadisk._client.Client.download:10 yadisk._client.Client.download_by_link:10\n#: yadisk._client.Client.download_public:11 yadisk._client.Client.exists:9\n#: yadisk._client.Client.get_all_public_resources:15\n#: yadisk._client.Client.get_device_code:16\n#: yadisk._client.Client.get_disk_info:10\n#: yadisk._client.Client.get_download_link:9 yadisk._client.Client.get_files:16\n#: yadisk._client.Client.get_last_uploaded:13 yadisk._client.Client.get_meta:15\n#: yadisk._client.Client.get_operation_status:9\n#: yadisk._client.Client.get_public_available_settings:9\n#: yadisk._client.Client.get_public_download_link:10\n#: yadisk._client.Client.get_public_meta:18\n#: yadisk._client.Client.get_public_resources:14\n#: yadisk._client.Client.get_public_settings:11\n#: yadisk._client.Client.get_public_type:10 yadisk._client.Client.get_token:12\n#: yadisk._client.Client.get_token_from_device_code:11\n#: yadisk._client.Client.get_trash_meta:15\n#: yadisk._client.Client.get_trash_type:9 yadisk._client.Client.get_type:9\n#: yadisk._client.Client.get_upload_link:13\n#: yadisk._client.Client.get_upload_link_object:17\n#: yadisk._client.Client.is_dir:9 yadisk._client.Client.is_file:9\n#: yadisk._client.Client.is_public_dir:10\n#: yadisk._client.Client.is_public_file:10 yadisk._client.Client.is_trash_dir:9\n#: yadisk._client.Client.is_trash_file:9 yadisk._client.Client.listdir:15\n#: yadisk._client.Client.makedirs:11 yadisk._client.Client.mkdir:10\n#: yadisk._client.Client.move:17 yadisk._client.Client.patch:11\n#: yadisk._client.Client.public_exists:10 yadisk._client.Client.publish:13\n#: yadisk._client.Client.refresh_token:9 yadisk._client.Client.remove:18\n#: yadisk._client.Client.remove_trash:15 yadisk._client.Client.rename:18\n#: yadisk._client.Client.restore_trash:18 yadisk._client.Client.revoke_token:9\n#: yadisk._client.Client.save_to_disk:20 yadisk._client.Client.trash_exists:9\n#: yadisk._client.Client.trash_listdir:15 yadisk._client.Client.unpublish:10\n#: yadisk._client.Client.update_public_settings:10\n#: yadisk._client.Client.upload:16 yadisk._client.Client.upload_by_link:13\n#: yadisk._client.Client.upload_url:16\n#: yadisk._client.Client.wait_for_operation:13\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:8\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:12\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:9\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:15\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:9\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:9\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:9\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:15\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:15\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:23\nmsgid \"`dict`, additional parameters for :any:`RequestsSession`\"\nmsgstr \"`dict`, Дополнительные параметры для :any:`RequestsSession`\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:16\n#: yadisk._client.Client.check_token:10 yadisk._client.Client.copy:21\n#: yadisk._client.Client.download:11 yadisk._client.Client.download_by_link:11\n#: yadisk._client.Client.download_public:12 yadisk._client.Client.exists:10\n#: yadisk._client.Client.get_all_public_resources:16\n#: yadisk._client.Client.get_device_code:17\n#: yadisk._client.Client.get_disk_info:11\n#: yadisk._client.Client.get_download_link:10\n#: yadisk._client.Client.get_files:17\n#: yadisk._client.Client.get_last_uploaded:14 yadisk._client.Client.get_meta:16\n#: yadisk._client.Client.get_operation_status:10\n#: yadisk._client.Client.get_public_available_settings:10\n#: yadisk._client.Client.get_public_download_link:11\n#: yadisk._client.Client.get_public_meta:19\n#: yadisk._client.Client.get_public_resources:15\n#: yadisk._client.Client.get_public_settings:12\n#: yadisk._client.Client.get_public_type:11 yadisk._client.Client.get_token:13\n#: yadisk._client.Client.get_token_from_device_code:12\n#: yadisk._client.Client.get_trash_meta:16\n#: yadisk._client.Client.get_trash_type:10 yadisk._client.Client.get_type:10\n#: yadisk._client.Client.get_upload_link:14\n#: yadisk._client.Client.get_upload_link_object:18\n#: yadisk._client.Client.is_dir:10 yadisk._client.Client.is_file:10\n#: yadisk._client.Client.is_public_dir:11\n#: yadisk._client.Client.is_public_file:11\n#: yadisk._client.Client.is_trash_dir:10 yadisk._client.Client.is_trash_file:10\n#: yadisk._client.Client.listdir:16 yadisk._client.Client.makedirs:12\n#: yadisk._client.Client.mkdir:11 yadisk._client.Client.move:18\n#: yadisk._client.Client.patch:12 yadisk._client.Client.public_exists:11\n#: yadisk._client.Client.publish:14 yadisk._client.Client.refresh_token:10\n#: yadisk._client.Client.remove:19 yadisk._client.Client.remove_trash:16\n#: yadisk._client.Client.rename:19 yadisk._client.Client.restore_trash:19\n#: yadisk._client.Client.revoke_token:10 yadisk._client.Client.save_to_disk:21\n#: yadisk._client.Client.trash_exists:10 yadisk._client.Client.trash_listdir:16\n#: yadisk._client.Client.unpublish:11\n#: yadisk._client.Client.update_public_settings:11\n#: yadisk._client.Client.upload:17 yadisk._client.Client.upload_by_link:14\n#: yadisk._client.Client.upload_url:17\n#: yadisk._client.Client.wait_for_operation:14\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:9\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:13\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:10\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:16\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:10\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:10\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:10\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:16\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:16\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:24\nmsgid \"`dict`, additional parameters for :any:`HTTPXSession`\"\nmsgstr \"`dict`, дополнительные параметры для :any:`HTTPXSession`\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:17\n#: yadisk._client.Client.check_token:11 yadisk._client.Client.copy:22\n#: yadisk._client.Client.download:12 yadisk._client.Client.download_by_link:12\n#: yadisk._client.Client.download_public:13 yadisk._client.Client.exists:11\n#: yadisk._client.Client.get_all_public_resources:17\n#: yadisk._client.Client.get_device_code:18\n#: yadisk._client.Client.get_disk_info:12\n#: yadisk._client.Client.get_download_link:11\n#: yadisk._client.Client.get_files:18\n#: yadisk._client.Client.get_last_uploaded:15 yadisk._client.Client.get_meta:17\n#: yadisk._client.Client.get_operation_status:11\n#: yadisk._client.Client.get_public_available_settings:11\n#: yadisk._client.Client.get_public_download_link:12\n#: yadisk._client.Client.get_public_meta:20\n#: yadisk._client.Client.get_public_resources:16\n#: yadisk._client.Client.get_public_settings:13\n#: yadisk._client.Client.get_public_type:12 yadisk._client.Client.get_token:14\n#: yadisk._client.Client.get_token_from_device_code:13\n#: yadisk._client.Client.get_trash_meta:17\n#: yadisk._client.Client.get_trash_type:11 yadisk._client.Client.get_type:11\n#: yadisk._client.Client.get_upload_link:15\n#: yadisk._client.Client.get_upload_link_object:19\n#: yadisk._client.Client.is_dir:11 yadisk._client.Client.is_file:11\n#: yadisk._client.Client.is_public_dir:12\n#: yadisk._client.Client.is_public_file:12\n#: yadisk._client.Client.is_trash_dir:11 yadisk._client.Client.is_trash_file:11\n#: yadisk._client.Client.listdir:17 yadisk._client.Client.makedirs:13\n#: yadisk._client.Client.mkdir:12 yadisk._client.Client.move:19\n#: yadisk._client.Client.patch:13 yadisk._client.Client.public_exists:12\n#: yadisk._client.Client.publish:15 yadisk._client.Client.refresh_token:11\n#: yadisk._client.Client.remove:20 yadisk._client.Client.remove_trash:17\n#: yadisk._client.Client.rename:20 yadisk._client.Client.restore_trash:20\n#: yadisk._client.Client.revoke_token:11 yadisk._client.Client.save_to_disk:22\n#: yadisk._client.Client.trash_exists:11 yadisk._client.Client.trash_listdir:17\n#: yadisk._client.Client.unpublish:12\n#: yadisk._client.Client.update_public_settings:12\n#: yadisk._client.Client.upload:18 yadisk._client.Client.upload_by_link:15\n#: yadisk._client.Client.upload_url:18\n#: yadisk._client.Client.wait_for_operation:15\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:10\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:14\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:11\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:17\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:11\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:11\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:11\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:17\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:17\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:25\nmsgid \"`dict`, additional options for :any:`PycURLSession`\"\nmsgstr \"`dict`, дополнительные опции для :any:`PycURLSession`\"\n\n#: of yadisk._async_client.AsyncClient.get_all_public_resources:27\nmsgid \"async generator of :any:`AsyncPublicResourceObject`\"\nmsgstr \"асинхронный генератор :any:`AsyncPublicResourceObject`\"\n\n#: ../../api_reference/async_api.rst:121 ../../api_reference/sync_api.rst:122\nmsgid \"Public Access Settings\"\nmsgstr \"Настройка публичного доступа\"\n\n#: of yadisk._async_client.AsyncClient.get_public_settings:1\n#: yadisk._client.Client.get_public_settings:1\nmsgid \"Get public settings of a resource.\"\nmsgstr \"Получает список настроек доступа к ресурсу\"\n\n#: of yadisk._async_client.AsyncClient.get_public_settings:21\n#: yadisk._client.Client.get_public_settings:22\nmsgid \"\"\n\"`Official docs <https://yandex.ru/dev/disk-api/doc/ru/reference/public-\"\n\"settings-get>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/public-settings-get>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_public_settings:23\n#: yadisk._client.Client.get_public_settings:24\nmsgid \":any:`PublicSettingsObject`\"\nmsgstr \":any:`PublicSettingsObject`\"\n\n#: of yadisk._async_client.AsyncClient.get_public_available_settings:1\n#: yadisk._client.Client.get_public_available_settings:1\nmsgid \"\"\n\"Get public settings of a shared resource for the current OAuth token \"\n\"owner.\"\nmsgstr \"\"\n\"Получает список всех настроек доступа к своему ресурсу, к которому \"\n\"предоставлен публичный доступ.\"\n\n#: of yadisk._async_client.AsyncClient.get_public_available_settings:19\n#: yadisk._client.Client.get_public_available_settings:20\nmsgid \"\"\n\"`Official docs <https://yandex.ru/dev/disk-api/doc/ru/reference/public-\"\n\"settings-get-available>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/public-settings-get-available>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_public_available_settings:21\n#: yadisk._client.Client.get_public_available_settings:22\nmsgid \":any:`PublicAvailableSettingsObject`\"\nmsgstr \":any:`PublicAvailableSettingsObject`\"\n\n#: of yadisk._async_client.AsyncClient.update_public_settings:1\n#: yadisk._client.Client.update_public_settings:1\nmsgid \"Update public settings of a shared resource.\"\nmsgstr \"Обновляет настройки доступа публичного ресурса.\"\n\n#: of yadisk._async_client.AsyncClient.update_public_settings:4\n#: yadisk._client.Client.update_public_settings:4\nmsgid \":any:`PublicSettings`, public access settings for the resource\"\nmsgstr \":any:`PublicSettings`, настройки доступа для ресурса\"\n\n#: of yadisk._async_client.AsyncClient.update_public_settings:20\n#: yadisk._client.Client.update_public_settings:21\nmsgid \"\"\n\"`Official docs <https://yandex.ru/dev/disk-api/doc/ru/reference/public-\"\n\"settings-change>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/public-settings-change>`__\"\n\n#: of yadisk._async_client.AsyncClient.update_public_settings:21\n#: yadisk._client.Client.update_public_settings:22\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/UpdatePublicSettings>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47public47resources/UpdatePublicSettings>`__\"\n\n#: of yadisk._async_client.AsyncClient.update_public_settings:23\n#: yadisk._client.Client.update_public_settings:24\nmsgid \"`None`\"\nmsgstr \"`None`\"\n\n#: ../../api_reference/async_api.rst:128 ../../api_reference/sync_api.rst:129\nmsgid \"Trash\"\nmsgstr \"Корзина\"\n\n#: of yadisk._async_client.AsyncClient.get_trash_meta:1\n#: yadisk._client.Client.get_trash_meta:1\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:1\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:1\nmsgid \"Get meta information about a trash resource.\"\nmsgstr \"Получает мета-информацию о ресурсе корзины.\"\n\n#: of yadisk._async_client.AsyncClient.get_trash_meta:3\n#: yadisk._async_client.AsyncClient.get_trash_type:3\n#: yadisk._async_client.AsyncClient.is_trash_dir:3\n#: yadisk._async_client.AsyncClient.is_trash_file:3\n#: yadisk._async_client.AsyncClient.trash_exists:3\n#: yadisk._client.Client.get_trash_meta:3\n#: yadisk._client.Client.get_trash_type:3 yadisk._client.Client.is_trash_dir:3\n#: yadisk._client.Client.is_trash_file:3 yadisk._client.Client.trash_exists:3\nmsgid \"path to the trash resource\"\nmsgstr \"путь к ресурсу корзины\"\n\n#: of yadisk._async_client.AsyncClient.get_trash_meta:25\n#: yadisk._client.Client.get_trash_meta:26\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47trash47resources/GetTrashResource>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47trash47resources/GetTrashResource>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_trash_meta:27\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:22\nmsgid \":any:`AsyncTrashResourceObject`\"\nmsgstr \":any:`AsyncTrashResourceObject`\"\n\n#: of yadisk._async_client.AsyncClient.trash_exists:1\n#: yadisk._client.Client.trash_exists:1\nmsgid \"Check whether the trash resource at `path` exists.\"\nmsgstr \"Проверяет, существует ли `path` в корзине.\"\n\n#: of yadisk._async_client.AsyncClient.restore_trash:1\n#: yadisk._client.Client.restore_trash:1\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:1\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:1\nmsgid \"\"\n\"Restore a trash resource. Returns a link to the newly created resource or\"\n\" a link to the asynchronous operation.\"\nmsgstr \"\"\n\"Восстанавливает ресурс корзины. Возвращает ссылку на новый ресурс или \"\n\"ссылку на асинхронную операцию.\"\n\n#: of yadisk._async_client.AsyncClient.restore_trash:4\nmsgid \"path to the trash resource to restore\"\nmsgstr \"путь к восстанавливаему ресурсу\"\n\n#: of yadisk._async_client.AsyncClient.restore_trash:6\n#: yadisk._client.Client.restore_trash:6\n#: yadisk.objects._resources.AsyncTrashResourceObject.restore:11\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:11\nmsgid \"`bool`, determines whether the destination can be overwritten\"\nmsgstr \"`bool`, определяет может ли путь назначения быть перезаписан\"\n\n#: of yadisk._async_client.AsyncClient.restore_trash:34\n#: yadisk._client.Client.restore_trash:35\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/trash-\"\n\"restore>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/trash-restore>`__\"\n\n#: of yadisk._async_client.AsyncClient.restore_trash:35\n#: yadisk._client.Client.restore_trash:36\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47trash47resources/RestoreFromTrash>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47trash47resources/RestoreFromTrash>`__\"\n\n#: of yadisk._async_client.AsyncClient.remove_trash:1\n#: yadisk._client.Client.remove_trash:1\n#: yadisk.objects._resources.AsyncTrashResourceObject.remove:1\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:1\nmsgid \"Remove a trash resource.\"\nmsgstr \"Удаляет ресурс корзины.\"\n\n#: of yadisk._async_client.AsyncClient.remove_trash:3\n#: yadisk._client.Client.remove_trash:3\nmsgid \"path to the trash resource to be deleted\"\nmsgstr \"путь к ресурсу корзины, подлежащий удалению\"\n\n#: of yadisk._async_client.AsyncClient.remove_trash:30\n#: yadisk._client.Client.remove_trash:31\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-api/doc/en/reference/trash-\"\n\"delete>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/trash-delete>`__\"\n\n#: of yadisk._async_client.AsyncClient.remove_trash:31\n#: yadisk._client.Client.remove_trash:32\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47trash47resources/ClearTrash>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47trash47resources/ClearTrash>`__\"\n\n#: of yadisk._async_client.AsyncClient.trash_listdir:1\n#: yadisk._client.Client.trash_listdir:1\n#: yadisk.objects._resources.AsyncTrashResourceObject.listdir:1\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:1\nmsgid \"Get contents of a trash resource.\"\nmsgstr \"Получает содержимое папки в корзине.\"\n\n#: of yadisk._async_client.AsyncClient.trash_listdir:3\n#: yadisk._client.Client.trash_listdir:3\nmsgid \"path to the directory in the trash bin\"\nmsgstr \"путь к папке в корзине\"\n\n#: of yadisk._async_client.AsyncClient.trash_listdir:23\nmsgid \"async generator of :any:`AsyncTrashResourceObject`\"\nmsgstr \"асинхронный генератор :any:`AsyncTrashResourceObject`\"\n\n#: of yadisk._async_client.AsyncClient.get_trash_type:1\n#: yadisk._client.Client.get_trash_type:1\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:1\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:1\nmsgid \"Get trash resource type.\"\nmsgstr \"Получает тип ресурса корзины.\"\n\n#: of yadisk._async_client.AsyncClient.is_trash_dir:1\n#: yadisk._client.Client.is_trash_dir:1\nmsgid \"Check whether `path` is a trash directory.\"\nmsgstr \"Проверяет, является ли `path` папкой в корзине.\"\n\n#: of yadisk._async_client.AsyncClient.is_trash_file:1\n#: yadisk._client.Client.is_trash_file:1\nmsgid \"Check whether `path` is a trash file.\"\nmsgstr \"Проверяет, является ли `path` файлом в корзине.\"\n\n#: ../../api_reference/async_api.rst:140 ../../api_reference/sync_api.rst:141\nmsgid \"Checking Operation Status\"\nmsgstr \"Получение статуса операции\"\n\n#: of yadisk._async_client.AsyncClient.get_operation_status:1\n#: yadisk._client.Client.get_operation_status:1\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:1\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:1\nmsgid \"Get operation status.\"\nmsgstr \"Получает статус операции.\"\n\n#: of yadisk._async_client.AsyncClient.get_operation_status:3\n#: yadisk._async_client.AsyncClient.wait_for_operation:4\n#: yadisk._client.Client.get_operation_status:3\n#: yadisk._client.Client.wait_for_operation:4\nmsgid \"ID of the operation or a link\"\nmsgstr \"идентификатор операции или ссылка на нее\"\n\n#: of yadisk._async_client.AsyncClient.get_operation_status:17\n#: yadisk._client.Client.get_operation_status:18\nmsgid \"\"\n\"`Official docs <https://yandex.com/dev/disk-\"\n\"api/doc/en/reference/operations>`__\"\nmsgstr \"\"\n\"`Официальная документация <https://yandex.ru/dev/disk-\"\n\"api/doc/ru/reference/operations>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_operation_status:18\n#: yadisk._client.Client.get_operation_status:19\nmsgid \"\"\n\"`Polygon \"\n\"<https://yandex.com/dev/disk/poligon#!/v147disk47operations47123operation95id125/GetOperationStatus/>`__\"\nmsgstr \"\"\n\"`Полигон \"\n\"<https://yandex.ru/dev/disk/poligon#!/v147disk47operations47123operation95id125/GetOperationStatus/>`__\"\n\n#: of yadisk._async_client.AsyncClient.get_operation_status:20\n#: yadisk._client.Client.get_operation_status:21\n#: yadisk.objects._operations.AsyncOperationLinkObject.get_status:14\n#: yadisk.objects._operations.SyncOperationLinkObject.get_status:15\nmsgid \"\"\n\"`str`, :code:`\\\"in-progress\\\"` indicates that the operation is currently \"\n\"running, :code:`\\\"success\\\"` indicates that the operation was successful,\"\n\" :code:`\\\"failed\\\"` means that the operation failed\"\nmsgstr \"\"\n\"`str`, :code:`\\\"in-progress\\\"` означает, что операция в процессе, \"\n\":code:`\\\"success\\\"` означает, что операция успешно завершилась, \"\n\":code:`\\\"failed\\\"` означает, что операция завершилась с ошибкой\"\n\n#: of yadisk._async_client.AsyncClient.wait_for_operation:1\n#: yadisk.objects._operations.AsyncOperationLinkObject.wait:1\nmsgid \"\"\n\"Wait until an operation is completed. If the operation fails, an \"\n\"exception is raised. Waiting is performed by calling \"\n\":any:`asyncio.sleep`.\"\nmsgstr \"\"\n\"Ждёт, пока операция не будет выполнена. Если выполнение операции не \"\n\"удалось, вызывается исключение. Ожидание осуществляется с помощью вызова \"\n\":any:`asyncio.sleep`.\"\n\n#: ../../api_reference/exceptions.rst:2\nmsgid \"Exceptions\"\nmsgstr \"Исключения\"\n\n#: of yadisk.exceptions.AsyncOperationFailedError:1\n#: yadisk.exceptions.BadGatewayError:1 yadisk.exceptions.GatewayTimeoutError:1\n#: yadisk.exceptions.InternalServerError:1 yadisk.exceptions.UnavailableError:1\n#: yadisk.exceptions.UnknownYaDiskError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.RetriableYaDiskError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.RetriableYaDiskError`\"\n\n#: of yadisk.exceptions.AsyncOperationFailedError:1\nmsgid \"Raised when an asynchronous operation fails\"\nmsgstr \"Вызывается, когда асинхронная операция завершается с ошибкой\"\n\n#: of yadisk.exceptions.AsyncOperationPollingTimeoutError:1\n#: yadisk.exceptions.BadRequestError:1 yadisk.exceptions.ConflictError:1\n#: yadisk.exceptions.ForbiddenError:1 yadisk.exceptions.GoneError:1\n#: yadisk.exceptions.InsufficientStorageError:1\n#: yadisk.exceptions.InvalidResponseError:1 yadisk.exceptions.LockedError:1\n#: yadisk.exceptions.NotAcceptableError:1 yadisk.exceptions.NotFoundError:1\n#: yadisk.exceptions.PayloadTooLargeError:1 yadisk.exceptions.RequestError:1\n#: yadisk.exceptions.RetriableYaDiskError:1\n#: yadisk.exceptions.TooManyRequestsError:1\n#: yadisk.exceptions.UnauthorizedError:1\n#: yadisk.exceptions.UnsupportedMediaError:1\n#: yadisk.exceptions.WrongResourceTypeError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.YaDiskError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.YaDiskError`\"\n\n#: of yadisk.exceptions.AsyncOperationPollingTimeoutError:1\nmsgid \"\"\n\"Raised when a polling timeout occured while waiting for an asynchronous \"\n\"operation\"\nmsgstr \"Вызывается, когда произошёл таймаут во время ожидания асинхронной операции\"\n\n#: of yadisk.exceptions.AuthorizationPendingError:1\n#: yadisk.exceptions.BadVerificationCodeError:1\n#: yadisk.exceptions.FieldValidationError:1\n#: yadisk.exceptions.InvalidClientError:1 yadisk.exceptions.InvalidGrantError:1\n#: yadisk.exceptions.UnsupportedTokenTypeError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.BadRequestError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.BadRequestError`\"\n\n#: of yadisk.exceptions.AuthorizationPendingError:1\nmsgid \"\"\n\"Thrown when authorization is currently pending, the application has to \"\n\"wait.\"\nmsgstr \"\"\n\"Вызывается, когда авторизация находится в процессе, приложение должно \"\n\"подождать.\"\n\n#: of yadisk.exceptions.BadGatewayError:1\nmsgid \"Thrown when the server returns code 502\"\nmsgstr \"Вызывается, когда сервер вернул код 502.\"\n\n#: of yadisk.exceptions.BadRequestError:1\nmsgid \"Thrown when the server returns code 400.\"\nmsgstr \"Вызывается, когда сервер вернул код 400.\"\n\n#: of yadisk.exceptions.BadVerificationCodeError:1\nmsgid \"Thrown when a verification code has invalid format\"\nmsgstr \"Вызывается, когда у кода подтверждения неправильный формат\"\n\n#: of yadisk.exceptions.ConflictError:1\nmsgid \"Thrown when the server returns code 409.\"\nmsgstr \"Вызывается, когда сервер вернул код 409.\"\n\n#: of yadisk.exceptions.DirectoryExistsError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.PathExistsError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.PathExistsError`\"\n\n#: of yadisk.exceptions.DirectoryExistsError:1\nmsgid \"Thrown when the directory already exists.\"\nmsgstr \"Вызывается, когда папка уже существует.\"\n\n#: of yadisk.exceptions.FieldValidationError:1\nmsgid \"Thrown when the request contains fields with invalid data.\"\nmsgstr \"Вызывается, когда запрос содежит поля с некорректными данными.\"\n\n#: of yadisk.exceptions.ForbiddenError:1\nmsgid \"Thrown when the server returns code 403.\"\nmsgstr \"Вызывается, когда сервер вернул код 403.\"\n\n#: of yadisk.exceptions.GatewayTimeoutError:1\nmsgid \"Thrown when the server returns code 504\"\nmsgstr \"Вызывается, когда сервер вернул код 504.\"\n\n#: of yadisk.exceptions.GoneError:1\nmsgid \"Raised when the server returns code 410.\"\nmsgstr \"Вызывается, когда сервер вернул код 410.\"\n\n#: of yadisk.exceptions.InsufficientStorageError:1\nmsgid \"Thrown when the server returns code 507.\"\nmsgstr \"Вызывается, когда сервер вернул код 507.\"\n\n#: of yadisk.exceptions.InternalServerError:1\nmsgid \"Thrown when the server returns code 500.\"\nmsgstr \"Вызывается, когда сервер вернул код 500.\"\n\n#: of yadisk.exceptions.InvalidClientError:1\nmsgid \"Thrown when an invalid client ID or client secret was provided\"\nmsgstr \"\"\n\"Вызывается, когда был указан неправильный идентификатор или пароль \"\n\"приложения\"\n\n#: of yadisk.exceptions.InvalidGrantError:1\nmsgid \"Thrown when a verification code is expired or invalid\"\nmsgstr \"Вызывается при неверном или просроченном коде подтверждения\"\n\n#: of yadisk.exceptions.InvalidResponseError:1\nmsgid \"Thrown when Yandex.Disk did not return a JSON response or if it's invalid.\"\nmsgstr \"Вызывается, когда Яндекс.Диск не вернул JSON ответ или он неправильный.\"\n\n#: of yadisk.exceptions.LockedError:1\nmsgid \"Thrown when the server returns code 423.\"\nmsgstr \"Вызывается, когда сервер вернул код 423.\"\n\n#: of yadisk.exceptions.MD5DifferError:1\n#: yadisk.exceptions.ParentNotFoundError:1 yadisk.exceptions.PathExistsError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.ConflictError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.ConflictError`\"\n\n#: of yadisk.exceptions.MD5DifferError:1\nmsgid \"\"\n\"Thrown when the MD5 hash of the file to be deleted doesn't match with the\"\n\" actual one.\"\nmsgstr \"Вызывается, когда MD5 хэш удаляемого ресурса не совпадает с указанным.\"\n\n#: of yadisk.exceptions.NotAcceptableError:1\nmsgid \"Thrown when the server returns code 406.\"\nmsgstr \"Вызывается, когда сервер вернул код 406.\"\n\n#: of yadisk.exceptions.NotFoundError:1\nmsgid \"Thrown when the server returns code 404.\"\nmsgstr \"Вызывается, когда сервер вернул код 404.\"\n\n#: of yadisk.exceptions.OperationNotFoundError:1\n#: yadisk.exceptions.PathNotFoundError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.NotFoundError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.NotFoundError`\"\n\n#: of yadisk.exceptions.OperationNotFoundError:1\nmsgid \"Thrown by `get_operation_status()` when the operation doesn't exist.\"\nmsgstr \"\"\n\"Вызывается, когда операция, переденная `get_operation_status()` не \"\n\"существует.\"\n\n#: of yadisk.exceptions.ParentNotFoundError:1\nmsgid \"Thrown by `mkdir`, `upload`, etc. when the parent directory doesn't exist.\"\nmsgstr \"\"\n\"Вызывается `mkdir`, `upload` и т.д. когда родительская папка не \"\n\"существует.\"\n\n#: of yadisk.exceptions.PasswordRequiredError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.ForbiddenError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.ForbiddenError`\"\n\n#: of yadisk.exceptions.PasswordRequiredError:1\nmsgid \"Thrown when a password is required to access the resource\"\nmsgstr \"Вызывается, когда для доступа к ресурсу требуется пароль\"\n\n#: of yadisk.exceptions.PathExistsError:1\nmsgid \"Thrown when the requested path already exists.\"\nmsgstr \"Вызывается, когда запрашиваемый путь уже существует.\"\n\n#: of yadisk.exceptions.PathNotFoundError:1\nmsgid \"Thrown when the requested path does not exist.\"\nmsgstr \"Вызывается, когда запрашиваемый путь не существует.\"\n\n#: of yadisk.exceptions.PayloadTooLargeError:1\nmsgid \"Thrown when the server returns code 413.\"\nmsgstr \"Вызывается, когда сервер вернул код 413.\"\n\n#: of yadisk.exceptions.RequestError:1\nmsgid \"\"\n\"Generic exception class for cases when a request could not be sent or \"\n\"response could not be received.\"\nmsgstr \"\"\n\"Общий класс исключения для случаев, когда запросы не удалось отправить \"\n\"или не удалось получить ответ.\"\n\n#: of yadisk.exceptions.RequestTimeoutError:1\n#: yadisk.exceptions.TooManyRedirectsError:1\n#: yadisk.exceptions.YaDiskConnectionError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.RequestError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.RequestError`\"\n\n#: of yadisk.exceptions.RequestTimeoutError:1\nmsgid \"Thrown when a request timed out.\"\nmsgstr \"Вызывается, когда время ожидания запроса истекло.\"\n\n#: of yadisk.exceptions.ResourceDownloadLimitExceededError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.TooManyRequestsError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.TooManyRequestsError`\"\n\n#: of yadisk.exceptions.ResourceDownloadLimitExceededError:1\nmsgid \"Raised when the download limit for a resource is exceeded.\"\nmsgstr \"Вызывается, когда превышен лимит на скачивание для ресурса.\"\n\n#: of yadisk.exceptions.ResourceIsLockedError:1\n#: yadisk.exceptions.UploadTrafficLimitExceededError:1\nmsgid \"Bases: :py:class:`~yadisk.exceptions.LockedError`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.exceptions.LockedError`\"\n\n#: of yadisk.exceptions.ResourceIsLockedError:1\nmsgid \"Thrown when the resource is locked by another operation.\"\nmsgstr \"Вызывается, когда запрашиваемый ресурс заблокирован другой операцией.\"\n\n#: of yadisk.exceptions.RetriableYaDiskError:1\nmsgid \"\"\n\"Thrown when there was an error but it would make sense to retry the \"\n\"request.\"\nmsgstr \"\"\n\"Вызывается в случае, если произошла ошибка, но имеет смысл повторить \"\n\"запрос.\"\n\n#: of yadisk.exceptions.TooManyRedirectsError:1\nmsgid \"Thrown when there were too many redirects.\"\nmsgstr \"Вызывается, при слишком большом количестве перенаправлений.\"\n\n#: of yadisk.exceptions.TooManyRequestsError:1\nmsgid \"Thrown when the server returns code 429.\"\nmsgstr \"Вызывается, когда сервер вернул код 429.\"\n\n#: of yadisk.exceptions.UnauthorizedError:1\nmsgid \"Thrown when the server returns code 401.\"\nmsgstr \"Вызывается, когда сервер вернул код 401.\"\n\n#: of yadisk.exceptions.UnavailableError:1\nmsgid \"Thrown when the server returns code 503.\"\nmsgstr \"Вызывается, когда сервер вернул код 503.\"\n\n#: of yadisk.exceptions.UnknownYaDiskError:1\nmsgid \"\"\n\"Thrown when the request failed but the response does not contain any \"\n\"error info.\"\nmsgstr \"Вызывается, когда запрос не удался, но не содержит информации об ошибке.\"\n\n#: of yadisk.exceptions.UnsupportedMediaError:1\nmsgid \"Thrown when the server returns code 415.\"\nmsgstr \"Вызывается, когда сервер вернул код 415.\"\n\n#: of yadisk.exceptions.UnsupportedTokenTypeError:1\nmsgid \"Thrown when the specified token cannot be used in a request\"\nmsgstr \"Вызывается, когда указанный токен не может быть использован в запросе\"\n\n#: of yadisk.exceptions.UploadTrafficLimitExceededError:1\nmsgid \"Thrown when upload limit has been exceeded.\"\nmsgstr \"Вызывается, когда превышен лимит на загрузку файлов.\"\n\n#: of yadisk.exceptions.WrongResourceTypeError:1\nmsgid \"\"\n\"Thrown when the resource was expected to be of different type (e.g., file\"\n\" instead of directory).\"\nmsgstr \"\"\n\"Вызывается, когда ожидался ресурс другого типа (например, файл вместо \"\n\"папки).\"\n\n#: of yadisk.exceptions.YaDiskConnectionError:1\nmsgid \"Thrown when a connection error occured.\"\nmsgstr \"Вызывается при ошибке соединения.\"\n\n#: of yadisk.exceptions.YaDiskError:1\nmsgid \"Bases: :py:class:`Exception`\"\nmsgstr \"Базовые классы: :py:class:`Exception`\"\n\n#: of yadisk.exceptions.YaDiskError:1\nmsgid \"Base class for all exceptions in this library.\"\nmsgstr \"Базовый класс для всех исключений в этой библиотеке.\"\n\n#: of yadisk.exceptions.YaDiskError:3 yadisk.exceptions.YaDiskError:8\nmsgid \"`str`, unique error code as returned by API\"\nmsgstr \"`str`, уникальный код ошибки, полученный от API\"\n\n#: of yadisk.exceptions.YaDiskError:4 yadisk.exceptions.YaDiskError:10\n#: yadisk.utils.get_exception:3\nmsgid \"an instance of :any:`Response` or :any:`AsyncResponse`\"\nmsgstr \"объект :any:`Response` или :any:`AsyncResponse`\"\n\n#: of yadisk.exceptions.YaDiskError:5 yadisk.exceptions.YaDiskError:11\nmsgid \"\"\n\"`bool`, if set to :code:`True`, exception will not trigger a retry in \"\n\":any:`utils.auto_retry()`\"\nmsgstr \"\"\n\"`bool`, если :code:`True`, исключение не вызовет повторную попытку в \"\n\":any:`utils.auto_retry()`\"\n\n#: of yadisk.exceptions.YaDiskError:9\nmsgid \"`str`, exception message\"\nmsgstr \"`str`, сообщение исключения\"\n\n#: ../../api_reference/index.rst:4\nmsgid \"Contents:\"\nmsgstr \"Содержание:\"\n\n#: ../../api_reference/index.rst:2\nmsgid \"API Reference\"\nmsgstr \"Справочник API\"\n\n#: ../../api_reference/response_objects.rst:2\nmsgid \"Response Objects\"\nmsgstr \"Объекты ответов сервера\"\n\n#: of yadisk.objects._resources.AsyncFilesResourceListObject:1\n#: yadisk.objects._resources.SyncFilesResourceListObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._resources.FilesResourceListObject`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.FilesResourceListObject`\"\n\n#: of yadisk.objects._resources.AsyncFilesResourceListObject:1\n#: yadisk.objects._resources.FilesResourceListObject:1\n#: yadisk.objects._resources.SyncFilesResourceListObject:1\nmsgid \"Flat list of files.\"\nmsgstr \"Плоский список файлов.\"\n\n#: of yadisk.objects._auth.DeviceCodeObject:3\n#: yadisk.objects._auth.TokenObject:3\n#: yadisk.objects._auth.TokenRevokeStatusObject:3\n#: yadisk.objects._disk.DiskInfoObject:3\n#: yadisk.objects._disk.SystemFoldersObject:3 yadisk.objects._disk.UserObject:3\n#: yadisk.objects._disk.UserPublicInfoObject:4\n#: yadisk.objects._error_object.ErrorObject:3\n#: yadisk.objects._link_object.LinkObject:3\n#: yadisk.objects._operations.AsyncOperationLinkObject:3\n#: yadisk.objects._operations.OperationLinkObject:3\n#: yadisk.objects._operations.OperationStatusObject:3\n#: yadisk.objects._operations.SyncOperationLinkObject:3\n#: yadisk.objects._resources.AsyncFilesResourceListObject:3\n#: yadisk.objects._resources.AsyncLastUploadedResourceListObject:3\n#: yadisk.objects._resources.AsyncPublicResourceLinkObject:3\n#: yadisk.objects._resources.AsyncPublicResourceListObject:3\n#: yadisk.objects._resources.AsyncPublicResourceObject:3\n#: yadisk.objects._resources.AsyncPublicResourcesListObject:3\n#: yadisk.objects._resources.AsyncResourceLinkObject:3\n#: yadisk.objects._resources.AsyncResourceListObject:3\n#: yadisk.objects._resources.AsyncResourceObject:3\n#: yadisk.objects._resources.AsyncTrashResourceListObject:3\n#: yadisk.objects._resources.AsyncTrashResourceObject:3\n#: yadisk.objects._resources.CommentIDsObject:3\n#: yadisk.objects._resources.EXIFObject:3\n#: yadisk.objects._resources.FilesResourceListObject:3\n#: yadisk.objects._resources.LastUploadedResourceListObject:3\n#: yadisk.objects._resources.PublicResourceLinkObject:3\n#: yadisk.objects._resources.PublicResourceListObject:3\n#: yadisk.objects._resources.PublicResourceObject:3\n#: yadisk.objects._resources.PublicResourcesListObject:3\n#: yadisk.objects._resources.ResourceDownloadLinkObject:3\n#: yadisk.objects._resources.ResourceLinkObject:3\n#: yadisk.objects._resources.ResourceListObject:3\n#: yadisk.objects._resources.ResourceObject:3\n#: yadisk.objects._resources.ResourceUploadLinkObject:3\n#: yadisk.objects._resources.ShareInfoObject:3\n#: yadisk.objects._resources.SyncFilesResourceListObject:3\n#: yadisk.objects._resources.SyncLastUploadedResourceListObject:3\n#: yadisk.objects._resources.SyncPublicResourceLinkObject:3\n#: yadisk.objects._resources.SyncPublicResourceListObject:3\n#: yadisk.objects._resources.SyncPublicResourceObject:3\n#: yadisk.objects._resources.SyncPublicResourcesListObject:3\n#: yadisk.objects._resources.SyncResourceLinkObject:3\n#: yadisk.objects._resources.SyncResourceListObject:3\n#: yadisk.objects._resources.SyncResourceObject:3\n#: yadisk.objects._resources.SyncTrashResourceListObject:3\n#: yadisk.objects._resources.SyncTrashResourceObject:3\n#: yadisk.objects._resources.TrashResourceListObject:3\n#: yadisk.objects._resources.TrashResourceObject:3\n#: yadisk.objects._yadisk_object.YaDiskObject:5\nmsgid \"`dict` or `None`\"\nmsgstr \"`dict` или `None`\"\n\n#: of yadisk.objects._operations.AsyncOperationLinkObject:4\n#: yadisk.objects._resources.AsyncFilesResourceListObject:4\n#: yadisk.objects._resources.AsyncLastUploadedResourceListObject:4\n#: yadisk.objects._resources.AsyncPublicResourceLinkObject:4\n#: yadisk.objects._resources.AsyncPublicResourceListObject:4\n#: yadisk.objects._resources.AsyncPublicResourceObject:4\n#: yadisk.objects._resources.AsyncPublicResourcesListObject:4\n#: yadisk.objects._resources.AsyncResourceLinkObject:4\n#: yadisk.objects._resources.AsyncResourceListObject:4\n#: yadisk.objects._resources.AsyncResourceObject:4\n#: yadisk.objects._resources.AsyncTrashResourceListObject:4\n#: yadisk.objects._resources.AsyncTrashResourceObject:4\nmsgid \":any:`AsyncClient` or `None`, `YaDisk` object\"\nmsgstr \":any:`AsyncClient` или `None`, объект `YaDisk`\"\n\n#: of yadisk.objects._resources.AsyncFilesResourceListObject:6\nmsgid \"`list`, flat list of files (:any:`AsyncResourceObject`)\"\nmsgstr \"`list`, плоский список файлов (:any:`AsyncResourceObject`)\"\n\n#: of yadisk.objects._resources.AsyncFilesResourceListObject:7\n#: yadisk.objects._resources.AsyncLastUploadedResourceListObject:7\n#: yadisk.objects._resources.AsyncPublicResourceListObject:8\n#: yadisk.objects._resources.AsyncPublicResourcesListObject:8\n#: yadisk.objects._resources.AsyncResourceListObject:8\n#: yadisk.objects._resources.AsyncTrashResourceListObject:8\n#: yadisk.objects._resources.FilesResourceListObject:7\n#: yadisk.objects._resources.LastUploadedResourceListObject:7\n#: yadisk.objects._resources.PublicResourceListObject:8\n#: yadisk.objects._resources.PublicResourcesListObject:8\n#: yadisk.objects._resources.ResourceListObject:8\n#: yadisk.objects._resources.SyncFilesResourceListObject:7\n#: yadisk.objects._resources.SyncLastUploadedResourceListObject:7\n#: yadisk.objects._resources.SyncPublicResourceListObject:8\n#: yadisk.objects._resources.SyncPublicResourcesListObject:8\n#: yadisk.objects._resources.SyncResourceListObject:8\n#: yadisk.objects._resources.SyncTrashResourceListObject:8\n#: yadisk.objects._resources.TrashResourceListObject:8\nmsgid \"`int`, maximum number of elements in the list\"\nmsgstr \"`int`, максимальное число элементов в списке\"\n\n#: of yadisk.objects._resources.AsyncFilesResourceListObject:8\n#: yadisk.objects._resources.AsyncPublicResourceListObject:9\n#: yadisk.objects._resources.AsyncPublicResourcesListObject:9\n#: yadisk.objects._resources.AsyncResourceListObject:9\n#: yadisk.objects._resources.AsyncTrashResourceListObject:9\n#: yadisk.objects._resources.FilesResourceListObject:8\n#: yadisk.objects._resources.PublicResourceListObject:9\n#: yadisk.objects._resources.PublicResourcesListObject:9\n#: yadisk.objects._resources.ResourceListObject:9\n#: yadisk.objects._resources.SyncFilesResourceListObject:8\n#: yadisk.objects._resources.SyncPublicResourceListObject:9\n#: yadisk.objects._resources.SyncPublicResourcesListObject:9\n#: yadisk.objects._resources.SyncResourceListObject:9\n#: yadisk.objects._resources.SyncTrashResourceListObject:9\n#: yadisk.objects._resources.TrashResourceListObject:9\nmsgid \"`int`, offset from the beginning of the list\"\nmsgstr \"`int`, отступ от начала списка\"\n\n#: of yadisk.objects._resources.AsyncLastUploadedResourceListObject:1\n#: yadisk.objects._resources.SyncLastUploadedResourceListObject:1\nmsgid \"\"\n\"Bases: \"\n\":py:class:`~yadisk.objects._resources.LastUploadedResourceListObject`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.LastUploadedResourceListObject`\"\n\n#: of yadisk.objects._resources.AsyncLastUploadedResourceListObject:1\n#: yadisk.objects._resources.LastUploadedResourceListObject:1\n#: yadisk.objects._resources.SyncLastUploadedResourceListObject:1\nmsgid \"List of last uploaded resources.\"\nmsgstr \"Список последних загруженных файлов.\"\n\n#: of yadisk.objects._resources.AsyncLastUploadedResourceListObject:6\n#: yadisk.objects._resources.AsyncPublicResourceListObject:7\n#: yadisk.objects._resources.AsyncResourceListObject:7\nmsgid \"`list`, list of resources (:any:`AsyncResourceObject`)\"\nmsgstr \"`list`, список ресурсов (:any:`AsyncResourceObject`)\"\n\n#: of yadisk.objects._operations.AsyncOperationLinkObject:1\n#: yadisk.objects._operations.SyncOperationLinkObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._operations.OperationLinkObject`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._operations.OperationLinkObject`\"\n\n#: of yadisk.objects._operations.AsyncOperationLinkObject:1\n#: yadisk.objects._operations.OperationLinkObject:1\n#: yadisk.objects._operations.SyncOperationLinkObject:1\nmsgid \"Operation link object.\"\nmsgstr \"Объект ссылки на операцию.\"\n\n#: of yadisk.objects._link_object.LinkObject:6\n#: yadisk.objects._operations.AsyncOperationLinkObject:6\n#: yadisk.objects._operations.OperationLinkObject:6\n#: yadisk.objects._operations.SyncOperationLinkObject:6\n#: yadisk.objects._resources.AsyncPublicResourceLinkObject:6\n#: yadisk.objects._resources.AsyncResourceLinkObject:6\n#: yadisk.objects._resources.PublicResourceLinkObject:6\n#: yadisk.objects._resources.ResourceDownloadLinkObject:6\n#: yadisk.objects._resources.ResourceLinkObject:6\n#: yadisk.objects._resources.ResourceUploadLinkObject:7\n#: yadisk.objects._resources.SyncPublicResourceLinkObject:6\n#: yadisk.objects._resources.SyncResourceLinkObject:6\nmsgid \"`str`, link URL\"\nmsgstr \"`str`, URL ссылки\"\n\n#: of yadisk._async_session.AsyncSession.send_request:10\n#: yadisk._session.Session.send_request:10\n#: yadisk.objects._link_object.LinkObject:7\n#: yadisk.objects._operations.AsyncOperationLinkObject:7\n#: yadisk.objects._operations.OperationLinkObject:7\n#: yadisk.objects._operations.SyncOperationLinkObject:7\n#: yadisk.objects._resources.AsyncPublicResourceLinkObject:7\n#: yadisk.objects._resources.AsyncResourceLinkObject:7\n#: yadisk.objects._resources.PublicResourceLinkObject:7\n#: yadisk.objects._resources.ResourceDownloadLinkObject:7\n#: yadisk.objects._resources.ResourceLinkObject:7\n#: yadisk.objects._resources.ResourceUploadLinkObject:8\n#: yadisk.objects._resources.SyncPublicResourceLinkObject:7\n#: yadisk.objects._resources.SyncResourceLinkObject:7\nmsgid \"`str`, HTTP method\"\nmsgstr \"`str`, HTTP метод\"\n\n#: of yadisk.objects._link_object.LinkObject:8\n#: yadisk.objects._operations.AsyncOperationLinkObject:8\n#: yadisk.objects._operations.OperationLinkObject:8\n#: yadisk.objects._operations.SyncOperationLinkObject:8\n#: yadisk.objects._resources.AsyncPublicResourceLinkObject:8\n#: yadisk.objects._resources.AsyncResourceLinkObject:8\n#: yadisk.objects._resources.PublicResourceLinkObject:8\n#: yadisk.objects._resources.ResourceDownloadLinkObject:8\n#: yadisk.objects._resources.ResourceLinkObject:8\n#: yadisk.objects._resources.ResourceUploadLinkObject:9\n#: yadisk.objects._resources.SyncPublicResourceLinkObject:8\n#: yadisk.objects._resources.SyncResourceLinkObject:8\nmsgid \"`bool`, tells whether the URL is templated\"\nmsgstr \"`bool`, признак шаблонизированного URL\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceLinkObject:1\nmsgid \"\"\n\"Bases: :py:class:`~yadisk.objects._resources.PublicResourceLinkObject`, \"\n\":py:class:`~yadisk.objects._resources.AsyncResourceObjectMethodsMixin`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.PublicResourceLinkObject`, \"\n\":py:class:`~yadisk.objects._resources.AsyncResourceObjectMethodsMixin`\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceLinkObject:1\n#: yadisk.objects._resources.PublicResourceLinkObject:1\n#: yadisk.objects._resources.SyncPublicResourceLinkObject:1\nmsgid \"Public resource link object.\"\nmsgstr \"Объект ссылки на публичный ресурс.\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceLinkObject:9\n#: yadisk.objects._resources.AsyncPublicResourceListObject:12\n#: yadisk.objects._resources.PublicResourceLinkObject:9\n#: yadisk.objects._resources.PublicResourceListObject:12\n#: yadisk.objects._resources.SyncPublicResourceLinkObject:9\n#: yadisk.objects._resources.SyncPublicResourceListObject:12\nmsgid \"`str`, public key of the resource\"\nmsgstr \"`str`, публичный ключ к ресурсу\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceLinkObject:10\n#: yadisk.objects._resources.PublicResourceLinkObject:10\n#: yadisk.objects._resources.SyncPublicResourceLinkObject:10\nmsgid \"`str`, public URL of the resource\"\nmsgstr \"`str`, публичный URL ресурса\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceListObject:1\n#: yadisk.objects._resources.SyncPublicResourceListObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._resources.PublicResourceListObject`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.PublicResourceListObject`\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceListObject:1\n#: yadisk.objects._resources.AsyncPublicResourcesListObject:1\n#: yadisk.objects._resources.PublicResourceListObject:1\n#: yadisk.objects._resources.PublicResourcesListObject:1\n#: yadisk.objects._resources.SyncPublicResourceListObject:1\n#: yadisk.objects._resources.SyncPublicResourcesListObject:1\nmsgid \"List of public resources.\"\nmsgstr \"Список публичных ресурсов.\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceListObject:6\n#: yadisk.objects._resources.AsyncResourceListObject:6\n#: yadisk.objects._resources.AsyncTrashResourceListObject:6\n#: yadisk.objects._resources.PublicResourceListObject:6\n#: yadisk.objects._resources.ResourceListObject:6\n#: yadisk.objects._resources.SyncPublicResourceListObject:6\n#: yadisk.objects._resources.SyncResourceListObject:6\n#: yadisk.objects._resources.SyncTrashResourceListObject:6\n#: yadisk.objects._resources.TrashResourceListObject:6\nmsgid \"`str`, sort type\"\nmsgstr \"`str`, тип сортировки\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceListObject:10\n#: yadisk.objects._resources.AsyncResourceListObject:10\n#: yadisk.objects._resources.AsyncTrashResourceListObject:10\n#: yadisk.objects._resources.PublicResourceListObject:10\n#: yadisk.objects._resources.ResourceListObject:10\n#: yadisk.objects._resources.SyncPublicResourceListObject:10\n#: yadisk.objects._resources.SyncResourceListObject:10\n#: yadisk.objects._resources.SyncTrashResourceListObject:10\n#: yadisk.objects._resources.TrashResourceListObject:10\nmsgid \"`str`, path to the directory that contains the elements of the list\"\nmsgstr \"`str`, путь к папке, содержащей элементы списка\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceListObject:11\n#: yadisk.objects._resources.AsyncResourceListObject:11\n#: yadisk.objects._resources.AsyncTrashResourceListObject:11\n#: yadisk.objects._resources.PublicResourceListObject:11\n#: yadisk.objects._resources.ResourceListObject:11\n#: yadisk.objects._resources.SyncPublicResourceListObject:11\n#: yadisk.objects._resources.SyncResourceListObject:11\n#: yadisk.objects._resources.SyncTrashResourceListObject:11\n#: yadisk.objects._resources.TrashResourceListObject:11\nmsgid \"`int`, number of elements in the list\"\nmsgstr \"`int`, количество элементов списка\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:1\nmsgid \"\"\n\"Bases: :py:class:`~yadisk.objects._resources.PublicResourceObject`, \"\n\":py:class:`~yadisk.objects._resources.AsyncResourceObjectMethodsMixin`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.PublicResourceObject`, \"\n\":py:class:`~yadisk.objects._resources.AsyncResourceObjectMethodsMixin`\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:1\n#: yadisk.objects._resources.PublicResourceObject:1\n#: yadisk.objects._resources.SyncPublicResourceObject:1\nmsgid \"Public resource object.\"\nmsgstr \"Объект публичного ресурса.\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:6\n#: yadisk.objects._resources.AsyncResourceObject:6\n#: yadisk.objects._resources.AsyncTrashResourceObject:6\n#: yadisk.objects._resources.PublicResourceObject:6\n#: yadisk.objects._resources.ResourceObject:6\n#: yadisk.objects._resources.SyncPublicResourceObject:6\n#: yadisk.objects._resources.SyncResourceObject:6\n#: yadisk.objects._resources.SyncTrashResourceObject:6\n#: yadisk.objects._resources.TrashResourceObject:6\nmsgid \"`str`, antivirus check status\"\nmsgstr \"`str`, статус проверки антивирусом\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:7\n#: yadisk.objects._resources.AsyncResourceObject:7\n#: yadisk.objects._resources.AsyncTrashResourceObject:7\n#: yadisk.objects._resources.PublicResourceObject:7\n#: yadisk.objects._resources.ResourceObject:7\n#: yadisk.objects._resources.SyncPublicResourceObject:7\n#: yadisk.objects._resources.SyncResourceObject:7\n#: yadisk.objects._resources.SyncTrashResourceObject:7\n#: yadisk.objects._resources.TrashResourceObject:7\nmsgid \"`str`, download URL\"\nmsgstr \"`str`, URL для скачивания файла\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:8\n#: yadisk.objects._resources.AsyncResourceObject:8\n#: yadisk.objects._resources.AsyncTrashResourceObject:8\n#: yadisk.objects._resources.PublicResourceObject:8\n#: yadisk.objects._resources.ResourceObject:8\n#: yadisk.objects._resources.SyncPublicResourceObject:8\n#: yadisk.objects._resources.SyncResourceObject:8\n#: yadisk.objects._resources.SyncTrashResourceObject:8\n#: yadisk.objects._resources.TrashResourceObject:8\nmsgid \"`int`, file size\"\nmsgstr \"`int`, размер файла\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:9\n#: yadisk.objects._resources.AsyncResourceObject:9\n#: yadisk.objects._resources.AsyncTrashResourceObject:9\n#: yadisk.objects._resources.PublicResourceObject:9\n#: yadisk.objects._resources.ResourceObject:9\n#: yadisk.objects._resources.SyncPublicResourceObject:9\n#: yadisk.objects._resources.SyncResourceObject:9\n#: yadisk.objects._resources.SyncTrashResourceObject:9\n#: yadisk.objects._resources.TrashResourceObject:9\nmsgid \"`str`, public resource key\"\nmsgstr \"`str`, публичный ключ\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:10\n#: yadisk.objects._resources.AsyncResourceObject:10\n#: yadisk.objects._resources.AsyncTrashResourceObject:10\n#: yadisk.objects._resources.PublicResourceObject:10\n#: yadisk.objects._resources.ResourceObject:10\n#: yadisk.objects._resources.SyncPublicResourceObject:10\n#: yadisk.objects._resources.SyncResourceObject:10\n#: yadisk.objects._resources.SyncTrashResourceObject:10\n#: yadisk.objects._resources.TrashResourceObject:10\nmsgid \"`str`, SHA256 hash\"\nmsgstr \"`str`, SHA256 хэш\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:11\n#: yadisk.objects._resources.AsyncResourceObject:11\n#: yadisk.objects._resources.AsyncTrashResourceObject:11\n#: yadisk.objects._resources.PublicResourceObject:11\n#: yadisk.objects._resources.ResourceObject:11\n#: yadisk.objects._resources.SyncPublicResourceObject:11\n#: yadisk.objects._resources.SyncResourceObject:11\n#: yadisk.objects._resources.SyncTrashResourceObject:11\n#: yadisk.objects._resources.TrashResourceObject:11\nmsgid \"`str`, MD5 hash\"\nmsgstr \"`str`, MD5 хэш\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:12\nmsgid \":any:`AsyncPublicResourceObject`, list of nested resources\"\nmsgstr \":any:`AsyncPublicResourceObject`, список вложенных ресурсов\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:13\n#: yadisk.objects._resources.AsyncResourceObject:13\n#: yadisk.objects._resources.AsyncTrashResourceObject:13\n#: yadisk.objects._resources.PublicResourceObject:13\n#: yadisk.objects._resources.ResourceObject:13\n#: yadisk.objects._resources.SyncPublicResourceObject:13\n#: yadisk.objects._resources.SyncResourceObject:13\n#: yadisk.objects._resources.SyncTrashResourceObject:13\n#: yadisk.objects._resources.TrashResourceObject:13\nmsgid \"`str`, filename\"\nmsgstr \"`str`, имя файла\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:14\n#: yadisk.objects._resources.AsyncResourceObject:14\n#: yadisk.objects._resources.AsyncTrashResourceObject:14\n#: yadisk.objects._resources.PublicResourceObject:14\n#: yadisk.objects._resources.ResourceObject:14\n#: yadisk.objects._resources.SyncPublicResourceObject:14\n#: yadisk.objects._resources.SyncResourceObject:14\n#: yadisk.objects._resources.SyncTrashResourceObject:14\n#: yadisk.objects._resources.TrashResourceObject:14\nmsgid \":any:`EXIFObject`, EXIF metadata\"\nmsgstr \":any:`EXIFObject`, метаданные EXIF\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:15\n#: yadisk.objects._resources.AsyncResourceObject:15\n#: yadisk.objects._resources.AsyncTrashResourceObject:15\n#: yadisk.objects._resources.PublicResourceObject:15\n#: yadisk.objects._resources.ResourceObject:15\n#: yadisk.objects._resources.SyncPublicResourceObject:15\n#: yadisk.objects._resources.SyncResourceObject:15\n#: yadisk.objects._resources.SyncTrashResourceObject:15\n#: yadisk.objects._resources.TrashResourceObject:15\nmsgid \"`str`, resource ID\"\nmsgstr \"`str`, идентификатор ресурса\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:16\n#: yadisk.objects._resources.AsyncResourceObject:16\n#: yadisk.objects._resources.AsyncTrashResourceObject:16\n#: yadisk.objects._resources.PublicResourceObject:16\n#: yadisk.objects._resources.ResourceObject:16\n#: yadisk.objects._resources.SyncPublicResourceObject:16\n#: yadisk.objects._resources.SyncResourceObject:16\n#: yadisk.objects._resources.SyncTrashResourceObject:16\n#: yadisk.objects._resources.TrashResourceObject:16\nmsgid \"`dict`, custom resource properties\"\nmsgstr \"`dict`, пользовательские свойства ресурса\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:17\n#: yadisk.objects._resources.AsyncResourceObject:17\n#: yadisk.objects._resources.AsyncTrashResourceObject:17\n#: yadisk.objects._resources.PublicResourceObject:17\n#: yadisk.objects._resources.ResourceObject:17\n#: yadisk.objects._resources.SyncPublicResourceObject:17\n#: yadisk.objects._resources.SyncResourceObject:17\n#: yadisk.objects._resources.SyncTrashResourceObject:17\n#: yadisk.objects._resources.TrashResourceObject:17\nmsgid \"`str`, public URL\"\nmsgstr \"`str`, публичный URL\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:18\n#: yadisk.objects._resources.AsyncResourceObject:18\n#: yadisk.objects._resources.AsyncTrashResourceObject:18\n#: yadisk.objects._resources.PublicResourceObject:18\n#: yadisk.objects._resources.ResourceObject:18\n#: yadisk.objects._resources.SyncPublicResourceObject:18\n#: yadisk.objects._resources.SyncResourceObject:18\n#: yadisk.objects._resources.SyncTrashResourceObject:18\n#: yadisk.objects._resources.TrashResourceObject:18\nmsgid \":any:`ShareInfoObject`, shared folder information\"\nmsgstr \":any:`ShareInfoObject`, информация об общей папке\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:19\n#: yadisk.objects._resources.AsyncResourceObject:19\n#: yadisk.objects._resources.AsyncTrashResourceObject:19\n#: yadisk.objects._resources.PublicResourceObject:19\n#: yadisk.objects._resources.ResourceObject:19\n#: yadisk.objects._resources.SyncPublicResourceObject:19\n#: yadisk.objects._resources.SyncResourceObject:19\n#: yadisk.objects._resources.SyncTrashResourceObject:19\n#: yadisk.objects._resources.TrashResourceObject:19\nmsgid \":any:`datetime.datetime`, date of last modification\"\nmsgstr \":any:`datetime.datetime`, дата последнего изменения\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:20\n#: yadisk.objects._resources.AsyncResourceObject:20\n#: yadisk.objects._resources.AsyncTrashResourceObject:20\n#: yadisk.objects._resources.PublicResourceObject:20\n#: yadisk.objects._resources.ResourceObject:20\n#: yadisk.objects._resources.SyncPublicResourceObject:20\n#: yadisk.objects._resources.SyncResourceObject:20\n#: yadisk.objects._resources.SyncTrashResourceObject:20\n#: yadisk.objects._resources.TrashResourceObject:20\nmsgid \":any:`datetime.datetime`, date of creation\"\nmsgstr \":any:`datetime.datetime`, дата создания\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:21\n#: yadisk.objects._resources.AsyncResourceObject:21\n#: yadisk.objects._resources.AsyncTrashResourceObject:21\n#: yadisk.objects._resources.PublicResourceObject:21\n#: yadisk.objects._resources.ResourceObject:21\n#: yadisk.objects._resources.SyncPublicResourceObject:21\n#: yadisk.objects._resources.SyncResourceObject:21\n#: yadisk.objects._resources.SyncTrashResourceObject:21\n#: yadisk.objects._resources.TrashResourceObject:21\nmsgid \":any:`datetime.datetime`, photo/video creation date\"\nmsgstr \":any:`datetime.datetime`, дата создания фото/видео\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:22\n#: yadisk.objects._resources.AsyncResourceObject:22\n#: yadisk.objects._resources.AsyncTrashResourceObject:22\n#: yadisk.objects._resources.PublicResourceObject:22\n#: yadisk.objects._resources.ResourceObject:22\n#: yadisk.objects._resources.SyncPublicResourceObject:22\n#: yadisk.objects._resources.SyncResourceObject:22\n#: yadisk.objects._resources.SyncTrashResourceObject:22\n#: yadisk.objects._resources.TrashResourceObject:22\nmsgid \"`str`, MIME type\"\nmsgstr \"`str`, MIME-тип\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:23\n#: yadisk.objects._resources.AsyncResourceLinkObject:9\n#: yadisk.objects._resources.AsyncResourceObject:23\n#: yadisk.objects._resources.AsyncTrashResourceObject:23\n#: yadisk.objects._resources.PublicResourceObject:23\n#: yadisk.objects._resources.ResourceLinkObject:9\n#: yadisk.objects._resources.ResourceObject:23\n#: yadisk.objects._resources.SyncPublicResourceObject:23\n#: yadisk.objects._resources.SyncResourceLinkObject:9\n#: yadisk.objects._resources.SyncResourceObject:23\n#: yadisk.objects._resources.SyncTrashResourceObject:23\n#: yadisk.objects._resources.TrashResourceObject:23\nmsgid \"`str`, path to the resource\"\nmsgstr \"`str`, путь к ресурсу\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:24\n#: yadisk.objects._resources.AsyncResourceObject:24\n#: yadisk.objects._resources.AsyncTrashResourceObject:24\n#: yadisk.objects._resources.PublicResourceObject:24\n#: yadisk.objects._resources.ResourceObject:24\n#: yadisk.objects._resources.SyncPublicResourceObject:24\n#: yadisk.objects._resources.SyncResourceObject:24\n#: yadisk.objects._resources.SyncTrashResourceObject:24\n#: yadisk.objects._resources.TrashResourceObject:24\nmsgid \"`str`, file preview URL\"\nmsgstr \"`str`, URL превью файла\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:25\n#: yadisk.objects._resources.AsyncResourceObject:25\n#: yadisk.objects._resources.AsyncTrashResourceObject:25\n#: yadisk.objects._resources.PublicResourceObject:25\n#: yadisk.objects._resources.ResourceObject:25\n#: yadisk.objects._resources.SyncPublicResourceObject:25\n#: yadisk.objects._resources.SyncResourceObject:25\n#: yadisk.objects._resources.SyncTrashResourceObject:25\n#: yadisk.objects._resources.TrashResourceObject:25\nmsgid \":any:`CommentIDsObject`, comment IDs\"\nmsgstr \":any:`CommentIDsObject`, идентификаторы комментариев\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:26\n#: yadisk.objects._resources.AsyncResourceObject:26\n#: yadisk.objects._resources.AsyncTrashResourceObject:26\n#: yadisk.objects._resources.PublicResourceObject:26\n#: yadisk.objects._resources.ResourceObject:26\n#: yadisk.objects._resources.SyncPublicResourceObject:26\n#: yadisk.objects._resources.SyncResourceObject:26\n#: yadisk.objects._resources.SyncTrashResourceObject:26\n#: yadisk.objects._resources.TrashResourceObject:26\nmsgid \"`str`, type (\\\"file\\\" or \\\"dir\\\")\"\nmsgstr \"`str`, тип (\\\"file\\\" или \\\"dir\\\")\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:27\n#: yadisk.objects._resources.AsyncResourceObject:27\n#: yadisk.objects._resources.AsyncTrashResourceObject:27\n#: yadisk.objects._resources.PublicResourceObject:27\n#: yadisk.objects._resources.ResourceObject:27\n#: yadisk.objects._resources.SyncPublicResourceObject:27\n#: yadisk.objects._resources.SyncResourceObject:27\n#: yadisk.objects._resources.SyncTrashResourceObject:27\n#: yadisk.objects._resources.TrashResourceObject:27\nmsgid \"`str`, file type as determined by Yandex.Disk\"\nmsgstr \"`str`, тип файла, согласно Яндекс.Диску\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:28\n#: yadisk.objects._resources.AsyncResourceObject:28\n#: yadisk.objects._resources.AsyncTrashResourceObject:28\n#: yadisk.objects._resources.PublicResourceObject:28\n#: yadisk.objects._resources.ResourceObject:28\n#: yadisk.objects._resources.SyncPublicResourceObject:28\n#: yadisk.objects._resources.SyncResourceObject:28\n#: yadisk.objects._resources.SyncTrashResourceObject:28\n#: yadisk.objects._resources.TrashResourceObject:28\nmsgid \"`int`, Yandex.Disk revision at the time of last modification\"\nmsgstr \"`int`, ревизия Яндекс.Диска на момент последнего изменения\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:29\n#: yadisk.objects._resources.PublicResourceObject:29\n#: yadisk.objects._resources.SyncPublicResourceObject:29\nmsgid \"`int`, number of times the public resource was viewed\"\nmsgstr \"`int`, количество просмотров публичного ресурса\"\n\n#: of yadisk.objects._resources.AsyncPublicResourceObject:30\n#: yadisk.objects._resources.PublicResourceObject:30\n#: yadisk.objects._resources.SyncPublicResourceObject:30\nmsgid \":any:`UserPublicInfoObject`, owner of the public resource\"\nmsgstr \":any:`UserPublicInfoObject`, владелец публичного ресурса\"\n\n#: of yadisk.objects._resources.AsyncPublicResourcesListObject:1\n#: yadisk.objects._resources.SyncPublicResourcesListObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._resources.PublicResourcesListObject`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.PublicResourcesListObject`\"\n\n#: of yadisk.objects._resources.AsyncPublicResourcesListObject:6\nmsgid \"`list`, list of public resources (:any:`AsyncPublicResourceObject`)\"\nmsgstr \"`list`, список публичных ресурсов (:any:`AsyncPublicResourceObject`)\"\n\n#: of yadisk.objects._resources.AsyncPublicResourcesListObject:7\n#: yadisk.objects._resources.PublicResourcesListObject:7\n#: yadisk.objects._resources.SyncPublicResourcesListObject:7\nmsgid \"`str`, resource type to filter by\"\nmsgstr \"`str`, тип ресурса по которому фильтровать\"\n\n#: of yadisk.objects._resources.AsyncResourceLinkObject:1\nmsgid \"\"\n\"Bases: :py:class:`~yadisk.objects._resources.ResourceLinkObject`, \"\n\":py:class:`~yadisk.objects._resources.AsyncResourceObjectMethodsMixin`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.ResourceLinkObject`, \"\n\":py:class:`~yadisk.objects._resources.AsyncResourceObjectMethodsMixin`\"\n\n#: of yadisk.objects._resources.AsyncResourceLinkObject:1\n#: yadisk.objects._resources.ResourceLinkObject:1\n#: yadisk.objects._resources.SyncResourceLinkObject:1\nmsgid \"Resource link object.\"\nmsgstr \"Объект ссылки на ресурс.\"\n\n#: of yadisk.objects._resources.AsyncResourceListObject:1\n#: yadisk.objects._resources.PublicResourceListObject:1\n#: yadisk.objects._resources.SyncResourceListObject:1\n#: yadisk.objects._resources.TrashResourceListObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._resources.ResourceListObject`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.objects._resources.ResourceListObject`\"\n\n#: of yadisk.objects._resources.AsyncResourceListObject:1\n#: yadisk.objects._resources.ResourceListObject:1\n#: yadisk.objects._resources.SyncResourceListObject:1\nmsgid \"List of resources.\"\nmsgstr \"Список ресурсов.\"\n\n#: of yadisk.objects._resources.AsyncResourceObject:1\nmsgid \"\"\n\"Bases: :py:class:`~yadisk.objects._resources.ResourceObject`, \"\n\":py:class:`~yadisk.objects._resources.AsyncResourceObjectMethodsMixin`\"\nmsgstr \"\"\n\"Базовые классы: :py:class:`~yadisk.objects._resources.ResourceObject`, \"\n\":py:class:`~yadisk.objects._resources.AsyncResourceObjectMethodsMixin`\"\n\n#: of yadisk.objects._resources.AsyncResourceObject:1\n#: yadisk.objects._resources.ResourceObject:1\n#: yadisk.objects._resources.SyncResourceObject:1\nmsgid \"Resource object.\"\nmsgstr \"Объект ресурса.\"\n\n#: of yadisk.objects._resources.AsyncResourceObject:12\nmsgid \":any:`AsyncResourceListObject`, list of nested resources\"\nmsgstr \":any:`AsyncResourceListObject`, список вложенных ресурсов\"\n\n#: of yadisk.objects._resources.AsyncResourceObject:29\n#: yadisk.objects._resources.AsyncTrashResourceObject:31\n#: yadisk.objects._resources.ResourceObject:29\n#: yadisk.objects._resources.SyncResourceObject:29\n#: yadisk.objects._resources.SyncTrashResourceObject:31\n#: yadisk.objects._resources.TrashResourceObject:31\nmsgid \"\"\n\"`dict[str, str]`, mapping of all preview sizes, where keys are names and \"\n\"values are download links\"\nmsgstr \"\"\n\"`dict[str, str]`, соответствие всех размеров превью, где ключи - названия\"\n\" размеров, а значения - ссылки для скачивания превью\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceListObject:1\n#: yadisk.objects._resources.SyncTrashResourceListObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._resources.TrashResourceListObject`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.TrashResourceListObject`\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceListObject:1\n#: yadisk.objects._resources.SyncTrashResourceListObject:1\n#: yadisk.objects._resources.TrashResourceListObject:1\nmsgid \"List of trash resources.\"\nmsgstr \"Список ресурсов корзины.\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceListObject:7\nmsgid \"`list`, list of resources (:any:`AsyncTrashResourceObject`)\"\nmsgstr \"`list`, список ресурсов (:any:`AsyncTrashResourceObject`)\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject:1\n#: yadisk.objects._resources.SyncTrashResourceObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._resources.TrashResourceObject`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.objects._resources.TrashResourceObject`\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject:1\n#: yadisk.objects._resources.SyncTrashResourceObject:1\n#: yadisk.objects._resources.TrashResourceObject:1\nmsgid \"Trash resource object.\"\nmsgstr \"Объект ресурса корзины.\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject:12\nmsgid \":any:`AsyncTrashResourceListObject`, list of nested resources\"\nmsgstr \":any:`AsyncTrashResourceListObject`, список вложенных ресурсов\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject:29\n#: yadisk.objects._resources.SyncTrashResourceObject:29\n#: yadisk.objects._resources.TrashResourceObject:29\nmsgid \"`str`, original path\"\nmsgstr \"`str`, оригинальный путь\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject:30\n#: yadisk.objects._resources.SyncTrashResourceObject:30\n#: yadisk.objects._resources.TrashResourceObject:30\nmsgid \":any:`datetime.datetime`, date of deletion\"\nmsgstr \":any:`datetime.datetime`, дата удаления\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.exists:1\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:1\nmsgid \"Check whether the trash resource exists.\"\nmsgstr \"Проверяет, существует ли ресурс в корзине.\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.exists:3\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_meta:3\n#: yadisk.objects._resources.AsyncTrashResourceObject.get_type:3\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_dir:3\n#: yadisk.objects._resources.AsyncTrashResourceObject.is_file:3\n#: yadisk.objects._resources.SyncTrashResourceObject.exists:3\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:3\n#: yadisk.objects._resources.SyncTrashResourceObject.get_type:3\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:3\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:3\nmsgid \"`str` or `None`, relative path to the trash resource\"\nmsgstr \"`str` или `None`, относительный путь к ресурсу\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.is_dir:1\n#: yadisk.objects._resources.SyncTrashResourceObject.is_dir:1\nmsgid \"Check whether resource is a trash directory.\"\nmsgstr \"Проверяет, является ли ресурс папкой в корзине.\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.is_file:1\n#: yadisk.objects._resources.SyncTrashResourceObject.is_file:1\nmsgid \"Check whether resource is a trash file.\"\nmsgstr \"Проверяет, является ли ресурс файлом в корзине.\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.listdir:3\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:3\nmsgid \"`str` or `None`, relative path to the directory in the trash bin\"\nmsgstr \"`str` или `None`, относительный путь к папке в корзине\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.listdir:23\nmsgid \"generator of :any:`AsyncTrashResourceObject`\"\nmsgstr \"генератор :any:`AsyncTrashResourceObject`\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.remove:3\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:3\nmsgid \"`str` or `None`, relative path to the trash resource to be deleted\"\nmsgstr \"\"\n\"`str` или `None`, относительный путь к ресурсу корзины, подлежащий \"\n\"удалению\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.restore:4\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:4\nmsgid \"This method takes 1 or 2 positional arguments:\"\nmsgstr \"Данный метод принимает 1 или 2 позиционных аргумента:\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.restore:6\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:6\nmsgid \":code:`restore(dst_path, /, **kwargs)`\"\nmsgstr \":code:`restore(dst_path, /, **kwargs)`\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.restore:7\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:7\nmsgid \":code:`restore(relative_path=None, dst_path, /, **kwargs)`\"\nmsgstr \":code:`restore(relative_path=None, dst_path, /, **kwargs)`\"\n\n#: of yadisk.objects._resources.AsyncTrashResourceObject.restore:9\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:9\nmsgid \"`str` or `None`, relative path to the trash resource to be restored\"\nmsgstr \"`str` или `None`, относительный путь к восстанавливаему ресурсу\"\n\n#: of yadisk.objects._auth.DeviceCodeObject:1\n#: yadisk.objects._auth.TokenObject:1\n#: yadisk.objects._auth.TokenRevokeStatusObject:1\n#: yadisk.objects._disk.DiskInfoObject:1\n#: yadisk.objects._disk.SystemFoldersObject:1 yadisk.objects._disk.UserObject:1\n#: yadisk.objects._error_object.ErrorObject:1\n#: yadisk.objects._link_object.LinkObject:1\n#: yadisk.objects._operations.OperationStatusObject:1\n#: yadisk.objects._resources.AvailableUntilVerboseObject:1\n#: yadisk.objects._resources.CommentIDsObject:1\n#: yadisk.objects._resources.EXIFObject:1\n#: yadisk.objects._resources.ExternalOrganizationIdVerboseObject:1\n#: yadisk.objects._resources.FilesResourceListObject:1\n#: yadisk.objects._resources.LastUploadedResourceListObject:1\n#: yadisk.objects._resources.PasswordVerboseObject:1\n#: yadisk.objects._resources.PublicAccessObject:1\n#: yadisk.objects._resources.PublicAvailableSettingsObject:1\n#: yadisk.objects._resources.PublicDefaultObject:1\n#: yadisk.objects._resources.PublicResourcesListObject:1\n#: yadisk.objects._resources.PublicSettingsObject:1\n#: yadisk.objects._resources.ResourceListObject:1\n#: yadisk.objects._resources.ResourceObject:1\n#: yadisk.objects._resources.ShareInfoObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._yadisk_object.YaDiskObject`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.objects._yadisk_object.YaDiskObject`\"\n\n#: of yadisk.objects._resources.AvailableUntilVerboseObject:1\n#: yadisk.types.AvailableUntilVerbose:1\nmsgid \"Verbose information about the expiration date of a shared resource.\"\nmsgstr \"Развёрнутая информация о дате истечения доступа\"\n\n#: of yadisk.objects._resources.AvailableUntilVerboseObject:3\n#: yadisk.types.AvailableUntilVerbose:3\nmsgid \"`bool`, whether the expiration date is enabled\"\nmsgstr \"`bool`, признак наличия даты истечения\"\n\n#: of yadisk.objects._resources.AvailableUntilVerboseObject:4\nmsgid \"`int`, timestamp of the expiration date\"\nmsgstr \"`int`, дата (timestamp) истечения ссылки\"\n\n#: of yadisk.objects._resources.CommentIDsObject:1\nmsgid \"Comment IDs object.\"\nmsgstr \"Список идентификаторов комментариев.\"\n\n#: of yadisk.objects._link_object.LinkObject:4\n#: yadisk.objects._operations.OperationLinkObject:4\n#: yadisk.objects._resources.CommentIDsObject:4\n#: yadisk.objects._resources.EXIFObject:4\n#: yadisk.objects._resources.FilesResourceListObject:4\n#: yadisk.objects._resources.LastUploadedResourceListObject:4\n#: yadisk.objects._resources.PublicResourceLinkObject:4\n#: yadisk.objects._resources.PublicResourceListObject:4\n#: yadisk.objects._resources.PublicResourceObject:4\n#: yadisk.objects._resources.PublicResourcesListObject:4\n#: yadisk.objects._resources.ResourceDownloadLinkObject:4\n#: yadisk.objects._resources.ResourceLinkObject:4\n#: yadisk.objects._resources.ResourceListObject:4\n#: yadisk.objects._resources.ResourceObject:4\n#: yadisk.objects._resources.ResourceUploadLinkObject:4\n#: yadisk.objects._resources.ShareInfoObject:4\n#: yadisk.objects._resources.TrashResourceListObject:4\n#: yadisk.objects._resources.TrashResourceObject:4\nmsgid \":any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\"\nmsgstr \":any:`Client`/:any:`AsyncClient` или `None`, объект `YaDisk`\"\n\n#: of yadisk.objects._resources.CommentIDsObject:6\nmsgid \"`str`, comment ID for private resources\"\nmsgstr \"`str`, идентификатор комментария для приватных ресурсов\"\n\n#: of yadisk.objects._resources.CommentIDsObject:7\nmsgid \"`str`, comment ID for public resources\"\nmsgstr \"`str`, идентификатор комментария для публичных ресурсов\"\n\n#: of yadisk.objects._auth.DeviceCodeObject:1\nmsgid \"\"\n\"Result of :any:`Client.get_device_code()` / \"\n\":any:`AsyncClient.get_device_code()`.\"\nmsgstr \"\"\n\"Результат :any:`Client.get_device_code()` / \"\n\":any:`AsyncClient.get_device_code()`.\"\n\n#: of yadisk.objects._auth.DeviceCodeObject:4\n#: yadisk.objects._auth.TokenObject:4\n#: yadisk.objects._auth.TokenRevokeStatusObject:4\n#: yadisk.objects._disk.DiskInfoObject:4\n#: yadisk.objects._disk.SystemFoldersObject:4 yadisk.objects._disk.UserObject:4\n#: yadisk.objects._disk.UserPublicInfoObject:5\n#: yadisk.objects._operations.OperationStatusObject:4\n#: yadisk.objects._yadisk_object.YaDiskObject:6\nmsgid \":any:`YaDisk` or `None`, `YaDisk` object\"\nmsgstr \":any:`YaDisk` или `None`, объект `YaDisk`\"\n\n#: of yadisk.objects._auth.DeviceCodeObject:6\nmsgid \"`str`, device code that can be used for obtaining the token\"\nmsgstr \"`str`, код устройства, который может быть использован для получения токена\"\n\n#: of yadisk.objects._auth.DeviceCodeObject:7\nmsgid \"`str`, code that the user should enter on the OAuth page\"\nmsgstr \"`str`, код, который пользователь должен ввести на странице OAuth\"\n\n#: of yadisk.objects._auth.DeviceCodeObject:8\nmsgid \"\"\n\"`str`, URL of the OAuth page where user is expected to enter the \"\n\":code:`user_code`\"\nmsgstr \"\"\n\"`str`, URL страницы OAuth, на которой пользователь должен ввести \"\n\":code:`user_code`\"\n\n#: of yadisk.objects._auth.DeviceCodeObject:10\nmsgid \"\"\n\"`int`, the minimum interval (in seconds) with which the app must request \"\n\"an OAuth token. If requests come more often, Yandex OAuth may respond \"\n\"with an error\"\nmsgstr \"\"\n\"`int`, минимальный интервал времени (в секундах), с которым приложение \"\n\"должно запрашивать OAuth токен. Если запросы будут поступать чаще, Яндекс\"\n\" OAuth может вернуть ошибку\"\n\n#: of yadisk.objects._auth.DeviceCodeObject:13\nmsgid \"`int`, amount of time before the codes expire\"\nmsgstr \"`int`, количество времени, после которого коды истекают\"\n\n#: of yadisk.objects._disk.DiskInfoObject:1\nmsgid \"Disk information object.\"\nmsgstr \"Объект информации о диске.\"\n\n#: of yadisk.objects._disk.DiskInfoObject:6\nmsgid \"`int`, number of days before file deletion after account lock\"\nmsgstr \"`int`, количество дней до удаления файлов после блокировки\"\n\n#: of yadisk.objects._disk.DiskInfoObject:7\nmsgid \"`int`, timestamp in ms of expiration date of unlimited photo upload\"\nmsgstr \"`int`, timestamp в мс окончания бесплатного места в фотобезлимите\"\n\n#: of yadisk.objects._disk.DiskInfoObject:9\nmsgid \"`bool`, tells whether the screenshots are hidden in photoslice\"\nmsgstr \"`bool`, настройка скрытия скриншотов у пользователя\"\n\n#: of yadisk.objects._disk.DiskInfoObject:11\n#: yadisk.objects._disk.DiskInfoObject:12\nmsgid \"`bool`, not clear what this is for\"\nmsgstr \"`bool`, не ясно, для чего это\"\n\n#: of yadisk.objects._disk.DiskInfoObject:13\nmsgid \"`bool`, tells if the account belongs to a legal entity\"\nmsgstr \"`bool`, признак принадлежности пользователя к юридическому лицу\"\n\n#: of yadisk.objects._disk.DiskInfoObject:14\nmsgid \"`bool`, tells if the account is paid or not\"\nmsgstr \"`bool`, признак платного аккаунта\"\n\n#: of yadisk.objects._disk.DiskInfoObject:15\nmsgid \"`int`, maximum supported file size (bytes)\"\nmsgstr \"`int`, максимальный поддерживаемый размер файла (в байтах)\"\n\n#: of yadisk.objects._disk.DiskInfoObject:16\nmsgid \"`int`, maximum supported file size for a paid account (bytes)\"\nmsgstr \"\"\n\"`int`, максимальный поддерживаемый размер файла для платного аккаунта (в \"\n\"байтах)\"\n\n#: of yadisk.objects._disk.DiskInfoObject:17\nmsgid \"`bool`, tells if the user is involved in `payment_flow`\"\nmsgstr \"`bool`, признак причастности пользователя к payment_flow\"\n\n#: of yadisk.objects._disk.DiskInfoObject:18\nmsgid \"`int`, total file size in unlimited photos\"\nmsgstr \"`int`, общий размер файлов в фотобезлимите\"\n\n#: of yadisk.objects._disk.DiskInfoObject:19 yadisk.objects._disk.UserObject:6\nmsgid \":any:`datetime.datetime`, Disk registration date\"\nmsgstr \":any:`datetime.datetime`, дата регистрации\"\n\n#: of yadisk.objects._disk.DiskInfoObject:20\nmsgid \"`int`, current revision of Yandex.Disk\"\nmsgstr \"`int`, текущая ревизия Яндекс.Диска\"\n\n#: of yadisk.objects._disk.DiskInfoObject:21\nmsgid \":any:`SystemFoldersObject`, paths to the system folders\"\nmsgstr \":any:`SystemFoldersObject`, пути к системным папкам\"\n\n#: of yadisk.objects._disk.DiskInfoObject:22\nmsgid \"`int`, total disk size (bytes)\"\nmsgstr \"`int`, общий размер диска (в байтах)\"\n\n#: of yadisk.objects._disk.DiskInfoObject:23\nmsgid \"`int`, amount of space used by trash (bytes), part of `used_space`\"\nmsgstr \"`int`, размер, занятый мусором (в байтах), часть `used_space`\"\n\n#: of yadisk.objects._disk.DiskInfoObject:24\nmsgid \"`bool`, tells whether unlimited autoupload from mobile devices is enabled\"\nmsgstr \"`bool`, признак включенной безлимитной автозагрузки с мобильных устройств\"\n\n#: of yadisk.objects._disk.DiskInfoObject:26\nmsgid \"`int`, amount of space used (bytes)\"\nmsgstr \"`int`, количество занятого места (в байтах)\"\n\n#: of yadisk.objects._disk.DiskInfoObject:27\nmsgid \":any:`UserObject`, owner of the disk\"\nmsgstr \":any:`UserObject`, владелец диска\"\n\n#: of yadisk.objects._disk.DiskInfoObject:28\nmsgid \"\"\n\"`bool`, tells if the user will be in overdraft upon reaching \"\n\"`free_photounlim_end_date`\"\nmsgstr \"\"\n\"`bool`, признак - будет ли пользователь в овердрафте по достижении \"\n\"free_photounlim_end_date\"\n\n#: of yadisk.objects._resources.EXIFObject:1\nmsgid \"EXIF metadata object.\"\nmsgstr \"Объект метаданных EXIF.\"\n\n#: of yadisk.objects._resources.EXIFObject:6\nmsgid \":any:`datetime.datetime`, capture date\"\nmsgstr \":any:`datetime.datetime`, дата съёмки\"\n\n#: of yadisk.objects._resources.EXIFObject:7\nmsgid \"`float`, longitude of the photo's location\"\nmsgstr \"`str`, координата съёмки (долгота)\"\n\n#: of yadisk.objects._resources.EXIFObject:8\nmsgid \"`float`, latitude of the photo's location\"\nmsgstr \"`str`, координата съёмки (широта)\"\n\n#: of yadisk.objects._error_object.ErrorObject:1\nmsgid \"Mirrors Yandex.Disk REST API error object.\"\nmsgstr \"Реализует объект ошибки REST API Яндекс.Диска.\"\n\n#: of yadisk.objects._error_object.ErrorObject:4\nmsgid \"`YaDisk` or `None`, `YaDisk` object\"\nmsgstr \"`YaDisk` или `None`, объект `YaDisk`\"\n\n#: of yadisk.objects._error_object.ErrorObject:6\nmsgid \"`str`, human-readable error message\"\nmsgstr \"`str`, человеко-читаемое сообщение ошибки\"\n\n#: of yadisk.objects._error_object.ErrorObject:7\nmsgid \"`str`, technical error description\"\nmsgstr \"`str`, техническое описание ошибки\"\n\n#: of yadisk.objects._error_object.ErrorObject:8\nmsgid \"`str`, error code\"\nmsgstr \"`str`, уникальный код ошибки\"\n\n#: of yadisk.objects._resources.ExternalOrganizationIdVerboseObject:1\n#: yadisk.types.ExternalOrganizationIdVerbose:1\nmsgid \"\"\n\"Verbose information about the external organization ID of a shared \"\n\"resource.\"\nmsgstr \"\"\n\"Развёрнутая информация об идентификаторе внешней организации общего \"\n\"ресурса\"\n\n#: of yadisk.objects._resources.ExternalOrganizationIdVerboseObject:3\n#: yadisk.types.ExternalOrganizationIdVerbose:3\nmsgid \"`bool`, whether the external organization ID is enabled\"\nmsgstr \"`bool`, признак наличия идентификатора внешней организации\"\n\n#: of yadisk.objects._resources.ExternalOrganizationIdVerboseObject:4\n#: yadisk.objects._resources.PublicSettingsObject:8\n#: yadisk.types.ExternalOrganizationIdVerbose:4 yadisk.types.PublicSettings:10\nmsgid \"`str`, external organization ID\"\nmsgstr \"`str`, идентификатор внешней организации\"\n\n#: of yadisk.objects._resources.FilesResourceListObject:6\nmsgid \"`list`, flat list of files (:any:`ResourceObject`)\"\nmsgstr \"`list`, плоский список файлов (:any:`ResourceObject`)\"\n\n#: of yadisk.objects._resources.LastUploadedResourceListObject:6\n#: yadisk.objects._resources.PublicResourceListObject:7\n#: yadisk.objects._resources.ResourceListObject:7\nmsgid \"`list`, list of resources (:any:`ResourceObject`)\"\nmsgstr \"`list`, список ресурсов (:any:`ResourceObject`)\"\n\n#: of yadisk.objects._link_object.LinkObject:1\nmsgid \"Link object.\"\nmsgstr \"Объект ссылки.\"\n\n#: of yadisk.objects._operations.OperationLinkObject:1\n#: yadisk.objects._resources.PublicResourceLinkObject:1\n#: yadisk.objects._resources.ResourceDownloadLinkObject:1\n#: yadisk.objects._resources.ResourceLinkObject:1\n#: yadisk.objects._resources.ResourceUploadLinkObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._link_object.LinkObject`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.objects._link_object.LinkObject`\"\n\n#: of yadisk.objects._operations.OperationStatusObject:1\nmsgid \"Operation status object.\"\nmsgstr \"Объект статуса операции.\"\n\n#: of yadisk.objects._auth.TokenRevokeStatusObject:6\n#: yadisk.objects._operations.OperationStatusObject:6\nmsgid \"`str`, status of the operation\"\nmsgstr \"`str`, статус операции\"\n\n#: of yadisk.objects._resources.PasswordVerboseObject:1\nmsgid \"Verbose information about the password of shared resource.\"\nmsgstr \"Развёрнутая информация о пароле общего ресурса.\"\n\n#: of yadisk.objects._resources.PasswordVerboseObject:3\n#: yadisk.types.PasswordVerbose:3\nmsgid \"`bool`, whether the password is enabled\"\nmsgstr \"`bool`, признак активности пароля\"\n\n#: of yadisk.objects._resources.PasswordVerboseObject:4\nmsgid \"`str`, password value\"\nmsgstr \"`str`, значения пароля\"\n\n#: of yadisk.objects._resources.PublicAccessObject:1\n#: yadisk.objects._resources.PublicDefaultObject:1\n#: yadisk.types.PublicSettingsAccess:1\nmsgid \"Access settings of a shared resource.\"\nmsgstr \"Настройки доступа общего ресурса.\"\n\n#: of yadisk.objects._resources.PublicAccessObject:3\n#: yadisk.objects._resources.PublicDefaultObject:3\n#: yadisk.types.PublicSettingsAccess:3\nmsgid \"\"\n\"`List[Union[Literal[\\\"employees\\\"], Literal[\\\"all\\\"]]],`, specifies who \"\n\"has access to the shared resource, must contain only one element\"\nmsgstr \"\"\n\"`List[Union[Literal[\\\"employees\\\"], Literal[\\\"all\\\"]]],`, определяет кто \"\n\"имеет доступ к общему ресурсу, может содержать только один элемент\"\n\n#: of yadisk.objects._resources.PublicAccessObject:6\nmsgid \"`str`, specifies the type of access, must be one of the following:\"\nmsgstr \"`str`, указывает тип доступа, должен быть один из следующих:\"\n\n#: of yadisk.objects._resources.PublicAccessObject:8\nmsgid \"`macro`: access for all employees or all users\"\nmsgstr \"`macro`: доступ для всех сотрудников или пользователей\"\n\n#: of yadisk.objects._resources.PublicAccessObject:9\nmsgid \"`user`: access for a specific user\"\nmsgstr \"`user`: доступ для конкретного пользователя\"\n\n#: of yadisk.objects._resources.PublicAccessObject:10\nmsgid \"`group`: access for a specific group\"\nmsgstr \"`group`: доступ для конкретной группы\"\n\n#: of yadisk.objects._resources.PublicAccessObject:11\nmsgid \"`department`: access for a specific department\"\nmsgstr \"`department`: доступ для конкретного подразделения\"\n\n#: of yadisk.objects._resources.PublicAccessObject:13\n#: yadisk.objects._resources.PublicDefaultObject:6\n#: yadisk.types.PublicSettingsAccess:6\nmsgid \"`int`, organization ID\"\nmsgstr \"`str`, идентификатор организации\"\n\n#: of yadisk.objects._resources.PublicAccessObject:14\nmsgid \"`str`, user, group or department ID\"\nmsgstr \"`str`, пользователь, группа или идентификатор подразделения\"\n\n#: of yadisk.objects._resources.PublicAccessObject:15\n#: yadisk.objects._resources.PublicDefaultObject:7\nmsgid \"`List[str]`, specifies the access rights\"\nmsgstr \"`List[str]`, описывает права доступа\"\n\n#: of yadisk.objects._resources.PublicAccessObject:17\n#: yadisk.objects._resources.PublicDefaultObject:9\n#: yadisk.types.PublicSettingsAccess:12\nmsgid \"Valid access rights:\"\nmsgstr \"Доступные права доступа:\"\n\n#: of yadisk.objects._resources.PublicAccessObject:19\n#: yadisk.objects._resources.PublicDefaultObject:11\n#: yadisk.types.PublicSettingsAccess:14\nmsgid \"`write`: write access\"\nmsgstr \"`write`: редактирование\"\n\n#: of yadisk.objects._resources.PublicAccessObject:20\n#: yadisk.objects._resources.PublicDefaultObject:12\n#: yadisk.types.PublicSettingsAccess:15\nmsgid \"`read`: read access\"\nmsgstr \"`read`: просмотр\"\n\n#: of yadisk.objects._resources.PublicAccessObject:21\n#: yadisk.objects._resources.PublicDefaultObject:13\n#: yadisk.types.PublicSettingsAccess:16\nmsgid \"`read_without_download`: read access without download\"\nmsgstr \"`read_without_download`: просмотр без возможности скачивания\"\n\n#: of yadisk.objects._resources.PublicAccessObject:22\n#: yadisk.objects._resources.PublicDefaultObject:14\n#: yadisk.types.PublicSettingsAccess:17\nmsgid \"`read_with_password`: read access with password\"\nmsgstr \"`read_with_password`: просмотр с доступом по паролю\"\n\n#: of yadisk.objects._resources.PublicAccessObject:23\n#: yadisk.objects._resources.PublicDefaultObject:15\n#: yadisk.types.PublicSettingsAccess:18\nmsgid \"\"\n\"`read_with_password_without_download`: read access with password and \"\n\"without download\"\nmsgstr \"\"\n\"`read_with_password_without_download`: просмотр с доступом по паролю без \"\n\"возможности скачивания\"\n\n#: of yadisk.objects._resources.PublicAvailableSettingsObject:1\nmsgid \"Public settings of a shared resource for the current OAuth token owner.\"\nmsgstr \"Cписок настроек доступа к ресурсу для владельца OAuth-токена\"\n\n#: of yadisk.objects._resources.PublicAvailableSettingsObject:3\nmsgid \"`List[str]`, list of available permissions\"\nmsgstr \"`List[str]`, список доступных разрешений\"\n\n#: of yadisk.objects._resources.PublicAvailableSettingsObject:4\n#: yadisk.objects._resources.PublicAvailableSettingsObject:11\nmsgid \"\"\n\"`str`, specifies who has access to the shared resource, must be one of \"\n\"the following:  - `all`: access for all users - `inner`: access for all \"\n\"employees\"\nmsgstr \"\"\n\"`str`, определяет кто имеет доступ к общему ресурсу, значение должно быть\"\n\" одним из следующих:  - `all`: доступ для всех пользователей - `inner`: \"\n\"доступ для всех сотрудников\"\n\n#: of yadisk.objects._resources.PublicAvailableSettingsObject:4\n#: yadisk.objects._resources.PublicAvailableSettingsObject:11\nmsgid \"\"\n\"`str`, specifies who has access to the shared resource, must be one of \"\n\"the following:\"\nmsgstr \"\"\n\"`str`, определяет кто имеет доступ к общему ресурсу, значение должно быть\"\n\" одним из следующих:\"\n\n#: of yadisk.objects._resources.PublicAvailableSettingsObject:7\n#: yadisk.objects._resources.PublicAvailableSettingsObject:14\nmsgid \"`all`: access for all users\"\nmsgstr \"`all`: доступ для всех пользователей\"\n\n#: of yadisk.objects._resources.PublicAvailableSettingsObject:8\n#: yadisk.objects._resources.PublicAvailableSettingsObject:15\nmsgid \"`inner`: access for all employees\"\nmsgstr \"`inner`: доступ для всех сотрудников\"\n\n#: of yadisk.objects._resources.PublicAvailableSettingsObject:10\nmsgid \"`bool`, whether the resource can be shared\"\nmsgstr \"\"\n\"`bool`, признак возможности предоставлять персональный доступ на \"\n\"опубликованный ресурс.\"\n\n#: of yadisk.objects._resources.PublicAvailableSettingsObject:17\nmsgid \"`List[PublicDefault]`, default public settings\"\nmsgstr \"`List[PublicDefault]`, настройки доступа по умолчанию\"\n\n#: of yadisk.objects._resources.PublicResourceObject:1\n#: yadisk.objects._resources.TrashResourceObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._resources.ResourceObject`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.objects._resources.ResourceObject`\"\n\n#: of yadisk.objects._resources.PublicResourceObject:12\nmsgid \":any:`PublicResourceObject`, list of nested resources\"\nmsgstr \":any:`PublicResourceObject`, список вложенных ресурсов\"\n\n#: of yadisk.objects._resources.PublicResourcesListObject:6\nmsgid \"`list`, list of public resources (:any:`PublicResourceObject`)\"\nmsgstr \"`list`, список публичных ресурсов (:any:`PublicResourceObject`)\"\n\n#: of yadisk.objects._resources.PublicSettingsObject:1\nmsgid \"Public settings of a shared resource.\"\nmsgstr \"Настройки доступа к общему ресурсу.\"\n\n#: of yadisk.objects._resources.PublicSettingsObject:3\n#: yadisk.types.PublicSettings:5\nmsgid \"`int`, timestamp indicating the expiration date of the link\"\nmsgstr \"`int`, timestamp даты истечения ссылки\"\n\n#: of yadisk.objects._resources.PublicSettingsObject:4\n#: yadisk.types.PublicSettings:6\nmsgid \"`bool`, whether the resource is read-only\"\nmsgstr \"`bool`, признак того, что ссылка доступна только на чтение\"\n\n#: of yadisk.objects._resources.PublicSettingsObject:5\nmsgid \"\"\n\":any:`AvailableUntilVerboseObject`, verbose information about the \"\n\"expiration date\"\nmsgstr \"\"\n\":any:`AvailableUntilVerboseObject`, развёрнутая информация о дате \"\n\"истечения доступа\"\n\n#: of yadisk.objects._resources.PublicSettingsObject:6\n#: yadisk.types.PasswordVerbose:4 yadisk.types.PublicSettings:8\nmsgid \"`str`, password to access the resource\"\nmsgstr \"`str`, пароль для доступа к ресурсу\"\n\n#: of yadisk.objects._resources.PublicSettingsObject:7\nmsgid \":any:`PasswordVerboseObject`, verbose information about the password\"\nmsgstr \":any:`PasswordVerboseObject`, развёрнутая информация о пароле\"\n\n#: of yadisk.objects._resources.PublicSettingsObject:9\nmsgid \"\"\n\":any:`ExternalOrganizationIdVerboseObject`, verbose information about the\"\n\" external organization ID\"\nmsgstr \"\"\n\":any:`ExternalOrganizationIdVerboseObject`, развёрнутая информация о \"\n\"идентификаторе внешней организации\"\n\n#: of yadisk.objects._resources.PublicSettingsObject:11\nmsgid \"`List[PublicSettingsAccessObject]`, list of access settings\"\nmsgstr \"`List[PublicSettingsAccessObject]`, список настроек доступа\"\n\n#: of yadisk.objects._resources.ResourceDownloadLinkObject:1\nmsgid \"Resource download link.\"\nmsgstr \"Ссылка для скачивания ресурса.\"\n\n#: of yadisk.objects._resources.ResourceObject:12\nmsgid \":any:`ResourceListObject`, list of nested resources\"\nmsgstr \":any:`ResourceListObject`, список вложенных ресурсов\"\n\n#: of yadisk.objects._resources.ResourceUploadLinkObject:1\nmsgid \"Resource upload link.\"\nmsgstr \"Ссылка для загрузки файла.\"\n\n#: of yadisk.objects._resources.ResourceUploadLinkObject:6\nmsgid \"`str`, ID of the upload operation\"\nmsgstr \"`str`, идентификатор операции по загрузке файла\"\n\n#: of yadisk.objects._resources.ShareInfoObject:1\nmsgid \"Shared folder information object.\"\nmsgstr \"Объект информации об общей папке.\"\n\n#: of yadisk.objects._resources.ShareInfoObject:6\nmsgid \"`bool`, tells whether the folder is root\"\nmsgstr \"`bool`, признак того, что папка является корневой\"\n\n#: of yadisk.objects._resources.ShareInfoObject:7\nmsgid \"`bool`, tells whether the user is the owner of this directory\"\nmsgstr \"`bool`, признак того, что пользователь является владельцем этой папки\"\n\n#: of yadisk.objects._resources.ShareInfoObject:8\nmsgid \"`str`, access rights\"\nmsgstr \"`str`, права доступа\"\n\n#: of yadisk.objects._operations.SyncOperationLinkObject:4\n#: yadisk.objects._resources.SyncFilesResourceListObject:4\n#: yadisk.objects._resources.SyncLastUploadedResourceListObject:4\n#: yadisk.objects._resources.SyncPublicResourceLinkObject:4\n#: yadisk.objects._resources.SyncPublicResourceListObject:4\n#: yadisk.objects._resources.SyncPublicResourceObject:4\n#: yadisk.objects._resources.SyncPublicResourcesListObject:4\n#: yadisk.objects._resources.SyncResourceLinkObject:4\n#: yadisk.objects._resources.SyncResourceListObject:4\n#: yadisk.objects._resources.SyncResourceObject:4\n#: yadisk.objects._resources.SyncTrashResourceListObject:4\n#: yadisk.objects._resources.SyncTrashResourceObject:4\nmsgid \":any:`Client` or `None`, `YaDisk` object\"\nmsgstr \":any:`Client` или `None`, объект `YaDisk`\"\n\n#: of yadisk.objects._resources.SyncFilesResourceListObject:6\nmsgid \"`list`, flat list of files (:any:`SyncResourceObject`)\"\nmsgstr \"`list`, плоский список файлов (:any:`SyncResourceObject`)\"\n\n#: of yadisk.objects._resources.SyncLastUploadedResourceListObject:6\n#: yadisk.objects._resources.SyncPublicResourceListObject:7\n#: yadisk.objects._resources.SyncResourceListObject:7\nmsgid \"`list`, list of resources (:any:`SyncResourceObject`)\"\nmsgstr \"`list`, список ресурсов (:any:`SyncResourceObject`)\"\n\n#: of yadisk._client.Client.wait_for_operation:1\n#: yadisk.objects._operations.SyncOperationLinkObject.wait:1\nmsgid \"\"\n\"Wait until an operation is completed. If the operation fails, an \"\n\"exception is raised. Waiting is performed by calling :any:`time.sleep`.\"\nmsgstr \"\"\n\"Ждёт, пока операция не будет выполнена. Если операция не удалась, \"\n\"вызывает исключение. Ожидание осуществляется с помощью вызова \"\n\":any:`time.sleep`.\"\n\n#: of yadisk.objects._resources.SyncPublicResourceLinkObject:1\nmsgid \"\"\n\"Bases: :py:class:`~yadisk.objects._resources.PublicResourceLinkObject`, \"\n\":py:class:`~yadisk.objects._resources.ResourceObjectMethodsMixin`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.PublicResourceLinkObject`, \"\n\":py:class:`~yadisk.objects._resources.ResourceObjectMethodsMixin`\"\n\n#: of yadisk.objects._resources.SyncPublicResourceObject:1\nmsgid \"\"\n\"Bases: :py:class:`~yadisk.objects._resources.PublicResourceObject`, \"\n\":py:class:`~yadisk.objects._resources.ResourceObjectMethodsMixin`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.PublicResourceObject`, \"\n\":py:class:`~yadisk.objects._resources.ResourceObjectMethodsMixin`\"\n\n#: of yadisk.objects._resources.SyncPublicResourceObject:12\nmsgid \":any:`SyncPublicResourceObject`, list of nested resources\"\nmsgstr \":any:`SyncPublicResourceObject`, список вложенных ресурсов\"\n\n#: of yadisk.objects._resources.SyncPublicResourcesListObject:6\nmsgid \"`list`, list of public resources (:any:`SyncPublicResourceObject`)\"\nmsgstr \"`list`, список публичных ресурсов (:any:`SyncPublicResourceObject`)\"\n\n#: of yadisk.objects._resources.SyncResourceLinkObject:1\nmsgid \"\"\n\"Bases: :py:class:`~yadisk.objects._resources.ResourceLinkObject`, \"\n\":py:class:`~yadisk.objects._resources.ResourceObjectMethodsMixin`\"\nmsgstr \"\"\n\"Базовые классы: \"\n\":py:class:`~yadisk.objects._resources.ResourceLinkObject`, \"\n\":py:class:`~yadisk.objects._resources.ResourceObjectMethodsMixin`\"\n\n#: of yadisk.objects._resources.SyncResourceObject:1\nmsgid \"\"\n\"Bases: :py:class:`~yadisk.objects._resources.ResourceObject`, \"\n\":py:class:`~yadisk.objects._resources.ResourceObjectMethodsMixin`\"\nmsgstr \"\"\n\"Базовые классы: :py:class:`~yadisk.objects._resources.ResourceObject`, \"\n\":py:class:`~yadisk.objects._resources.ResourceObjectMethodsMixin`\"\n\n#: of yadisk.objects._resources.SyncResourceObject:12\nmsgid \":any:`SyncResourceListObject`, list of nested resources\"\nmsgstr \":any:`SyncResourceListObject`, список вложенных ресурсов\"\n\n#: of yadisk.objects._resources.SyncTrashResourceListObject:7\nmsgid \"`list`, list of resources (:any:`SyncTrashResourceObject`)\"\nmsgstr \"`list`, список ресурсов (:any:`SyncTrashResourceObject`)\"\n\n#: of yadisk.objects._resources.SyncTrashResourceObject:12\nmsgid \":any:`SyncTrashResourceListObject`, list of nested resources\"\nmsgstr \":any:`SyncTrashResourceListObject`, список вложенных ресурсов\"\n\n#: of yadisk._client.Client.get_trash_meta:28\n#: yadisk.objects._resources.SyncTrashResourceObject.get_meta:23\nmsgid \":any:`SyncTrashResourceObject`\"\nmsgstr \":any:`SyncTrashResourceObject`\"\n\n#: of yadisk._client.Client.trash_listdir:24\n#: yadisk.objects._resources.SyncTrashResourceObject.listdir:24\nmsgid \"generator of :any:`SyncTrashResourceObject`\"\nmsgstr \"генератор :any:`SyncTrashResourceObject`\"\n\n#: of yadisk._client.Client.remove:38 yadisk._client.Client.remove_trash:34\n#: yadisk.objects._resources.SyncTrashResourceObject.remove:29\nmsgid \"\"\n\":any:`SyncOperationLinkObject` if the operation is performed \"\n\"asynchronously, `None` otherwise\"\nmsgstr \"\"\n\":any:`SyncOperationLinkObject`, если операция выполняется асинхронно, \"\n\"иначе `None`\"\n\n#: of yadisk._client.Client.copy:42 yadisk._client.Client.move:37\n#: yadisk._client.Client.rename:34 yadisk._client.Client.restore_trash:38\n#: yadisk._client.Client.save_to_disk:41\n#: yadisk.objects._resources.SyncTrashResourceObject.restore:38\nmsgid \":any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\"\nmsgstr \":any:`SyncResourceLinkObject` или :any:`SyncOperationLinkObject`\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:1\nmsgid \"Object, containing paths to system folders.\"\nmsgstr \"Объект, содержащий пути к системным папкам.\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:6\nmsgid \"`str`, path to the Odnoklassniki folder\"\nmsgstr \"`str`, путь к папке Одноклассников\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:7\nmsgid \"`str`, path to the Google+ folder\"\nmsgstr \"`str`, путь к папке Google+\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:8\nmsgid \"`str`, path to the Instagram folder\"\nmsgstr \"`str`, путь к папке Instagram\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:9\nmsgid \"`str`, path to the VKontakte folder\"\nmsgstr \"`str`, путь к папке ВКонтакте\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:10\nmsgid \"`str`, path to the mail attachments folder\"\nmsgstr \"`str`, путь к папке \\\"Почтовые вложения\\\"\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:11\nmsgid \"`str`, path to the My World folder\"\nmsgstr \"`str`, путь к папке Моего Мира\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:12\nmsgid \"`str`, path to the Downloads folder\"\nmsgstr \"`str`, путь к папке \\\"Загрузки\\\"\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:13\nmsgid \"`str` path to the Applications folder\"\nmsgstr \"`str`, путь к папке \\\"Приложения\\\"\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:14\nmsgid \"`str`, path to the Facebook folder\"\nmsgstr \"`str`, путь к папке Facebook\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:15\nmsgid \"`str`, path to the social networks folder\"\nmsgstr \"`str`, путь к папке социальных сетей\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:16\nmsgid \"`str`, path to the Messenger Files folder\"\nmsgstr \"`str`, путь к папке \\\"Файлы Мессенджера\\\"\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:17\nmsgid \"`str`, path to the Meeting Materials folder\"\nmsgstr \"`str`, путь к папке \\\"Материалы встреч\\\"\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:18\nmsgid \"`str`, path to the camera folder\"\nmsgstr \"`str`, путь к папке фотокамеры\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:19\nmsgid \"`str`, path to the screenshot folder\"\nmsgstr \"`str`, путь к папке скриншотов\"\n\n#: of yadisk.objects._disk.SystemFoldersObject:20\nmsgid \"`str`, path to the Scans folder\"\nmsgstr \"`str`, путь к папке \\\"Сканы\\\"\"\n\n#: of yadisk.objects._auth.TokenObject:1\nmsgid \"Token object.\"\nmsgstr \"Объект токена.\"\n\n#: of yadisk.objects._auth.TokenObject:6\nmsgid \"`str`, token string\"\nmsgstr \"`str`, строка токена\"\n\n#: of yadisk.objects._auth.TokenObject:7\nmsgid \"`str`, the refresh-token\"\nmsgstr \"`str`, refresh-токен\"\n\n#: of yadisk.objects._auth.TokenObject:8\nmsgid \"`str`, type of the token\"\nmsgstr \"`str`, тип токена\"\n\n#: of yadisk.objects._auth.TokenObject:9\nmsgid \"`int`, amount of time before the token expires\"\nmsgstr \"`int`, количество времени, на которое выдаётся токен\"\n\n#: of yadisk.objects._auth.TokenObject:10\nmsgid \"\"\n\"`str`, list of rights requested by the application, returned only if the \"\n\"token has a smaller set of rights than requested\"\nmsgstr \"\"\n\"`str`, список прав, запрашиваемых приложением, возвращается только если \"\n\"токен обладает меньшим набором прав, чем было запрошено\"\n\n#: of yadisk.objects._auth.TokenRevokeStatusObject:1\nmsgid \"Result of token revocation request.\"\nmsgstr \"Результат запроса по отзыву токена.\"\n\n#: of yadisk.objects._resources.TrashResourceListObject:7\nmsgid \"`list`, list of resources (:any:`TrashResourceObject`)\"\nmsgstr \"`list`, список ресурсов (:any:`TrashResourceObject`)\"\n\n#: of yadisk.objects._resources.TrashResourceObject:12\nmsgid \":any:`TrashResourceListObject`, list of nested resources\"\nmsgstr \":any:`ResourceListObject`, список вложенных ресурсов\"\n\n#: of yadisk.objects._disk.UserObject:1\nmsgid \"User object.\"\nmsgstr \"Объект пользователя.\"\n\n#: of yadisk.objects._disk.UserObject:7\n#: yadisk.objects._disk.UserPublicInfoObject:8\nmsgid \"`str`, user's display name\"\nmsgstr \"`str`, отображаемое имя пользователя\"\n\n#: of yadisk.objects._disk.UserObject:8\n#: yadisk.objects._disk.UserPublicInfoObject:9\nmsgid \"`str`, user's UID\"\nmsgstr \"`str`, уникальный идентификатор пользователя\"\n\n#: of yadisk.objects._disk.UserObject:9\nmsgid \"`str`, user's country\"\nmsgstr \"`str`, страна пользователя\"\n\n#: of yadisk.objects._disk.UserObject:10\nmsgid \"`bool`, tells whether it's a child account\"\nmsgstr \"`bool`, признак того, что аккаунт является детским\"\n\n#: of yadisk.objects._disk.UserObject:11\n#: yadisk.objects._disk.UserPublicInfoObject:7\nmsgid \"`str`, user's login\"\nmsgstr \"`str`, логин пользователя\"\n\n#: of yadisk.objects._disk.UserPublicInfoObject:1\nmsgid \"Bases: :py:class:`~yadisk.objects._disk.UserObject`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk.objects._disk.UserObject`\"\n\n#: of yadisk.objects._disk.UserPublicInfoObject:1\nmsgid \"\"\n\"Public user information object. Inherits from :any:`UserObject` for \"\n\"compatibility.\"\nmsgstr \"\"\n\"Публичная информация о пользователе. Наследуется от :any:`UserObject` для\"\n\" совместимости.\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject:1\nmsgid \"Bases: :py:class:`object`\"\nmsgstr \"Базовые классы: :py:class:`object`\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject:1\nmsgid \"\"\n\"Base class for all objects mirroring the ones returned by Yandex.Disk \"\n\"REST API. It must have a fixed number of fields, each field must have a \"\n\"type. It also supports subscripting and access of fields through the . \"\n\"operator.\"\nmsgstr \"\"\n\"Базовый класс для всех объектов, реализующий объекты, возвращаемые REST \"\n\"API Яндекс.Диска. У наследующего объекта фиксированное количество полей, \"\n\"каждое со своим типом. Поддерживает доступ по индексу и через точку.\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.__matmul__:1\nmsgid \"\"\n\"The :code:`@` operator. Same as :any:`YaDiskObject.field()`. Can be used \"\n\"like this:\"\nmsgstr \"\"\n\"Оператор :code:`@`. Делает то же самое, что \"\n\":any:`YaDiskObject.field()`.Может быть использован следующим образом:\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.__matmul__:10\n#: yadisk.objects._yadisk_object.YaDiskObject.field:4\nmsgid \"`str`, name of the field\"\nmsgstr \"`str`, имя поля\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.__matmul__:12\n#: yadisk.objects._yadisk_object.YaDiskObject.field:6\nmsgid \"value of the given field is :code:`None`\"\nmsgstr \"значение требуемого поля - :code:`None`\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.__matmul__:14\n#: yadisk.objects._yadisk_object.YaDiskObject.field:8\nmsgid \"field's value\"\nmsgstr \"значение поля\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.field:1\nmsgid \"\"\n\"Get value of field `name`, guarantee it's not :code:`None` or raise a \"\n\":any:`ValueError`.\"\nmsgstr \"\"\n\"Получает значение поля `name`, гарантируя, что оно не :code:`None` или \"\n\"вызывает :any:`ValueError` в противном случае\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.import_fields:1\nmsgid \"\"\n\"Set all the fields of the object to the values in `source_dict`. All the \"\n\"other fields are ignored\"\nmsgstr \"\"\n\"Задаёт значения всех полей объекта из `source_dict`. Все остальные ключи \"\n\"игнорируются.\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.import_fields:4\nmsgid \"`dict` or `None` (nothing will be done in that case)\"\nmsgstr \"`dict` или `None` (тогда ничего не будет сделано)\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.remove_alias:1\nmsgid \"Remove an alias.\"\nmsgstr \"Удаляет псевдоним.\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.remove_field:1\nmsgid \"Remove field.\"\nmsgstr \"Удаляет поле.\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.set_alias:1\nmsgid \"Set an alias.\"\nmsgstr \"Задаёт псевдоним.\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.set_alias:3\nmsgid \"`str`, alias to add\"\nmsgstr \"`str`, псевдоним\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.set_alias:4\nmsgid \"`str`, field name\"\nmsgstr \"`str`, имя поля\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.set_field_type:1\nmsgid \"Set field type.\"\nmsgstr \"Задаёт тип поля.\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.set_field_type:4\nmsgid \"type or factory\"\nmsgstr \"тип данных или factory\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.set_field_types:1\nmsgid \"Set the field types of the object\"\nmsgstr \"Задаёт типы полей объекта\"\n\n#: of yadisk.objects._yadisk_object.YaDiskObject.set_field_types:3\nmsgid \"`dict`, where keys are the field names and values are types (or factories)\"\nmsgstr \"`dict`, где ключи - это наименования полей, а значения - это типы\"\n\n#: ../../api_reference/session_interface.rst:2\nmsgid \"Session Interface\"\nmsgstr \"Интерфейс Session\"\n\n#: ../../api_reference/session_interface.rst:4\nmsgid \"\"\n\"The :any:`Session` and :any:`AsyncSession` are abstract classes that act \"\n\"as adapters to underlying HTTP client libraries. A session instance is \"\n\"used by :any:`Client` or :any:`AsyncClient` to perform all the HTTP \"\n\"requests to the Yandex.Disk API.\"\nmsgstr \"\"\n\":any:`Session` и :any:`AsyncSession` - абстрактные классы, которые \"\n\"работают в качестве адаптеров для нижележащих HTTP библиотек. Экземпляр \"\n\"сессии используется в :any:`Client` или :any:`AsyncSession` для \"\n\"выполнения всех HTTP запросов к API Яндекс.Диска.\"\n\n#: ../../api_reference/session_interface.rst:8\nmsgid \"\"\n\"These interfaces can be implemented to add support for any HTTP library. \"\n\"For a concrete example, see the source code of any existing \"\n\"implementation (e.g. :any:`HTTPXSession`).\"\nmsgstr \"\"\n\"Эти интерфейсы могут быть реализованы, чтобы добавить поддержку любой \"\n\"HTTP библиотеки. Для конкретного примера см. исходный код любой из \"\n\"существующих реализаций (например, :any:`HTTPXSession`).\"\n\n#: ../../api_reference/session_interface.rst:13\nmsgid \"Synchronous\"\nmsgstr \"Синхронный\"\n\n#: of yadisk._async_session.AsyncSession:1 yadisk._session.Session:1\nmsgid \"\"\n\"HTTP session class. Maintains open connections, stores headers and some \"\n\"other request parameters.\"\nmsgstr \"\"\n\"Класс HTTP сессии. Поддерживает открытые соединения, хранит заданные \"\n\"заголовки и некоторые другие параметры запросов.\"\n\n#: of yadisk._async_session.AsyncSession:4 yadisk._session.Session:4\nmsgid \"Must be explicitly closed (can be done using the `with` statement).\"\nmsgstr \"\"\n\"Должен быть явным образом закрыт (может быть сделано с помощью \"\n\"конструкции `with`).\"\n\n#: of yadisk._async_session.AsyncSession.close:1\n#: yadisk._session.Session.close:1\nmsgid \"Closes the session.\"\nmsgstr \"Закрывает сессию.\"\n\n#: of yadisk._async_session.AsyncResponse.close:4\n#: yadisk._async_session.AsyncResponse.download:4\n#: yadisk._async_session.AsyncResponse.json:4\n#: yadisk._async_session.AsyncSession.close:4\n#: yadisk._async_session.AsyncSession.send_request:8\n#: yadisk._session.Response.close:4 yadisk._session.Response.download:4\n#: yadisk._session.Response.json:4 yadisk._session.Session.close:4\n#: yadisk._session.Session.send_request:8\nmsgid \"This is an abstract method that needs to be implemented.\"\nmsgstr \"Это абстрактный метод, который необходимо реализовать.\"\n\n#: of yadisk._async_session.AsyncSession.send_request:1\n#: yadisk._session.Session.send_request:1\nmsgid \"\"\n\"Sends an HTTP request with given parameters. In case an error occurs, the\"\n\" method should throw one of exceptions derived from :any:`YaDiskError`. \"\n\"Additional keyword arguments may be passed, they may be forwarded to the \"\n\"underlying HTTP client without modification.\"\nmsgstr \"\"\n\"Отправляет HTTP запрос с указанными параметрами. В случае ошибки, метод \"\n\"должен вызвать одно из исключений, основанных на :any:`YaDiskError`. \"\n\"Могут быть указаны дополнительные keyword-аргументы, они могут быть \"\n\"напрямую переданы в нижележащий HTTP клиент без изменений.\"\n\n#: of yadisk._async_session.AsyncSession.send_request:11\n#: yadisk._session.Session.send_request:11\nmsgid \"`str`, URL\"\nmsgstr \"`str`, URL\"\n\n#: of yadisk._async_session.AsyncSession.send_request:12\n#: yadisk._session.Session.send_request:12\nmsgid \"`dict`, GET parameters\"\nmsgstr \"`dict`, GET параметры\"\n\n#: of yadisk._session.Session.send_request:13\nmsgid \"\"\n\"`bytes`, an iterator or a file-like object, data to be sent in the \"\n\"request body\"\nmsgstr \"\"\n\"`bytes`, итератор или файл-подобный объект, данные, которые будут \"\n\"отправлены в теле запроса\"\n\n#: of yadisk._async_session.AsyncSession.send_request:15\n#: yadisk._session.Session.send_request:14\nmsgid \"`dict`, additional headers to be set\"\nmsgstr \"`dict`, дополнительные заголовки\"\n\n#: of yadisk._async_session.AsyncSession.send_request:16\n#: yadisk._session.Session.send_request:15\nmsgid \"\"\n\"request timeout, a `tuple` of `(read timeout, connect timeout)`, `float` \"\n\"or `None` (no timeout)\"\nmsgstr \"\"\n\"таймаут запроса, `tuple` вида `(read timeout, connect timeout)`, `float` \"\n\"или `None` (без таймаута)\"\n\n#: of yadisk._async_session.AsyncSession.send_request:18\n#: yadisk._session.Session.send_request:17\nmsgid \"`bool`, if `False`, the response content will be immediately downloaded\"\nmsgstr \"`bool`, если `False`, содержимое ответа будет сразу целиком скачано\"\n\n#: of yadisk._async_session.AsyncSession.send_request:20\n#: yadisk._session.Session.send_request:19\nmsgid \":any:`Response`, response object\"\nmsgstr \":any:`Response`, объект ответа\"\n\n#: of yadisk._async_session.AsyncResponse:1 yadisk._session.Response:1\nmsgid \"Represents an HTTP response.\"\nmsgstr \"Представляет собой ответ HTTP.\"\n\n#: of yadisk._async_session.AsyncResponse:3 yadisk._session.Response:3\nmsgid \"\"\n\"In case an error occurs, methods of this class should throw one of \"\n\"exceptions derived from :any:`YaDiskError`.\"\nmsgstr \"\"\n\"В случае, если возникает ошибка, методы данного классы должны вызвать \"\n\"одно из исключений, основанных на :any:`YaDiskError`.\"\n\n#: of yadisk._async_session.AsyncResponse:6 yadisk._session.Response:6\nmsgid \"`int`, HTTP status code\"\nmsgstr \"`int`, HTTP код статуса\"\n\n#: of yadisk._session.Response.close:1\nmsgid \"Closes the response and releases the underlying connection into the pool\"\nmsgstr \"Закрывает ответ и освобождает лежащее в основе соединение в пул\"\n\n#: of yadisk._async_session.AsyncResponse.download:1\n#: yadisk._session.Response.download:1\nmsgid \"Downloads response's content.\"\nmsgstr \"Скачивает содержимое ответа.\"\n\n#: of yadisk._session.Response.download:6\nmsgid \"\"\n\"function, takes one parameter - chunk of data (bytes), consumes the chunk\"\n\" (e.g. by writing to a file)\"\nmsgstr \"\"\n\"функция, принимает 1 параметр - фрагмент данных (bytes), потребляет этот \"\n\"фрагмент (например, записывает его в файл)\"\n\n#: of yadisk._async_session.AsyncResponse.download:10\n#: yadisk._async_session.AsyncResponse.json:6\n#: yadisk._session.Response.download:9 yadisk._session.Response.json:6\nmsgid \"could not receive the response's body\"\nmsgstr \"не удалось получить тело ответа\"\n\n#: of yadisk._async_session.AsyncResponse.get_exception:1\n#: yadisk._session.Response.get_exception:1\nmsgid \"Convenience wrapper for :any:`yadisk.utils.get_exception`.\"\nmsgstr \"Обёртка над :any:`yadisk.utils.get_exception` для удобства.\"\n\n#: of yadisk._async_session.AsyncResponse.get_exception:3\n#: yadisk._session.Response.get_exception:3\nmsgid \":any:`YaDiskError`\"\nmsgstr \":any:`YaDiskError`\"\n\n#: of yadisk._async_session.AsyncResponse.json:1\n#: yadisk._session.Response.json:1\nmsgid \"Returns JSON-content of the response (parses JSON).\"\nmsgstr \"Возвращает JSON, содержащийся в ответе (парсит JSON).\"\n\n#: of yadisk._async_session.AsyncResponse.json:7\n#: yadisk._session.Response.json:7\nmsgid \"could not parse JSON\"\nmsgstr \"не удалось обработать JSON\"\n\n#: of yadisk._async_session.AsyncResponse.json:9\n#: yadisk._session.Response.json:9\nmsgid \"`dict`, `list`, `str`, `int`, `float` or `None`\"\nmsgstr \"`dict`, `list`, `str`, `int`, `float` или `None`\"\n\n#: ../../api_reference/session_interface.rst:22\nmsgid \"Asynchronous\"\nmsgstr \"Асинхронный\"\n\n#: of yadisk._async_session.AsyncSession.send_request:13\nmsgid \"\"\n\"`bytes`, iterator (possibly async) or a file-like object (possible \"\n\"async), data to be sent in the request body\"\nmsgstr \"\"\n\"`bytes`, итератор (возможно асинхронный) или файл-подобный объект \"\n\"(возможно асинхронный), данные, которые будут отправлены в теле запроса\"\n\n#: of yadisk._async_session.AsyncResponse.close:1\nmsgid \"Closes the response and releases the underlying connection into the pool.\"\nmsgstr \"Закрывает запрос и освобождает лежащее в основе соединение в пул.\"\n\n#: of yadisk._async_session.AsyncResponse.download:6\nmsgid \"\"\n\"regular or async function, takes one parameter - chunk of data (bytes), \"\n\"consumes the chunk (e.g. by writing to a file)\"\nmsgstr \"\"\n\"обычная или асинхронная функция, принимает 1 параметр - фрагмент данных \"\n\"(bytes), потребляет этот фрагмент данных (например, записывает его в \"\n\"файл)\"\n\n#: ../../api_reference/sessions.rst:2\nmsgid \"Available Session Implementations\"\nmsgstr \"Доступные реализации сессий\"\n\n#: ../../api_reference/sessions.rst:4\nmsgid \"\"\n\"You can choose which HTTP library will be used by :any:`Client` and \"\n\":any:`AsyncClient` by specifying the :code:`session` parameter. Below you\"\n\" can see the list of session implementations that are shipped with the \"\n\":code:`yadisk` library.\"\nmsgstr \"\"\n\"Вы можете выбрать, какая HTTP библиотека будет использоваться в \"\n\":any:`Client` и :any:`AsyncClient`, указав параметр :code:`session`. Ниже\"\n\" вы можете найти список реализаций сессий, поставляемых вместе с \"\n\"библиотекой.\"\n\n#: ../../api_reference/sessions.rst:8\nmsgid \"\"\n\"Alternatively, you can make your own :any:`Session`/:any:`AsyncSession` \"\n\"implementation. For a concrete example, take a look at the source code of\"\n\" any existing implementations (e.g. :any:`HTTPXSession`).\"\nmsgstr \"\"\n\"Вы также можете сделать собственную реализацию \"\n\":any:`Session`/:any:`AsyncSession`. Для конкретного примера, см. исходный\"\n\" код любой из существующих реализаций (например, :any:`HTTPXSession`).\"\n\n#: ../../api_reference/sessions.rst:12\nmsgid \"Synchronous Implementations\"\nmsgstr \"Синхронные реализации\"\n\n#: of yadisk.sessions.httpx_session.HTTPXSession:1\n#: yadisk.sessions.pycurl_session.PycURLSession:1\n#: yadisk.sessions.requests_session.RequestsSession:1\nmsgid \"Bases: :py:class:`~yadisk._session.Session`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk._session.Session`\"\n\n#: of yadisk.sessions.requests_session.RequestsSession:3\nmsgid \":any:`Session` implementation using the `requests`_ library.\"\nmsgstr \"Реализация :any:`Session` с помощью библиотеки `requests`_.\"\n\n#: of yadisk.sessions.requests_session.RequestsSession:5\nmsgid \"\"\n\"All arguments passed in the constructor are directly forwared to \"\n\":any:`requests.Session`.\"\nmsgstr \"\"\n\"Все аргументы, переданные конструкторе напрямую передаются в \"\n\":any:`requests.Session`.\"\n\n#: of yadisk.sessions.requests_session.RequestsSession:7\nmsgid \"underlying instance of :any:`requests.Session`\"\nmsgstr \"лежащий в основе объект :any:`requests.Session`\"\n\n#: of yadisk.sessions.requests_session.RequestsSession:10\nmsgid \"\"\n\"Internally, this class creates thread-local instances of \"\n\":any:`requests.Session`, since it is not currently guaranteed to be \"\n\"thread safe. Calling :any:`Session.close()` will close all thread-local \"\n\"sessions managed by this object.\"\nmsgstr \"\"\n\"Внутри данный класс создаёт локальные для потоков экземпляры \"\n\":any:`requests.Session`, т.к. на данный момент нет гарантии их \"\n\"потокобезопасности. Вызов :any:`Session.close()` закрывает все сессии, \"\n\"управляемые данным объектом.\"\n\n#: of yadisk.sessions.requests_session.RequestsSession:16\nmsgid \"\"\n\"To pass `requests`-specific arguments from :any:`Client` use \"\n\":code:`requests_args` keyword argument.\"\nmsgstr \"\"\n\"Для того чтобы передать специфичные для `requests` аргументы из \"\n\":any:`Client` используйте keyword-аргумент :code:`requests_args`.\"\n\n#: of yadisk.sessions.aiohttp_session.AIOHTTPSession:11\n#: yadisk.sessions.async_httpx_session.AsyncHTTPXSession:13\n#: yadisk.sessions.httpx_session.HTTPXSession:13\n#: yadisk.sessions.pycurl_session.PycURLSession:7\n#: yadisk.sessions.requests_session.RequestsSession:18\nmsgid \"Usage example:\"\nmsgstr \"Пример использования:\"\n\n#: of yadisk.sessions.httpx_session.HTTPXSession:3\nmsgid \":any:`Session` implementation using the `httpx`_ library.\"\nmsgstr \"Реализация :any:`Session` с помощью библиотеки `httpx`_.\"\n\n#: of yadisk.sessions.httpx_session.HTTPXSession:7\nmsgid \"\"\n\"All arguments passed in the constructor are directly forwared to \"\n\"`httpx.Client`_.\"\nmsgstr \"\"\n\"Все аргументы, переданные конструкторе напрямую передаются в \"\n\"`httpx.Client`_.\"\n\n#: of yadisk.sessions.httpx_session.HTTPXSession:9\nmsgid \"underlying instance of `httpx.Client`_\"\nmsgstr \"лежащий в основе объект `httpx.Client`_\"\n\n#: of yadisk.sessions.httpx_session.HTTPXSession:11\nmsgid \"\"\n\"To pass `httpx`-specific arguments from :any:`Client` use \"\n\":code:`httpx_args` keyword argument.\"\nmsgstr \"\"\n\"Для того чтобы передать специфичные для `httpx` аргументы из \"\n\":any:`Client` используйте keyword-аргумент :code:`httpx_args`.\"\n\n#: of yadisk.sessions.pycurl_session.PycURLSession:3\nmsgid \":any:`Session` implementation using the `pycurl`_ library.\"\nmsgstr \"Реализация :any:`Session` с помощью библиотеки `pycurl`_.\"\n\n#: of yadisk.sessions.pycurl_session.PycURLSession:5\nmsgid \"\"\n\"To pass `pycurl`-specific arguments from :any:`Client` use \"\n\":code:`curl_options` keyword argument.\"\nmsgstr \"\"\n\"Для того чтобы передать специфичные для `pycurl` аргументы из \"\n\":any:`Client` используйте keyword-аргумент :code:`curl_options`.\"\n\n#: ../../api_reference/sessions.rst:24\nmsgid \"Asynchronous Implementations\"\nmsgstr \"Асинхронные реализации\"\n\n#: of yadisk.sessions.aiohttp_session.AIOHTTPSession:1\n#: yadisk.sessions.async_httpx_session.AsyncHTTPXSession:1\nmsgid \"Bases: :py:class:`~yadisk._async_session.AsyncSession`\"\nmsgstr \"Базовые классы: :py:class:`~yadisk._async_session.AsyncSession`\"\n\n#: of yadisk.sessions.aiohttp_session.AIOHTTPSession:3\nmsgid \":any:`AsyncSession` implementation using the `aiohttp`_ library.\"\nmsgstr \"Реализация :any:`AsyncSession` с помощью библиотеки `aiohttp`_.\"\n\n#: of yadisk.sessions.aiohttp_session.AIOHTTPSession:5\nmsgid \"\"\n\"All arguments passed in the constructor are directly forwared to \"\n\":any:`aiohttp.ClientSession`.\"\nmsgstr \"\"\n\"Все аргументы, переданные конструкторе напрямую передаются в \"\n\":any:`aiohttp.ClientSession`.\"\n\n#: of yadisk.sessions.aiohttp_session.AIOHTTPSession:7\nmsgid \"underlying instance of :any:`aiohttp.ClientSession`\"\nmsgstr \"лежащий в основе объект :any:`aiohttp.ClientSession`\"\n\n#: of yadisk.sessions.aiohttp_session.AIOHTTPSession:9\nmsgid \"\"\n\"To pass `aiohttp`-specific arguments from :any:`AsyncClient` use \"\n\":code:`aiohttp_args` keyword argument.\"\nmsgstr \"\"\n\"Для того чтобы передать специфичные для `aiohttp` аргументы из \"\n\":any:`Client` используйте keyword-аргумент :code:`aiohttp_args`.\"\n\n#: of yadisk.sessions.async_httpx_session.AsyncHTTPXSession:3\nmsgid \":any:`AsyncSession` implementation using the `httpx`_ library.\"\nmsgstr \"Реализация :any:`AsyncSession` с помощью библиотеки `httpx`_.\"\n\n#: of yadisk.sessions.async_httpx_session.AsyncHTTPXSession:7\nmsgid \"\"\n\"All arguments passed in the constructor are directly forwared to \"\n\"`httpx.AsyncClient`_.\"\nmsgstr \"\"\n\"Все аргументы, переданные конструкторе напрямую передаются в \"\n\"`httpx.AsyncClient`_.\"\n\n#: of yadisk.sessions.async_httpx_session.AsyncHTTPXSession:9\nmsgid \"underlying instance of `httpx.AsyncClient`_\"\nmsgstr \"лежащий в основе объект `httpx.AsyncClient`_\"\n\n#: of yadisk.sessions.async_httpx_session.AsyncHTTPXSession:11\nmsgid \"\"\n\"To pass `httpx`-specific arguments from :any:`AsyncClient` use \"\n\":code:`httpx_args` keyword argument.\"\nmsgstr \"\"\n\"Для того чтобы передать специфичные для `httpx` аргументы из \"\n\":any:`AsyncClient` используйте keyword-аргумент :code:`httpx_args`.\"\n\n#: ../../api_reference/sessions.rst:33\nmsgid \"Importing Session Classes\"\nmsgstr \"Импортирование классов сессий\"\n\n#: ../../api_reference/sessions.rst:35\nmsgid \"You can use the following functions to import a session class by name:\"\nmsgstr \"\"\n\"Вы можете использовать следующие функции, чтобы импортировать класс \"\n\"сессии по именsи:\"\n\n#: of yadisk._import_session.import_session:1\nmsgid \"Imports relevant session class based on provided name.\"\nmsgstr \"Импортирует релевантный класс сессии на основе указанного имени.\"\n\n#: of yadisk._import_session.import_async_session:5\n#: yadisk._import_session.import_session:3\nmsgid \"The following sessions are available:\"\nmsgstr \"Доступны следующие сессии:\"\n\n#: of yadisk._client.Client:31 yadisk._import_session.import_session:5\nmsgid \":code:`\\\"httpx\\\"` - :any:`HTTPXSession`\"\nmsgstr \":code:`\\\"httpx\\\"` - :any:`HTTPXSession`\"\n\n#: of yadisk._client.Client:32 yadisk._import_session.import_session:6\nmsgid \":code:`\\\"pycurl\\\"` - :any:`PycURLSession`\"\nmsgstr \":code:`\\\"pycurl\\\"` - :any:`PycURLSession`\"\n\n#: of yadisk._client.Client:33 yadisk._import_session.import_session:7\nmsgid \":code:`\\\"requests\\\"` - :any:`RequestsSession`\"\nmsgstr \":code:`\\\"requests\\\"` - :any:`RequestsSession`\"\n\n#: of yadisk._import_session.import_async_session:3\n#: yadisk._import_session.import_session:9\nmsgid \"`str`, session name\"\nmsgstr \"`str`, имя сессии\"\n\n#: of yadisk._import_session.import_async_session:10\n#: yadisk._import_session.import_session:11\nmsgid \"could not import module\"\nmsgstr \"не удалось импортировать модуль\"\n\n#: of yadisk._import_session.import_async_session:11\n#: yadisk._import_session.import_session:12\nmsgid \"unknown name\"\nmsgstr \"неизвестное имя\"\n\n#: of yadisk._import_session.import_session:14\nmsgid \"subclass of :any:`Session`\"\nmsgstr \"класс, наследующийся от :any:`Session`\"\n\n#: of yadisk._import_session.import_async_session:1\nmsgid \"Imports relevant asynchronous session class based on provided name.\"\nmsgstr \"\"\n\"Импортирует релевантный класс асинхронной сессии на основе указанного \"\n\"имени.\"\n\n#: of yadisk._import_session.import_async_session:13\nmsgid \"subclass of :any:`AsyncSession`\"\nmsgstr \"класс, наследующийся от :any:`AsyncSession`\"\n\n#: ../../api_reference/settings.rst:2\nmsgid \"Settings\"\nmsgstr \"Настройки\"\n\n#: ../../api_reference/settings.rst:4\nmsgid \"\"\n\"The following settings can be accessed and changed at runtime in \"\n\"`yadisk.settings` module:\"\nmsgstr \"\"\n\"Следующие настройки в модуле `yadisk.settings` могут быть получены и \"\n\"изменены:\"\n\n#: ../../docstring of yadisk.settings.BASE_API_URL:1\nmsgid \"\"\n\"Base URL for Yandex.Disk's REST API. Can be overriden for testing and \"\n\"other purposes\"\nmsgstr \"\"\n\"Базовый URL для REST API Яндекс.Диска. Может быть переопределён для \"\n\"тестирования и прочих целей\"\n\n#: ../../docstring of yadisk.settings.BASE_OAUTH_API_URL:1\nmsgid \"\"\n\"Base URL for Yandex.Disk's OAuth API. Can be overriden for testing and \"\n\"other purposes\"\nmsgstr \"\"\n\"Базовый URL для OAuth API Яндекс.Диска. Может быть переопределён для \"\n\"тестирования и прочих целей\"\n\n#: ../../docstring of yadisk.settings.DEFAULT_N_RETRIES:1\nmsgid \"`int`, default number of retries\"\nmsgstr \"`int`, число повторных попыток запроса по умолчанию\"\n\n#: ../../docstring of yadisk.settings.DEFAULT_RETRY_INTERVAL:1\nmsgid \"`float`, default retry interval\"\nmsgstr \"`float`, стандартная задержка между повторными попытками\"\n\n#: ../../docstring of yadisk.settings.DEFAULT_TIMEOUT:1\nmsgid \"\"\n\"`tuple` of 2 numbers (`int` or `float`), default timeout for requests. \"\n\"First number is the connect timeout, the second one is the read timeout.\"\nmsgstr \"\"\n\"`tuple` из 2-х чисел (`int` или `float`), стандартный таймаут для \"\n\"запросов. Первое число - это таймаут соединения, второе - таймаут чтения.\"\n\n#: ../../docstring of yadisk.settings.DEFAULT_UPLOAD_RETRY_INTERVAL:1\nmsgid \"\"\n\"Analogous to :any:`settings.DEFAULT_RETRY_INTERVAL` but for \"\n\":any:`Client.upload()`/:any:`AsyncClient.upload()` function\"\nmsgstr \"\"\n\"Аналогично :any:`settings.DEFAULT_RETRY_INTERVAL`, но для функции \"\n\":any:`Client.upload()`/:any:`AsyncClient.upload()`\"\n\n#: ../../docstring of yadisk.settings.DEFAULT_UPLOAD_TIMEOUT:1\nmsgid \"\"\n\"Analogous to :any:`settings.DEFAULT_TIMEOUT` but for \"\n\":any:`Client.upload()`/:any:`AsyncClient.upload()` function\"\nmsgstr \"\"\n\"Аналогично :any:`settings.DEFAULT_TIMEOUT`, но для функции \"\n\":any:`Client.upload()`/:any:`AsyncClient.upload()`\"\n\n#: ../../docstring of yadisk.settings.logger:1\nmsgid \"\"\n\"Logger for the library. Logs include information about requests to the \"\n\"API and automatic retry attempts.\"\nmsgstr \"\"\n\"Логгер библиотеки. Логи включают в себя информацию о запросах к API и \"\n\"автоматических повторных попытках.\"\n\n#: ../../api_reference/sync_api.rst:2\nmsgid \"Synchronous API\"\nmsgstr \"Синхронный API\"\n\n#: of yadisk._client.Client:1\nmsgid \"Implements access to Yandex.Disk REST API (provides synchronous API).\"\nmsgstr \"Реализует доступ к REST API Яндекс.Диска (предоставляет синхронный API).\"\n\n#: of yadisk._client.Client:3\nmsgid \"\"\n\"HTTP client implementation can be specified using the :code:`session` \"\n\"parameter. :any:`RequestsSession` is used by default. For other options, \"\n\"see :doc:`/api_reference/sessions`.\"\nmsgstr \"\"\n\"Реализация HTTP-клиента может быть указана с помощью параметра `session`.\"\n\" По умолчанию используется :any:`RequestsSession`. см. \"\n\":doc:`/api_reference/sessions` для других списка других доступных \"\n\"вариантов.\"\n\n#: of yadisk._client.Client:7\nmsgid \"\"\n\"Almost all methods of :any:`Client` (the ones that accept `**kwargs`) \"\n\"accept some additional arguments:\"\nmsgstr \"\"\n\"Почти все методы :any:`Client` (те, которые принимают `**kwargs`) \"\n\"принимают некоторые дополнительные параметры:\"\n\n#: of yadisk._client.Client:17\nmsgid \"\"\n\"Additional parameters, specific to a given HTTP client library can also \"\n\"be passed, see documentation for specific :any:`Session` subclasses \"\n\"(:doc:`/api_reference/sessions`).\"\nmsgstr \"\"\n\"Дополнительные параметры, относящиеся к конкретной HTTP библиотеке могут \"\n\"также быть переданы, см. документацию для конкретных подклассов \"\n\":any:`Session` (:doc:`/api_reference/sessions`).\"\n\n#: of yadisk._client.Client:26\nmsgid \"\"\n\"`None`, `str` or an instance of :any:`Session`. If :code:`session` is a \"\n\"string, the appropriate session class will be imported, it must be one of\"\n\" the following values:    * :code:`\\\"httpx\\\"` - :any:`HTTPXSession`   * \"\n\":code:`\\\"pycurl\\\"` - :any:`PycURLSession`   * :code:`\\\"requests\\\"` - \"\n\":any:`RequestsSession`\"\nmsgstr \"\"\n\"`None`, `str` или объект :any:`Session`. Если :code:`session` - строка, \"\n\"то нужный класс будет автоматически импортирован, допустимые значения:\"\n\"    * :code:`\\\"httpx\\\"` - :any:`HTTPXSession`   * :code:`\\\"pycurl\\\"` - \"\n\":any:`PycURLSession`   * :code:`\\\"requests\\\"` - :any:`RequestsSession`\"\n\n#: of yadisk._client.Client:26\nmsgid \"\"\n\"`None`, `str` or an instance of :any:`Session`. If :code:`session` is a \"\n\"string, the appropriate session class will be imported, it must be one of\"\n\" the following values:\"\nmsgstr \"\"\n\"`None`, `str` или объект :any:`Session`. Если :code:`session` - строка, \"\n\"то нужный класс будет автоматически импортирован, допустимые значения:\"\n\n#: of yadisk._client.Client:35\nmsgid \"\"\n\"`None` or a function that opens a file for reading or writing \"\n\"(:code:`open()` by default)\"\nmsgstr \"\"\n\"`None` или функция, которая открывает файл для чтения или записи \"\n\"(:code:`open()` по умолчанию)\"\n\n#: of yadisk._client.Client:37\nmsgid \"\"\n\"kept for compatibility, callable that returns an instance of \"\n\":any:`Session`\"\nmsgstr \"оставлен для совместимости, функция, возвращающая объект :any:`Session`\"\n\n#: of yadisk._client.Client:45\nmsgid \"current session (:any:`Session` instance)\"\nmsgstr \"текущая сессия (объект :any:`Session`)\"\n\n#: of yadisk._client.Client:46\nmsgid \"\"\n\"function that opens a file for reading or writing (:code:`open()` by \"\n\"default)\"\nmsgstr \"\"\n\"функция, которая открывает файл для чтения или записи (:code:`open()` по \"\n\"умолчанию)\"\n\n#: of yadisk._client.Client.close:4\nmsgid \"This method can also be called implicitly by using the `with` statement.\"\nmsgstr \"Этот метод может также быть вызван неявно с помощью конструкции `with`.\"\n\n#: of yadisk._client.Client.get_device_code:1\nmsgid \"\"\n\"This request is used for authorization using the Yandex OAuth page. In \"\n\"this case the user must enter the verification code (:code:`user_code`) \"\n\"in the browser on the Yandex OAuth page. After the user has entered the \"\n\"code on the OAuth page, the application can exchange the \"\n\":code:`device_code` for the token using the \"\n\":any:`Client.get_token_from_device_code()`.\"\nmsgstr \"\"\n\"Данный запрос используется для авторизации с помощью страницы Яндекс \"\n\"OAuth. В данном случае пользователь должен ввести код подтверждения \"\n\"(:code:`user_code`) в браузере на странице Яндекс OAuth. После того как \"\n\"пользователь ввёл код, приложение может обменять :code:`device_code` на \"\n\"токен с помощью метода :any:`Client.get_token_from_device_code()`.\"\n\n#: of yadisk._client.Client.get_device_code:21\nmsgid \"invalid client ID\"\nmsgstr \"неправильный идентификатор приложения\"\n\n#: of yadisk._client.Client.get_token_from_device_code:1\nmsgid \"\"\n\"Get a new token from a device code, previously obtained with \"\n\":any:`Client.get_device_code()`.\"\nmsgstr \"\"\n\"Получает новый токен с помощью кода устройства (device_code), полученного\"\n\" с помощью :any:`Client.get_device_code()`\"\n\n#: of yadisk._client.Client.get_token_from_device_code:3\nmsgid \"device code, obtained from :any:`Client.get_device_code()`\"\nmsgstr \"\"\n\"код устройства (device_code), полученный с помощью \"\n\":any:`Client.get_device_code()`\"\n\n#: of yadisk._client.Client.revoke_token:3\nmsgid \"token to revoke\"\nmsgstr \"токен, подлежащий отзыву\"\n\n#: of yadisk._client.Client.get_meta:28\nmsgid \":any:`SyncResourceObject`\"\nmsgstr \":any:`SyncResourceObject`\"\n\n#: of yadisk._client.Client.get_files:28\n#: yadisk._client.Client.get_last_uploaded:25 yadisk._client.Client.listdir:24\nmsgid \"generator of :any:`ResourceObject`\"\nmsgstr \"генератор :any:`ResourceObject`\"\n\n#: of yadisk._client.Client.upload:3 yadisk._client.Client.upload_by_link:3\nmsgid \"\"\n\"path, file-like object to be uploaded or a function that returns an \"\n\"iterator (or generator)\"\nmsgstr \"\"\n\"путь, файл-подобный объект, который нужно загрузить, или функция, которая\"\n\" возвращает итератор (или генератор)\"\n\n#: of yadisk._client.Client.upload:28\nmsgid \":any:`SyncResourceLinkObject`, link to the destination resource\"\nmsgstr \":any:`SyncResourceLinkObject`, ссылка на загруженный ресурс\"\n\n#: of yadisk._client.Client.get_upload_link_object:1\nmsgid \"\"\n\"Get a link to upload the file using the PUT request. This is similar to \"\n\":any:`Client.get_upload_link()`, except it returns an instance of \"\n\":any:`ResourceUploadLinkObject` which also contains an asynchronous \"\n\"operation ID.\"\nmsgstr \"\"\n\"Получает ссылку для загрузки файла на диск при помощи PUT запроса. Этот \"\n\"метод аналогичен :any:`Client.get_upload_link()`, но возвращает объект \"\n\":any:`ResourceUploadLinkObject`, который также содержит идентификатор \"\n\"асинхронной операции.\"\n\n#: of yadisk._client.Client.upload_url:38\nmsgid \":any:`SyncOperationLinkObject`, link to the asynchronous operation\"\nmsgstr \":any:`SyncOperationLinkObject`, ссылка на асинхронную операцию\"\n\n#: of yadisk._client.Client.download:19\nmsgid \":any:`SyncResourceLinkObject`, link to the source resource\"\nmsgstr \":any:`SyncResourceLinkObject`, ссылка на исходный ресурс\"\n\n#: of yadisk._client.Client.makedirs:21 yadisk._client.Client.mkdir:26\n#: yadisk._client.Client.unpublish:24\nmsgid \":any:`SyncResourceLinkObject`\"\nmsgstr \":any:`SyncResourceLinkObject`\"\n\n#: of yadisk._client.Client.patch:25\nmsgid \":any:`ResourceObject`\"\nmsgstr \":any:`ResourceObject`\"\n\n#: of yadisk._client.Client.publish:27\nmsgid \":any:`SyncResourceLinkObject`, link to the resource\"\nmsgstr \":any:`SyncResourceLinkObject`, ссылка на ресурс\"\n\n#: of yadisk._client.Client.download_public:3\n#: yadisk._client.Client.get_public_download_link:3\n#: yadisk._client.Client.get_public_meta:3\n#: yadisk._client.Client.get_public_type:3\n#: yadisk._client.Client.is_public_dir:3 yadisk._client.Client.is_public_file:3\n#: yadisk._client.Client.public_exists:3 yadisk._client.Client.save_to_disk:5\nmsgid \"public key or public URL of the public resource\"\nmsgstr \"публичный ключ или URL к публичному ресурсу\"\n\n#: of yadisk._client.Client.get_public_meta:31\nmsgid \":any:`SyncPublicResourceObject`\"\nmsgstr \":any:`SyncPublicResourceObject`\"\n\n#: of yadisk._client.Client.is_public_dir:1\nmsgid \"Check whether the public resource is a public directory.\"\nmsgstr \"Проверяет, является ли публичный ресурс публичной папкой.\"\n\n#: of yadisk._client.Client.is_public_file:1\nmsgid \"Check whether the public resource is a public file.\"\nmsgstr \"Проверяет, является ли публичный ресурс публичным файлом.\"\n\n#: of yadisk._client.Client.download_public:20\nmsgid \":any:`SyncPublicResourceLinkObject`\"\nmsgstr \":any:`SyncPublicResourceLinkObject`\"\n\n#: of yadisk._client.Client.get_public_resources:26\nmsgid \":any:`SyncPublicResourcesListObject`\"\nmsgstr \":any:`SyncPublicResourceObject`\"\n\n#: of yadisk._client.Client.get_all_public_resources:27\nmsgid \"generator of :any:`SyncPublicResourceObject`\"\nmsgstr \"генератор :any:`SyncPublicResourceObject`\"\n\n#: of yadisk._client.Client.restore_trash:4\nmsgid \"path to the trash resource to be restored\"\nmsgstr \"путь к восстанавливаему ресурсу\"\n\n#: ../../api_reference/types.rst:2\nmsgid \"Types\"\nmsgstr \"Типы\"\n\n#: ../../docstring of typing.Union:1\nmsgid \":any:`Client` or :any:`AsyncClient`\"\nmsgstr \":any:`Client` или :any:`AsyncClient`\"\n\n#: ../../docstring of typing.Union:1\nmsgid \":any:`Response` or :any:`AsyncResponse`\"\nmsgstr \":any:`Response` или :any:`AsyncResponse`\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"\"\n\"Callback function (may be asynchronous) that is invoked to consume the \"\n\"streamed HTTP response body\"\nmsgstr \"\"\n\"Функция обратного вызова (может быть асинхронной), которая вызывается для\"\n\" \\\"потребления\\\" тела HTTP-запроса\"\n\n#: of yadisk.types.AsyncFileLike:1 yadisk.types.BinaryAsyncFileLike:1\nmsgid \"Bases: :py:class:`~typing.Protocol`\"\nmsgstr \"Базовые классы: :py:class:`~typing.Protocol`\"\n\n#: of yadisk.types.AsyncFileLike:1\nmsgid \"\"\n\"This protocol describes the bare minimum set of required methods for an \"\n\"async file-like object (open in either binary or unicode mode).\"\nmsgstr \"\"\n\"Данный протокол описывает минимальный набор методов для асинхронного \"\n\"файл-подобного объекта (открытого либо в бинарном или текстовом режиме).\"\n\n#: of yadisk.types.AsyncFileLike.read:1\nmsgid \"Reads `size` bytes or characters.\"\nmsgstr \"Считывает `size` байт или символов\"\n\n#: of yadisk.types.AsyncFileLike.read:3 yadisk.types.BinaryAsyncFileLike.read:3\nmsgid \"`int`, number of bytes/characters to read from the file\"\nmsgstr \"`int`, число байт/символов, которые нужно считать\"\n\n#: of yadisk.types.AsyncFileLike.read:4 yadisk.types.BinaryAsyncFileLike.read:4\nmsgid \"data that was read from the file\"\nmsgstr \"данные, которые были прочитаны из файла\"\n\n#: of yadisk.types.AsyncFileLike.seek:1 yadisk.types.BinaryAsyncFileLike.seek:1\nmsgid \"Performs a seek operation on a file.\"\nmsgstr \"Выполняет операцию seek над файлом\"\n\n#: of yadisk.types.AsyncFileLike.seek:3 yadisk.types.BinaryAsyncFileLike.seek:3\nmsgid \"`int`, position to seek to\"\nmsgstr \"`int`, позиция\"\n\n#: of yadisk.types.AsyncFileLike.seek:4 yadisk.types.BinaryAsyncFileLike.seek:4\nmsgid \"\"\n\"`int`, 0 (seek absolute position), 1 (seek relative to current position) \"\n\"or 2 (seek to file's end)\"\nmsgstr \"\"\n\"`int`, 0 (абсолютное позиционирование), 1 (относительное \"\n\"позиционирование) или 2 (позиционирование относительно конца файла)\"\n\n#: of yadisk.types.AsyncFileLike.seek:7 yadisk.types.BinaryAsyncFileLike.seek:7\nmsgid \"`int`, absolute position within the file after the seek operation\"\nmsgstr \"`int`, абсолютная позиция внутри файла после операции seek\"\n\n#: of yadisk.types.AsyncFileLike.tell:1 yadisk.types.BinaryAsyncFileLike.tell:1\nmsgid \"Returns current position within the file.\"\nmsgstr \"Возвращает текущую позицию внутри файла\"\n\n#: of yadisk.types.AsyncFileLike.tell:3 yadisk.types.BinaryAsyncFileLike.tell:3\nmsgid \"`int`, current position within the file\"\nmsgstr \"`int`, текущая позиция внутри файла\"\n\n#: of yadisk.types.AsyncFileLike.write:1\n#: yadisk.types.BinaryAsyncFileLike.write:1\nmsgid \"Writes data (contained in `buffer`).\"\nmsgstr \"Записывает данные (содержащейся в `buffer`).\"\n\n#: of yadisk.types.AsyncFileLike.write:3\n#: yadisk.types.BinaryAsyncFileLike.write:3\nmsgid \"data to be written\"\nmsgstr \"данные, которые нужно записать\"\n\n#: of yadisk.types.AsyncFileLike.write:4\nmsgid \"the number of written bytes/characters\"\nmsgstr \"число записанных байт/символов\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"This is used to specify a source file to upload (async variant)\"\nmsgstr \"\"\n\"Используется для указания исходного файла для загрузки на сервер \"\n\"(асинхронный вариант)\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"\"\n\"This is used to specify a destination file to download into (async \"\n\"variant)\"\nmsgstr \"\"\n\"Используется для указания файла назначения, в который будут скачаны \"\n\"данные (асинхронный вариант)\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"Function that is used for opening local files (async variant)\"\nmsgstr \"\"\n\"Функция, которая используется для открытия локальных файлов (асинхронный \"\n\"вариант)\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"Request payload - data to be uploaded (async variant)\"\nmsgstr \"\"\n\"Полезная нагрузка запроса - данные, которые будут загружены на сервер \"\n\"(асинхронный вариант)\"\n\n#: ../../docstring collections.abc.Callable:1 of\nmsgid \"Function that returns an instance of :any:`AsyncSession`\"\nmsgstr \"Функция, возвращающая объект :any:`AsyncSession`\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"Valid asynchronous session name (see :doc:`/api_reference/sessions`)\"\nmsgstr \"Имя асинхронной сессии (см. :doc:`/api_reference/sessions`)\"\n\n#: of yadisk.types.AvailableUntilVerbose:1\n#: yadisk.types.ExternalOrganizationIdVerbose:1 yadisk.types.PasswordVerbose:1\n#: yadisk.types.PublicSettings:1 yadisk.types.PublicSettingsAccess:1\nmsgid \"Bases: :py:class:`~typing.TypedDict`\"\nmsgstr \"Базовые классы: :py:class:`~typing.TypedDict`\"\n\n#: of yadisk.types.AvailableUntilVerbose:4\nmsgid \"`int`, timestamp indicating the expiration date\"\nmsgstr \"`int`, timestamp даты истечения\"\n\n#: of yadisk.types.BinaryAsyncFileLike:1\nmsgid \"\"\n\"This protocol describes the bare minimum set of required methods for an \"\n\"async file-like object open in binary mode.\"\nmsgstr \"\"\n\"Данный протокол описывает минимальный набор методов для асинхронного \"\n\"файл-подобного объекта, открытого в бинарном режиме.\"\n\n#: of yadisk.types.BinaryAsyncFileLike.read:1\nmsgid \"Reads `size` bytes.\"\nmsgstr \"Считывает `size` байт.\"\n\n#: of yadisk.types.BinaryAsyncFileLike.write:4\nmsgid \"the number of written bytes\"\nmsgstr \"число записанных байт\"\n\n#: ../../docstring collections.abc.Callable:1 of\nmsgid \"\"\n\"Callback function that is invoked to consume the streamed HTTP response \"\n\"body\"\nmsgstr \"\"\n\"Функция обратного вызова, которая вызывается для \\\"потребления\\\" тела \"\n\"HTTP-запроса\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"File mode for :any:`OpenFileCallback` and :any:`AsyncOpenFileCallback`\"\nmsgstr \"\"\n\"Режим открытия файла для :any:`OpenFileCallback` и \"\n\":any:`AsyncOpenFileCallback`\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"This is used to specify a source file to upload\"\nmsgstr \"Используется для указания исходного файла для загрузки на сервер\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"This is used to specify a destination file to download into\"\nmsgstr \"Используется для указания файла назначения, в который будут скачаны данные\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"HTTP request method\"\nmsgstr \"Метод HTTP запроса\"\n\n#: ../../docstring collections.abc.Mapping:1 of\nmsgid \"Type used for passing HTTP request headers\"\nmsgstr \"Тип используемый для задания заголовков HTTP запросов\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"JSON data (parsed)\"\nmsgstr \"Данные JSON (после парсинга)\"\n\n#: ../../docstring collections.abc.Callable:1 of\nmsgid \"Function that is used for opening local files (like :any:`open`)\"\nmsgstr \"\"\n\"Функция, которая используется для открытия локальных файлов (как \"\n\":any:`open`)\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"Yandex.Disk's asynchronous operation status\"\nmsgstr \"Статус асинхронной операции Яндекс.Диска\"\n\n#: of yadisk.types.PasswordVerbose:1\nmsgid \"Verbose information about the password of a shared resource.\"\nmsgstr \"Развёрнутая информация о пароле общего ресурса.\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"Request payload - data to be uploaded\"\nmsgstr \"Полезная нагрузка запроса - данные, которые будут загружены на сервер\"\n\n#: of yadisk.types.PublicSettings:1\nmsgid \"\"\n\"Public settings of a shared resource. This type describes the input for \"\n\"requests that modify public settings. For the related response object, \"\n\"see :any:`PublicSettingsObject`.\"\nmsgstr \"\"\n\"Публичные настройки общего ресурса. Этот тип описывает входные данные для\"\n\" запросов, модифицирующих публичные настройки. См. также связанный с ним \"\n\"объект :any:`PublicSettingsObject`.\"\n\n#: of yadisk.types.PublicSettings:7\nmsgid \"\"\n\":any:`AvailableUntilVerbose`, verbose information about the expiration \"\n\"date\"\nmsgstr \":any:`AvailableUntilVerbose`, развёрнутая информация о дате истечения\"\n\n#: of yadisk.types.PublicSettings:9\nmsgid \":any:`PasswordVerbose`, verbose information about the password\"\nmsgstr \":any:`PasswordVerbose`, развёрнутая информация о пароле\"\n\n#: of yadisk.types.PublicSettings:11\nmsgid \"\"\n\":any:`ExternalOrganizationIdVerbose`, verbose information about the \"\n\"external organization ID\"\nmsgstr \"\"\n\":any:`ExternalOrganizationIdVerbose`, развёрнутая информация \"\n\"обидентификаторе внешней организации\"\n\n#: of yadisk.types.PublicSettings:13\nmsgid \"`List[PublicSettingsAccess]`, list of access settings\"\nmsgstr \"`List[PublicSettingsAccess]`, список настроек доступа\"\n\n#: of yadisk.types.PublicSettings:17\nmsgid \"\"\n\"It appears that passing :code:`available_until` as an empty string \"\n\"disables the expiration date. Similarly, password can be disabled by \"\n\"passing :code:`False` or :code:`0`. This is not officially documented, \"\n\"though.\"\nmsgstr \"\"\n\"Как показывает практика, передача пустой строки в поле \"\n\":code:`available_until` отключает дату истечения доступа. Аналогично, \"\n\"пароль можно отключить, передав :code:`False` или :code:`0`. Но подобное \"\n\"поведение не задокументировано.\"\n\n#: of yadisk.types.PublicSettingsAccess:7\nmsgid \"`List[str]`, list of user IDs\"\nmsgstr \"`List[str]`, список идентификаторов пользователей\"\n\n#: of yadisk.types.PublicSettingsAccess:8\nmsgid \"`List[int]`, list of group IDs\"\nmsgstr \"`List[int]`, список идентификаторов групп\"\n\n#: of yadisk.types.PublicSettingsAccess:9\nmsgid \"`List[int]`, list of department IDs\"\nmsgstr \"`List[int]`, список идентификаторов подразделений\"\n\n#: of yadisk.types.PublicSettingsAccess:10\nmsgid \"`list[str]`, list of access rights\"\nmsgstr \"`list[str]`, список прав доступа\"\n\n#: ../../docstring collections.abc.Callable:1 of\nmsgid \"Function that returns an instance of :any:`Session`\"\nmsgstr \"Функция, возвращающая объект :any:`Session`\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"Valid session name (see :doc:`/api_reference/sessions`)\"\nmsgstr \"Имя сессии (см. :doc:`/api_reference/sessions`)\"\n\n#: ../../docstring of typing.Union:1\nmsgid \"\"\n\"Request timeout (in seconds). Can be a single number, None or a tuple. If\"\n\" the timeout is specified as a tuple, then the first value is the connect\"\n\" timeout, and the second value is the read timeout. Otherwise, both \"\n\"connect and read timeouts are set to the same value. A value of None \"\n\"means no timeout. If the timeout's value is :code:`...`, the default \"\n\"timeout is used (either :any:`settings.DEFAULT_TIMEOUT` or \"\n\":any:`settings.DEFAULT_UPLOAD_TIMEOUT`)\"\nmsgstr \"\"\n\"Таймаут запроса (в секундах). Может быть числом, None или кортежем. Если \"\n\"таймаут задан как кортеж, то первое значение - таймаут соединения, а \"\n\"второе - таймаут чтения. Иначе, заданное значение используется для обоих \"\n\"таймаутов. Значение None означает отсутствие таймаута. Если в качестве \"\n\"таймаута передано значение :code:`...`, то используется таймаут по \"\n\"умолчанию (:any:`settings.DEFAULT_TIMEOUT` или \"\n\":any:`settings.DEFAULT_UPLOAD_TIMEOUT`)\"\n\n#: ../../api_reference/utilities.rst:2\nmsgid \"Utilities\"\nmsgstr \"Вспомогательные средства\"\n\n#: of yadisk.utils.CaseInsensitiveDict:1\nmsgid \"A case-insensitive dictionary. All keys are converted to lowercase.\"\nmsgstr \"\"\n\"Словарь, нечувствительный к регистру. Все ключи преобразуются в нижний \"\n\"регистр.\"\n\n#: of yadisk.utils.CaseInsensitiveDict.get:1\n#: yadisk.utils.CaseInsensitiveDict.setdefault:3\nmsgid \"Return the value for key if key is in the dictionary, else default.\"\nmsgstr \"Return the value for key if key is in the dictionary, else default.\"\n\n#: of yadisk.utils.CaseInsensitiveDict.pop:1\nmsgid \"\"\n\"If the key is not found, return the default if given; otherwise, raise a \"\n\"KeyError.\"\nmsgstr \"\"\n\"If the key is not found, return the default if given; otherwise, raise a \"\n\"KeyError.\"\n\n#: of yadisk.utils.CaseInsensitiveDict.setdefault:1\nmsgid \"Insert key with a value of default if key is not in the dictionary.\"\nmsgstr \"Insert key with a value of default if key is not in the dictionary.\"\n\n#: of yadisk.utils.CaseInsensitiveDict.update:1\nmsgid \"\"\n\"If E is present and has a .keys() method, then does:  for k in E.keys(): \"\n\"D[k] = E[k] If E is present and lacks a .keys() method, then does:  for \"\n\"k, v in E: D[k] = v In either case, this is followed by: for k in F:  \"\n\"D[k] = F[k]\"\nmsgstr \"\"\n\"If E is present and has a .keys() method, then does:  for k in E.keys(): \"\n\"D[k] = E[k] If E is present and lacks a .keys() method, then does:  for \"\n\"k, v in E: D[k] = v In either case, this is followed by: for k in F:  \"\n\"D[k] = F[k]\"\n\n#: of yadisk.utils.async_auto_retry:1 yadisk.utils.auto_retry:1\nmsgid \"\"\n\"Attempt to perform a request with automatic retries. A retry is triggered\"\n\" by :any:`RequestError` or :any:`RetriableYaDiskError`, unless the raised\"\n\" exception has :code:`disable_retry` set to :code:`True`.\"\nmsgstr \"\"\n\"Выполняет запрос с автоматическими повторными попытками. Повторная \"\n\"попытка может быть вызвана :any:`RequestError` или \"\n\":any:`RetriableYaDiskError`, если у исключения не задан атрибут \"\n\":code:`disable_retry=True`.\"\n\n#: of yadisk.utils.async_auto_retry:5 yadisk.utils.auto_retry:5\nmsgid \"function to run, must not require any arguments\"\nmsgstr \"Функция, подлежащая исполнению, не должна требовать аргументов\"\n\n#: of yadisk.utils.async_auto_retry:7 yadisk.utils.auto_retry:7\nmsgid \"`int` or `float`, delay between retries (in seconds)\"\nmsgstr \"`int` или `float`, задержка между повторными попытками в секундах\"\n\n#: of yadisk.utils.async_auto_retry:8 yadisk.utils.auto_retry:8\nmsgid \"`tuple` or `None`, additional arguments for `func`\"\nmsgstr \"`tuple` или `None`, дополнительные аргументы для `func`\"\n\n#: of yadisk.utils.async_auto_retry:9 yadisk.utils.auto_retry:9\nmsgid \"`dict` or `None`, additional keyword arguments for `func`\"\nmsgstr \"`dict` или `None`, дополнительные keyword-аргументы для `func`\"\n\n#: of yadisk.utils.async_auto_retry:12 yadisk.utils.auto_retry:12\nmsgid \"return value of func()\"\nmsgstr \"Значение, возвращаемое func()\"\n\n#: of yadisk.utils.get_exception:1\nmsgid \"\"\n\"Get an exception instance based on response, assuming the request has \"\n\"failed.\"\nmsgstr \"\"\n\"Возвращает объект исключения, основываясь на ответе (подразумевается, что\"\n\" запрос не удался).\"\n\n#: of yadisk.utils.get_exception:4\nmsgid \"an instance of :any:`ErrorObject` or `None`\"\nmsgstr \"экземпляр :any:`ErrorObject` или `None`\"\n\n#: of yadisk.utils.get_exception:6\nmsgid \"an exception instance, subclass of :any:`YaDiskError`\"\nmsgstr \"Объект исключения, подкласс :any:`YaDiskError`\"\n\n#~ msgid \":any:`ResourceLinkObject`, link to the source resource\"\n#~ msgstr \":any:`ResourceLinkObject`, ссылка на исходный ресурс\"\n\n#~ msgid \"generator of :any:`PublicResourceObject`\"\n#~ msgstr \"генератор :any:`PublicResourceObject`\"\n\n#~ msgid \":any:`ResourceLinkObject`, link to the resource\"\n#~ msgstr \":any:`ResourceLinkObject`, ссылка на ресурс\"\n\n#~ msgid \"\"\n#~ \":any:`OperationLinkObject` if the operation is\"\n#~ \" performed asynchronously, `None` otherwise\"\n#~ msgstr \"\"\n#~ \":any:`OperationLinkObject`, если операция \"\n#~ \"выполняется асинхронно, иначе `None`\"\n\n#~ msgid \":any:`ResourceLinkObject`, link to the destination resource\"\n#~ msgstr \":any:`ResourceLinkObject`, ссылка на загруженный ресурс\"\n\n#~ msgid \":any:`OperationLinkObject`, link to the asynchronous operation\"\n#~ msgstr \":any:`OperationLinkObject`, ссылка на асинхронную операцию\"\n\n#~ msgid \"generator of :any:`TrashResourceObject`\"\n#~ msgstr \"генератор :any:`TrashResourceObject`\"\n\n#~ msgid \"\"\n#~ \"path, file-like object to be \"\n#~ \"uploaded or a function that returns \"\n#~ \"a an iterator (or generator)\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"path or file-like object to be \"\n#~ \"uploaded or a function that returns \"\n#~ \"a an iterator (or generator)\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"path or file-like object to be \"\n#~ \"uploaded or a function that returns \"\n#~ \"an iterator (or generator)\"\n#~ msgstr \"\"\n\n#~ msgid \"`None` or a function that returns a new instance of :any:`AsyncSession`\"\n#~ msgstr \"\"\n#~ \"`None` или функция, которая возвращает \"\n#~ \"новый экземпляр :any:`AsyncSession`\"\n\n#~ msgid \"function that returns a new instance of :any:`AsyncSession`\"\n#~ msgstr \"функция, которая возвращает новый экземпляр :any:`AsyncSession`\"\n\n#~ msgid \"\"\n#~ \"current session (:any:`AsyncSession` instance), \"\n#~ \"created using the `session_factory` with \"\n#~ \"filled out authentication headers\"\n#~ msgstr \"\"\n#~ \"текущая сессия (экземпляр :any:`AsyncSession`), \"\n#~ \"созданная с помощью `session_factory` с \"\n#~ \"заполненными заголовками аутентификации\"\n\n#~ msgid \"Get authentication URL for the user to go to.\"\n#~ msgstr \"Получает URL для аутентификации для пользователя.\"\n\n#~ msgid \"\"\n#~ \"indicates whether to use lightweight \"\n#~ \"layout, values other than \\\"popup\\\" are\"\n#~ \" ignored\"\n#~ msgstr \"\"\n#~ \"указывает использовать облегчённую вёрстку, \"\n#~ \"обрабатывает только \\\"popup\\\", остальные \"\n#~ \"значения игнорируются\"\n\n#~ msgid \"\"\n#~ \"Get the URL for the user to \"\n#~ \"get the confirmation code. The \"\n#~ \"confirmation code can later be used \"\n#~ \"to get the token.\"\n#~ msgstr \"\"\n#~ \"Получает URL для получения пользователем \"\n#~ \"кода подтверждения. Он может быть \"\n#~ \"использован для получения токена.\"\n\n#~ msgid \"Prepares a new :any:`AsyncSession` object with headers needed for API.\"\n#~ msgstr \"\"\n#~ \"Готовит новый объект :any:`AsyncSession` с \"\n#~ \"заголовками, необходимыми для API.\"\n\n#~ msgid \"application token, equivalent to `self.token` if `None`\"\n#~ msgstr \"токен, то же самое, что `self.token`, если `None`\"\n\n#~ msgid \"`AsyncSession`\"\n#~ msgstr \"`AsyncSession`\"\n\n#~ msgid \"token cannot be revoked (not bound to this application, etc.)\"\n#~ msgstr \"\"\n#~ \"токен не может быть отозван (например,\"\n#~ \" если не привязан к данному \"\n#~ \"приложению)\"\n\n#~ msgid \"Bases: :py:class:`~yadisk.objects.resources.LinkObject`\"\n#~ msgstr \"Базовые классы: :py:class:`~yadisk.objects.resources.LinkObject`\"\n\n#~ msgid \"`None` or a function that returns a new instance of :any:`Session`\"\n#~ msgstr \"`None` или функция, которая возващает новый экземпляр :any:`Session`\"\n\n#~ msgid \"function that returns a new instance of :any:`Session`\"\n#~ msgstr \"функция, которая возващает новый экземпляр :any:`Session`\"\n\n#~ msgid \"\"\n#~ \"current session (:any:`Session` instance), \"\n#~ \"created using the `session_factory` with \"\n#~ \"filled out authentication headers\"\n#~ msgstr \"\"\n#~ \"текущая сессия (экземпляр :any:`Session`), \"\n#~ \"созданная с помощью `session_factory` с \"\n#~ \"заполненными заголовками аутентификации\"\n\n#~ msgid \"Prepares :any:`Session` object with headers needed for API.\"\n#~ msgstr \"Готовит объект :any:`Session` с заголовками, необходимыми для API.\"\n\n#~ msgid \":any:`Session`\"\n#~ msgstr \":any:`Session`\"\n\n#~ msgid \"an instance of :any:`Response`\"\n#~ msgstr \"объект :any:`Response`\"\n\n#~ msgid \"Low-Level API\"\n#~ msgstr \"Низкоуровневый API\"\n\n#~ msgid \"API Request Objects\"\n#~ msgstr \"Объекты запросов к API\"\n\n#~ msgid \"Base class for all API requests.\"\n#~ msgstr \"Базовый класс для всех объектов запросов к REST API.\"\n\n#~ msgid \"an instance of :any:`Session`\"\n#~ msgstr \"объект :any:`Session`\"\n\n#~ msgid \"`dict` of arguments, that will be passed to `process_args`\"\n#~ msgstr \"`dict`, аргументы, которые будут перданы в `process_args`\"\n\n#~ msgid \"`str`, request URL\"\n#~ msgstr \"`str`, URL запроса\"\n\n#~ msgid \"\"\n#~ \"`str`, Content-Type header (\\\"application/x\"\n#~ \"-www-form-urlencoded\\\" by default)\"\n#~ msgstr \"\"\n#~ \"`str`, заголовок Content-Type (\\\"application/x\"\n#~ \"-www-form-urlencoded\\\" по умолчанию)\"\n\n#~ msgid \"`list`-like, list of response codes that indicate request's success\"\n#~ msgstr \"`list`-подобный, список кодов ответов, означающих успех запроса\"\n\n#~ msgid \"`float`, delay between retries in seconds\"\n#~ msgstr \"`float`, задержка между повторными попытками в секундах\"\n\n#~ msgid \"Process the response.\"\n#~ msgstr \"Обрабатывает ответ.\"\n\n#~ msgid \"extra arguments (optional)\"\n#~ msgstr \"дополнительные аргументы (опциональные)\"\n\n#~ msgid \"depends on `self.process_json()`\"\n#~ msgstr \"зависит от `self.process_json()`\"\n\n#~ msgid \"Actually send the request\"\n#~ msgstr \"Отправляет запрос\"\n\n#~ msgid \":any:`AsyncResponse` (`self.response`)\"\n#~ msgstr \":any:`AsyncResponse` (`self.response`)\"\n\n#~ msgid \"Process the JSON response.\"\n#~ msgstr \"Обрабатывает JSON ответ.\"\n\n#~ msgid \"`dict` or `None`, JSON response\"\n#~ msgstr \"`dict` или `None`, JSON ответ\"\n\n#~ msgid \"processed response, can be anything\"\n#~ msgstr \"обработанный ответ, может быть что угодно\"\n\n#~ msgid \":any:`Response` (`self.response`)\"\n#~ msgstr \":any:`Response` (`self.response`)\"\n\n#~ msgid \"Bases: :py:class:`~yadisk.api.api_request.APIRequest`\"\n#~ msgstr \"Базовые классы: :py:class:`~yadisk.api.api_request.APIRequest`\"\n\n#~ msgid \"\"\n#~ \"This request is used for authorization\"\n#~ \" using the Yandex OAuth page. In \"\n#~ \"this case the user must enter the\"\n#~ \" verification code (:code:`user_code`) in \"\n#~ \"the browser on the Yandex OAuth \"\n#~ \"page. After the user has entered \"\n#~ \"the code on the OAuth page, the\"\n#~ \" application can exchange the \"\n#~ \":code:`device_code` for the token.\"\n#~ msgstr \"\"\n#~ \"Данный запрос используется для авторизации \"\n#~ \"с помощью страницы Яндекс OAuth. В \"\n#~ \"данном случае пользователь должен ввести \"\n#~ \"код подтверждения (:code:`user_code`) в \"\n#~ \"браузере на странице Яндекс OAuth. После\"\n#~ \" того как пользователь ввёл код, \"\n#~ \"приложение может обменять :code:`device_code` \"\n#~ \"на токен.\"\n\n#~ msgid \"\"\n#~ \"an instance of :any:`Session` or \"\n#~ \":any:`AsyncSession` with prepared headers\"\n#~ msgstr \"\"\n#~ \"объект :any:`Session` или :any:`AsyncSession` \"\n#~ \"с подготовленными заголовками\"\n\n#~ msgid \"A request to get the token.\"\n#~ msgstr \"Запрос для получения токена.\"\n\n#~ msgid \"A request to refresh an existing token.\"\n#~ msgstr \"Запрос для обновления существующего токена.\"\n\n#~ msgid \"the refresh token that was received with the original token\"\n#~ msgstr \"refresh-токен, полученный вместе с токеном\"\n\n#~ msgid \"A request to revoke the token.\"\n#~ msgstr \"Запрос для отзыва токена.\"\n\n#~ msgid \"the token to be revoked\"\n#~ msgstr \"токен, подлежащий отзыву\"\n\n#~ msgid \"A request to get disk information.\"\n#~ msgstr \"Запрос для получения информации о диске.\"\n\n#~ msgid \"A request to copy a file or a directory.\"\n#~ msgstr \"Запрос копирования файла или папки.\"\n\n#~ msgid \":any:`ResourceLinkObject` or :any:`OperationLinkObject`\"\n#~ msgstr \":any:`ResourceLinkObject` или :any:`OperationLinkObject`\"\n\n#~ msgid \"A request to delete a file or a directory.\"\n#~ msgstr \"Запрос для удаления ресурса.\"\n\n#~ msgid \":any:`OperationLinkObject` or `None`\"\n#~ msgstr \":any:`OperationLinkObject` или `None`\"\n\n#~ msgid \"A request to delete a trash resource.\"\n#~ msgstr \"Запрос для удаления ресурса корзины.\"\n\n#~ msgid \"\"\n#~ \"A request to get a flat list \"\n#~ \"of all files (that doesn't include \"\n#~ \"directories).\"\n#~ msgstr \"Запрос для получения плоского списка всех файлов.\"\n\n#~ msgid \":any:`FilesResourceListObject`\"\n#~ msgstr \":any:`FilesResourceListObject`\"\n\n#~ msgid \"A request to get a download link to a resource.\"\n#~ msgstr \"Запрос для получения ссылки на скачивание ресурса.\"\n\n#~ msgid \"path to the resource to be downloaded\"\n#~ msgstr \"путь к скачиваемому ресурсу\"\n\n#~ msgid \":any:`ResourceDownloadLinkObject`\"\n#~ msgstr \":any:`ResourceDownloadLinkObject`\"\n\n#~ msgid \"A request to get meta-information about a resource.\"\n#~ msgstr \"Запрос для получния мета-информации о ресурсе.\"\n\n#~ msgid \"A request to get a download link for a public resource.\"\n#~ msgstr \"Запрос для получения ссылки на скачивание публичного ресурса.\"\n\n#~ msgid \"A request to get meta-information about a public resource.\"\n#~ msgstr \"Запрос для получния мета-информации о публичном ресурсе.\"\n\n#~ msgid \":any:`PublicResourceObject`\"\n#~ msgstr \":any:`PublicResourceObject`\"\n\n#~ msgid \"A request to get a list of public resources.\"\n#~ msgstr \"Запрос для получения списка публичных ресурсов.\"\n\n#~ msgid \":any:`PublicResourcesListObject`\"\n#~ msgstr \":any:`PublicResourcesListObject`\"\n\n#~ msgid \"A request to get meta-information about a trash resource.\"\n#~ msgstr \"Запрос для получния мета-информации о ресурсе корзины.\"\n\n#~ msgid \":any:`TrashResourceObject`\"\n#~ msgstr \":any:`TrashResourceObject`\"\n\n#~ msgid \"A request to get an upload link.\"\n#~ msgstr \"Запрос для получения ссылки для загрузки ресурса.\"\n\n#~ msgid \"\"\n#~ \"A request to get the list of \"\n#~ \"latest uploaded files sorted by upload\"\n#~ \" date.\"\n#~ msgstr \"\"\n#~ \"Запрос для получения списка последних \"\n#~ \"загруженных файлов, отсортированного по дате\"\n#~ \" загрузки.\"\n\n#~ msgid \":any:`LastUploadedResourceListObject`\"\n#~ msgstr \":any:`LastUploadedResourceListObject`\"\n\n#~ msgid \"A request to create a new directory.\"\n#~ msgstr \"Запрос для создания новой папки.\"\n\n#~ msgid \":any:`ResourceLinkObject`\"\n#~ msgstr \":any:`ResourceLinkObject`\"\n\n#~ msgid \"A request to move a resource.\"\n#~ msgstr \"Запрос для перемещения ресурса.\"\n\n#~ msgid \":any:`OperationLinkObject` or :any:`ResourceLinkObject`\"\n#~ msgstr \":any:`OperationLinkObject` или :any:`ResourceLinkObject`\"\n\n#~ msgid \"A request to update custom properties of a resource.\"\n#~ msgstr \"Запрос для обновления пользовательских свойств ресурса.\"\n\n#~ msgid \"A request to make a resource public.\"\n#~ msgstr \"Запрос для того, чтобы сделать ресурс публичным.\"\n\n#~ msgid \"A request to restore trash.\"\n#~ msgstr \"Запрос для восстановления мусора.\"\n\n#~ msgid \"A request to save a public resource to the disk.\"\n#~ msgstr \"Запрос для сохранения публичного ресурса на диск.\"\n\n#~ msgid \"A request to make a public resource private.\"\n#~ msgstr \"Запрос для того, чтобы сделать публичный ресурс приватным.\"\n\n#~ msgid \"A request to upload a file from URL.\"\n#~ msgstr \"Запрос для загрузки файла по URL.\"\n\n#~ msgid \":any:`OperationLinkObject`\"\n#~ msgstr \":any:`OperationLinkObject`\"\n\n#~ msgid \"A request to get operation status.\"\n#~ msgstr \"Запрос для получения статуса операции.\"\n\n#~ msgid \"operation ID or link\"\n#~ msgstr \"идентификатор операции или ссылка на нее\"\n\n#~ msgid \":any:`OperationStatusObject`\"\n#~ msgstr \":any:`OperationStatusObject`\"\n\n#~ msgid \"\"\n#~ \"Copy resource to `dst_path`. If the \"\n#~ \"operation is performed asynchronously, returns\"\n#~ \" the link to the operation, \"\n#~ \"otherwise, returns the link to the \"\n#~ \"newly created resource.\"\n#~ msgstr \"\"\n#~ \"Копирует ресурс в `dst_path`. Если \"\n#~ \"операция выполняется асинхронно, возвращает \"\n#~ \"ссылку на операцию, иначе, возвращает \"\n#~ \"ссылку на новый ресурс.\"\n\n#~ msgid \":code:`copy(dst_path, /, **kwargs)`\"\n#~ msgstr \":code:`copy(dst_path, /, **kwargs)`\"\n\n#~ msgid \":code:`copy(relative_path, dst_path, /, **kwargs)`\"\n#~ msgstr \":code:`copy(relative_path, dst_path, /, **kwargs)`\"\n\n#~ msgid \"`str` or `None`, source path relative to the resource\"\n#~ msgstr \"`str` or `None`, исходный путь, относительно ресурса\"\n\n#~ msgid \"Download the file. This method takes 1 or 2 positional arguments:\"\n#~ msgstr \"Скачивает файл. Данный метод принимает 1 или 2 позиционных аргумента:\"\n\n#~ msgid \":code:`download(dst_path_or_file, /, **kwargs)`\"\n#~ msgstr \":code:`download(dst_path_or_file, /, **kwargs)`\"\n\n#~ msgid \":code:`download(relative_path, dst_path_or_file, /, **kwargs)`\"\n#~ msgstr \":code:`download(relative_path, dst_path_or_file, /, **kwargs)`\"\n\n#~ msgid \"\"\n#~ \"If `relative_path` is empty or None \"\n#~ \"(or not specified) this method will \"\n#~ \"try to use the `file` attribute as\"\n#~ \" a download link.\"\n#~ msgstr \"\"\n#~ \"Если `relative_path` пустой или None \"\n#~ \"(или не указан), данный метод будет \"\n#~ \"использовать поле `file` (если доступно) \"\n#~ \"в качестве ссылки для скачивания.\"\n\n#~ msgid \"Check whether resource exists.\"\n#~ msgstr \"Проверяет, существует ли ресурс.\"\n\n#~ msgid \"`str` or `None`, relative path from the resource\"\n#~ msgstr \"`str` или `None`, относительный путь от ресурса\"\n\n#~ msgid \"`str` or `None`, path relative to the resource\"\n#~ msgstr \"`str` или `None`, относительный путь от ресурса\"\n\n#~ msgid \"`str` or `None`, relative path from resource\"\n#~ msgstr \"`str` или `None`, относительный путь от ресурса\"\n\n#~ msgid \"relative path to a resource in a public folder.\"\n#~ msgstr \"относительный путь к ресурсу внутри публичной папки.\"\n\n#~ msgid \"relative path from the resource\"\n#~ msgstr \"относительный путь от ресурса\"\n\n#~ msgid \"`str` or `None`, relative path to the resource\"\n#~ msgstr \"`str` или `None`, относительный путь от ресурса\"\n\n#~ msgid \"Check whether resource is a directory.\"\n#~ msgstr \"Проверяет, является ли ресурс папкой.\"\n\n#~ msgid \"Check whether resource is a file.\"\n#~ msgstr \"Проверяет, является ли ресурс файлом.\"\n\n#~ msgid \"Get contents of the resource.\"\n#~ msgstr \"Получает содержимое папки.\"\n\n#~ msgid \"relative path from resource\"\n#~ msgstr \"относительный путь от ресурса\"\n\n#~ msgid \"generator of :any:`AsyncResourceObject`\"\n#~ msgstr \"генератор :any:`AsyncResourceObject`\"\n\n#~ msgid \"`str` or `None`, relative path to the directory to be created\"\n#~ msgstr \"`str` или `None`, относительный путь к папке, подлежащей созданию\"\n\n#~ msgid \"\"\n#~ \"Move resource to `dst_path`. This method\"\n#~ \" takes 1 or 2 positional arguments:\"\n#~ msgstr \"\"\n#~ \"Перемещает ресурс в `dst_path`. Данный \"\n#~ \"метод принимает 1 или 2 позиционных \"\n#~ \"аргумента:\"\n\n#~ msgid \":code:`move(dst_path, /, **kwargs)`\"\n#~ msgstr \":code:`move(dst_path, /, **kwargs)`\"\n\n#~ msgid \":code:`move(relative_path, dst_path, /, **kwargs)`\"\n#~ msgstr \":code:`move(relative_path, dst_path, /, **kwargs)`\"\n\n#~ msgid \"`str` or `None`, source path to be moved relative to the resource\"\n#~ msgstr \"\"\n#~ \"`str` или `None`, исходный путь, \"\n#~ \"относительно ресурса, подлежащий перемещению\"\n\n#~ msgid \"\"\n#~ \"Update custom properties of a resource.\"\n#~ \" This method takes 1 or 2 \"\n#~ \"positional arguments:\"\n#~ msgstr \"\"\n#~ \"Обновляет пользовательские свойства ресурса. \"\n#~ \"Данный метод принимает 1  или 2 \"\n#~ \"позиционных аргумента:\"\n\n#~ msgid \":code:`patch(properties, /, **kwargs)`\"\n#~ msgstr \":code:`patch(properties, /, **kwargs)`\"\n\n#~ msgid \":code:`patch(relative_path, properties, /, **kwargs)`\"\n#~ msgstr \":code:`patch(relative_path, properties, /, **kwargs)`\"\n\n#~ msgid \"relative path to the resource in the public folder.\"\n#~ msgstr \"относительный путь к ресурсу внутри публичной папки\"\n\n#~ msgid \"generator of :any:`AsyncPublicResourceObject`\"\n#~ msgstr \"генератор :any:`AsyncPublicResourceObject`\"\n\n#~ msgid \"`str` or `None`, relative path to the resource to be published\"\n#~ msgstr \"`str` или `None`, относительный путь к публикуемому ресурсу\"\n\n#~ msgid \"`str` or `None`, relative path to the resource to be removed\"\n#~ msgstr \"`str` или `None`, относительный путь к удаляемому ресурсу\"\n\n#~ msgid \"`str` or `None`, source path to be renamed relative to the resource\"\n#~ msgstr \"\"\n#~ \"`str` или `None`, исходный путь, \"\n#~ \"относительно ресурса, подлежащий переименованию\"\n\n#~ msgid \"`str` or `None`, relative path to the resource to be unpublished\"\n#~ msgstr \"\"\n#~ \"`str` или `None`, относительный путь к\"\n#~ \" ресурсу, подлежащему депубликации\"\n\n#~ msgid \"path or file-like object to be uploaded\"\n#~ msgstr \"путь к файлу или файл-подобный объект для загрузки\"\n\n#~ msgid \"`str` or `None`, destination path relative to the resource\"\n#~ msgstr \"`str` или `None`, путь назначения относительно ресурса\"\n\n#~ msgid \":code:`copy(relative_src_path, dst_path, /, **kwargs)`\"\n#~ msgstr \":code:`copy(relative_src_path, dst_path, /, **kwargs)`\"\n\n#~ msgid \"generator of :any:`SyncResourceObject`\"\n#~ msgstr \"генератор :any:`SyncResourceObject`\"\n\n#~ msgid \"`str`, type of the operation\"\n#~ msgstr \"`str`, тип операции\"\n\n#~ msgid \":any:`LinkObject`, link to the operation\"\n#~ msgstr \":any:`LinkObject`, ссылка на операцию\"\n\n#~ msgid \"`dict`, other information about the operation\"\n#~ msgstr \"`dict`, другая информация об операции\"\n\n#~ msgid \"Updates session's headers.\"\n#~ msgstr \"Обновляет заголовки сессии.\"\n\n#~ msgid \"dictionary of headers to be set\"\n#~ msgstr \"словарь заголовков, которые будут заданы\"\n\n#~ msgid \"Sets token for the session by setting the Authorization header.\"\n#~ msgstr \"Задаёт токен для сессии (заголовок Authorization).\"\n\n#~ msgid \"`str`, API token\"\n#~ msgstr \"`str`, токен API\"\n\n#~ msgid \"**DEFAULT_N_RETRIES** - `int`, default number of retries\"\n#~ msgstr \"\"\n#~ \"**DEFAULT_N_RETRIES** - `int`, максимальное \"\n#~ \"число повторных попыток запроса по \"\n#~ \"умолчанию\"\n\n#~ msgid \"\"\n#~ \"**DEFAULT_UPLOAD_TIMEOUT** - analogous to \"\n#~ \"`DEFAULT_TIMEOUT` but for `upload` function\"\n#~ msgstr \"\"\n#~ \"**DEFAULT_UPLOAD_TIMEOUT** - аналогично \"\n#~ \"`DEFAULT_TIMEOUT`, но для функции `upload`\"\n\n#~ msgid \"\"\n#~ \"**DEFAULT_UPLOAD_RETRY_INTERVAL** - analogous to \"\n#~ \"`DEFAULT_RETRY_INTERVAL` but for `upload` \"\n#~ \"function\"\n#~ msgstr \"\"\n#~ \"**DEFAULT_UPLOAD_RETRY_INTERVAL** - аналогично \"\n#~ \"`DEFAULT_RETRY_INTERVAL`, но для функции \"\n#~ \"`upload`\"\n\n#~ msgid \"`bool`, not clear waht this is for\"\n#~ msgstr \"\"\n\n#~ msgid \"Get contents of a public directory.\"\n#~ msgstr \"Получает содержимое публичной папки.\"\n\n#~ msgid \"\"\n#~ \"relative path to the resource in \"\n#~ \"the public folder. By specifying the \"\n#~ \"key of the published folder in \"\n#~ \"`public_key`, you can request contents \"\n#~ \"of any nested folder.\"\n#~ msgstr \"\"\n#~ \"относительный путь к ресурсу в публичной\"\n#~ \" папке. Указывая ключ опубликованной папки\"\n#~ \" через `public_key`, вы можете запросить\"\n#~ \" содержимое любой вложенной папки.\"\n\n#~ msgid \"\"\n#~ \"Valid access rights: - `write`: write\"\n#~ \" access - `read`: read access - \"\n#~ \"`read_without_download`: read access without \"\n#~ \"download - `read_with_password`: read access\"\n#~ \" with password - \"\n#~ \"`read_with_password_without_download`: read access \"\n#~ \"with password and without download\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"`str`, specifies the type of access, \"\n#~ \"must be one of the following:  -\"\n#~ \" `macro`: access for all employees or\"\n#~ \" all users - `user`: access for \"\n#~ \"a specific user - `group`: access \"\n#~ \"for a specific group - `department`: \"\n#~ \"access for a specific department\"\n#~ msgstr \"\"\n#~ \"`str`, определяет тип доступа, значение \"\n#~ \"должно быть одним из следующих:  - \"\n#~ \"`macro`: все субъекты уровня общего \"\n#~ \"доступа - `user`: отрудник организации, \"\n#~ \"для которого настроен персональный доступ \"\n#~ \"- `group`: группа в организации, для \"\n#~ \"которой настроен персональный доступ - \"\n#~ \"`department`: отдел в организации, для \"\n#~ \"которого настроен персональный доступ\"\n\n#~ msgid \"\"\n#~ \"`Official docs <https://yandex.com/dev/disk-\"\n#~ \"api/doc/en/reference/meta?tabs=defaultTabsGroup-\"\n#~ \"ko8isjf5_resource%2520in%2520trash>`__\"\n#~ msgstr \"\"\n#~ \"`Официальная документация <https://yandex.ru/dev/disk-\"\n#~ \"api/doc/ru/reference/meta?tabs=defaultTabsGroup-\"\n#~ \"ko8isjf5_resource%2520in%2520trash>`__\"\n\n"
  },
  {
    "path": "docs/locales/ru/LC_MESSAGES/changelog.po",
    "content": "# changelog.rst translations\n# Copyright (C) 2026, Ivan Konovalov\n# This file is distributed under the same license as the YaDisk package.\n# Ivan Konovalov <ivknv0@gmail.com>, 2026.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: YaDisk 3.4.1\\n\"\n\"Report-Msgid-Bugs-To: ivknv0@gmail.com\\n\"\n\"POT-Creation-Date: 2026-04-15 18:50+0500\\n\"\n\"PO-Revision-Date: 2026-04-16 12:47+0500\\n\"\n\"Last-Translator: Ivan Konovalov <ivknv0@gmail.com>\\n\"\n\"Language-Team: Russian\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.18.0\\n\"\n\n#: ../../changelog.rst:2\nmsgid \"Changelog\"\nmsgstr \"История изменений\"\n\n#: ../../changelog.rst:23\nmsgid \"**Release 3.4.1 (2026-04-16)**\"\nmsgstr \"**Release 3.4.1 (2026-04-16)**\"\n\n#: ../../changelog.rst:25 ../../changelog.rst:77 ../../changelog.rst:103\n#: ../../changelog.rst:119 ../../changelog.rst:209\nmsgid \"Bug fixes:\"\nmsgstr \"Исправления:\"\n\n#: ../../changelog.rst:27\nmsgid \"\"\n\"Fixed a :code:`TypeError` when passing a file path to \"\n\":any:`AsyncClient.download()` or :any:`AsyncClient.upload()` while not \"\n\"having :code:`aiofiles` installed (see `issue #62`_)\"\nmsgstr \"\"\n\"Исправлена ошибка :code:`TypeError` при передаче пути к файлу в \"\n\":any:`AsyncClient.download()` или :any:`AsyncClient.upload()` без \"\n\"установленного :code:`aiofiles` (см. `issue #62`_)\"\n\n#: ../../changelog.rst:31\nmsgid \"\"\n\"Work around Yandex.Disk ignoring request body for :any:`Client.patch()` \"\n\"and :any:`Client.update_public_settings()` when using :code:`pycurl` due \"\n\"to setting :code:`Transfer-Encoding: chunked` by default\"\nmsgstr \"\"\n\"Обход проблемы, когда Яндекс.Диск игнорирует тело запроса для \"\n\":any:`Client.patch()` и :any:`Client.update_public_settings()` при \"\n\"использовании :code:`pycurl` из-за задания заголовка :code:`Transfer-Encoding: chunked` \"\n\"по умолчанию\"\n\n#: ../../changelog.rst:35\nmsgid \"**Release 3.4.0 (2025-07-10)**\"\nmsgstr \"**Release 3.4.0 (2025-07-10)**\"\n\n#: ../../changelog.rst:37 ../../changelog.rst:66 ../../changelog.rst:89\n#: ../../changelog.rst:112 ../../changelog.rst:161\nmsgid \"New features:\"\nmsgstr \"Нововведения:\"\n\n#: ../../changelog.rst:39\nmsgid \"Added methods for managing public settings of resources:\"\nmsgstr \"Добавлены методы для управления настройками публичного доступа к ресурсам:\"\n\n#: ../../changelog.rst:41\nmsgid \":any:`Client.update_public_settings()`\"\nmsgstr \":any:`Client.update_public_settings()`\"\n\n#: ../../changelog.rst:42\nmsgid \":any:`Client.get_public_settings()`\"\nmsgstr \":any:`Client.get_public_settings()`\"\n\n#: ../../changelog.rst:43\nmsgid \":any:`Client.get_public_available_settings()`\"\nmsgstr \":any:`Client.get_public_available_settings()`\"\n\n#: ../../changelog.rst:45\nmsgid \"\"\n\"Note, it appears that these API endpoints do not fully conform to the \"\n\"official REST API documentation, their functionality is limited in \"\n\"practice.\"\nmsgstr \"\"\n\"Внимание: похоже, что эти эндпоинты не полностью соответствуют \"\n\"официальной документации REST API, их функциональность на практике \"\n\"ограничена.\"\n\n#: ../../changelog.rst:49\nmsgid \"Added new exception class :any:`PasswordRequiredError`\"\nmsgstr \"Добавлен новый класс исключений :any:`PasswordRequiredError`\"\n\n#: ../../changelog.rst:51\nmsgid \"Added several new fields for :any:`DiskInfoObject`:\"\nmsgstr \"Добавлено несколько новых полей :any:`DiskInfoObject`:\"\n\n#: ../../changelog.rst:53\nmsgid \":code:`deletion_restricion_days`\"\nmsgstr \":code:`deletion_restricion_days`\"\n\n#: ../../changelog.rst:54\nmsgid \":code:`hide_screenshots_in_photoslice`\"\nmsgstr \":code:`hide_screenshots_in_photoslice`\"\n\n#: ../../changelog.rst:55\nmsgid \":code:`is_legal_entity`\"\nmsgstr \":code:`is_legal_entity`\"\n\n#: ../../changelog.rst:57\nmsgid \"Implemented the :code:`__dir__()` method for response objects\"\nmsgstr \"Реализован метод :code:`__dir__()` для объектов ответов сервера\"\n\n#: ../../changelog.rst:59 ../../changelog.rst:82 ../../changelog.rst:191\nmsgid \"Improvements:\"\nmsgstr \"Улучшения:\"\n\n#: ../../changelog.rst:61\nmsgid \"\"\n\":code:`repr()` of API response objects now only shows the keys that are \"\n\"actually present (instead of displaying them as :code:`None` like before)\"\nmsgstr \"\"\n\":code:`repr()` объектов ответов API теперь показывает только те ключи, \"\n\"которые фактически присутствуют (вместо отображения их значений как \"\n\":code:`None`, как раньше)\"\n\n#: ../../changelog.rst:64\nmsgid \"**Release 3.3.0 (2025-04-29)**\"\nmsgstr \"**Release 3.3.0 (2025-04-29)**\"\n\n#: ../../changelog.rst:68\nmsgid \"\"\n\"User-Agent spoofing to bypass Yandex.Disk's upload speed limit (see `PR \"\n\"#57`_). :any:`Client.upload()` and related methods (including \"\n\":any:`AsyncClient`) have a new optional parameter \"\n\":code:`spoof_user_agent`, which is set to :code:`True` by default. This \"\n\"parameter can be used to disable User-Agent spoofing if necessary.\"\nmsgstr \"\"\n\"Спуфинг User-Agent для обхода ограничения скорости загрузки файлов на \"\n\"Диск (см. `PR #57`_). :any:`Client.upload()` и связанные с ним методы \"\n\"(включая :any:`AsyncClient`) имеют новый опциональный параметр \"\n\":code:`spoof_user_agent`, который по умолчанию имеет значение \"\n\":code:`True`. Этот параметр можно использовать для отключения спуфинга, \"\n\"если это необходимо.\"\n\n#: ../../changelog.rst:74\nmsgid \"\"\n\"Added IPython's pretty printing support for :any:`YaDiskObject` and \"\n\"derived classes\"\nmsgstr \"\"\n\"Добавлена поддержка pretty-printing в IPython для :any:`YaDiskObject` и \"\n\"производных классов\"\n\n#: ../../changelog.rst:79\nmsgid \"\"\n\":any:`Client.wait_for_operation()` now uses :code:`time.monotonic()` \"\n\"instead of :code:`time.time()`\"\nmsgstr \"\"\n\":any:`Client.wait_for_operation()` теперь использует \"\n\":code:`time.monotonic()` вместо :code:`time.time()`\"\n\n#: ../../changelog.rst:84\nmsgid \"\"\n\"REST API error messages are now clearly divided into four parts (message,\"\n\" description, error code and HTTP status code)\"\nmsgstr \"\"\n\"Сообщения об ошибках REST API теперь чётко разделены на четыре части \"\n\"(сообщение, описание, код ошибки и код состояния HTTP)\"\n\n#: ../../changelog.rst:87\nmsgid \"**Release 3.2.0 (2025-02-03)**\"\nmsgstr \"**Release 3.2.0 (2025-02-03)**\"\n\n#: ../../changelog.rst:91\nmsgid \"\"\n\"Added new method: :any:`Client.makedirs()` / \"\n\":any:`AsyncClient.makedirs()` (see `issue #53`_)\"\nmsgstr \"\"\n\"Добавлен новый метод: :any:`Client.makedirs()` и \"\n\":any:`AsyncClient.makedirs()` (см. `issue #53`_)\"\n\n#: ../../changelog.rst:93\nmsgid \"Added several missing fields for :any:`DiskInfoObject`:\"\nmsgstr \"Добавлено несколько недостающих полей :any:`DiskInfoObject`\"\n\n#: ../../changelog.rst:95\nmsgid \":code:`photounlim_size`\"\nmsgstr \":code:`photounlim_size`\"\n\n#: ../../changelog.rst:96\nmsgid \":code:`will_be_overdrawn`\"\nmsgstr \":code:`will_be_overdrawn`\"\n\n#: ../../changelog.rst:97\nmsgid \":code:`free_photounlim_end_date`\"\nmsgstr \":code:`free_photounlim_end_date`\"\n\n#: ../../changelog.rst:98\nmsgid \":code:`payment_flow`\"\nmsgstr \":code:`payment_flow`\"\n\n#: ../../changelog.rst:100\nmsgid \"\"\n\"Added missing field :code:`sizes` for :any:`ResourceObject` and related \"\n\"objects\"\nmsgstr \"\"\n\"Добавлено недостающее поле :code:`sizes` для :any:`ResourceObject` и \"\n\"связанных с ним объектов\"\n\n#: ../../changelog.rst:105\nmsgid \"\"\n\":any:`Client.rename()` / :any:`AsyncClient.rename()` now raises \"\n\":any:`ValueError` on attempt to rename the root directory\"\nmsgstr \"\"\n\":any:`Client.rename()` / :any:`AsyncClient.rename()` теперь вызывает \"\n\":any:`ValueError` при попытке переименовать корневую папку\"\n\n#: ../../changelog.rst:107\nmsgid \"\"\n\"Automatic retry attempt numbers were logged off by one, now they are \"\n\"logged correctly\"\nmsgstr \"\"\n\"Номера автоматических повторных попыток логировались с ошибкой на \"\n\"единицу, теперь они логируются правильно\"\n\n#: ../../changelog.rst:110\nmsgid \"**Release 3.1.0 (2024-07-12)**\"\nmsgstr \"**Release 3.1.0 (2024-07-12)**\"\n\n#: ../../changelog.rst:114\nmsgid \"\"\n\"Added new exception classes: :any:`GoneError` and \"\n\":any:`ResourceDownloadLimitExceededError`\"\nmsgstr \"\"\n\"Добавлены новые исключения: :any:`GoneError` и \"\n\":any:`ResourceDownloadLimitExceededError`\"\n\n#: ../../changelog.rst:116\nmsgid \"\"\n\"Added a new method: :any:`Client.get_all_public_resources()` and \"\n\":any:`AsyncClient.get_all_public_resources()`\"\nmsgstr \"\"\n\"Добавлен новый метод: :any:`Client.get_all_public_resources()` и \"\n\":any:`AsyncClient.get_all_public_resources()`\"\n\n#: ../../changelog.rst:121\nmsgid \"\"\n\"Fixed setting :code:`headers` and session arguments to :code:`None` \"\n\"causing errors\"\nmsgstr \"\"\n\"Задание :code:`headers` и других опциональных параметров сессии как \"\n\":code:`None` больше не вызывает ошибок\"\n\n#: ../../changelog.rst:123\nmsgid \"\"\n\"Fixed incorrect handling of empty filename in :any:`Client.rename()` and \"\n\":any:`AsyncClient.rename()`\"\nmsgstr \"\"\n\"Исправлено неправильное поведение :any:`Client.rename()` и \"\n\":any:`AsyncClient.rename()` при указании пустого имени файла\"\n\n#: ../../changelog.rst:125\nmsgid \"\"\n\"Fixed several typos in async convenience method implementations \"\n\"(:code:`listdir()` and related)\"\nmsgstr \"\"\n\"Исправлено несколько опечаток в асинхронных реализациях \"\n\"convenience-методов (:code:`listdir()` и аналогичных)\"\n\n#: ../../changelog.rst:127\nmsgid \"\"\n\"Fixed :any:`PublicResourceListObject` having the wrong type for its \"\n\":code:`items` member\"\nmsgstr \"\"\n\"Исправлен неправильный тип данных у атрибута :code:`items` класса \"\n\":any:`PublicResourceListObject`\"\n\n#: ../../changelog.rst:129\nmsgid \"\"\n\"Fixed API requests not working with :any:`PycURLSession` when \"\n\":code:`stream=True` is set\"\nmsgstr \"\"\n\"Исправлены ошибки при отправке запросов API с помощью \"\n\":any:`PycURLSession` при задании :code:`stream=True`\"\n\n#: ../../changelog.rst:131\nmsgid \"\"\n\"No data will be written to the output file by :any:`Client.download()`, \"\n\":any:`Client.download_by_link()`, :any:`AsyncClient.download()` and \"\n\":any:`AsyncClient.download_by_link()` if the server returns a bad status \"\n\"code\"\nmsgstr \"\"\n\"Данные не будут записаны в файл методами :any:`Client.download()`, \"\n\":any:`Client.download_by_link()`, :any:`AsyncClient.download()` и \"\n\":any:`AsyncClient.download_by_link()`, если сервер вернул ошибочный код \"\n\"состояния\"\n\n#: ../../changelog.rst:136\nmsgid \"**Release 3.0.1 (2024-07-09)**\"\nmsgstr \"**Release 3.0.1 (2024-07-09)**\"\n\n#: ../../changelog.rst:138\nmsgid \"\"\n\"Fixed broken :code:`pyproject.toml` that did not include full package \"\n\"contents (see `issue #49`_)\"\nmsgstr \"\"\n\"Исправлен сломанный :code:`pyproject.toml`, который не включал в сборку \"\n\"полное содержимое пакета (см. `issue #49`_)\"\n\n#: ../../changelog.rst:141\nmsgid \"**Release 3.0.0 (2024-07-09)**\"\nmsgstr \"**Release 3.0.0 (2024-07-09)**\"\n\n#: ../../changelog.rst:143\nmsgid \"Breaking changes:\"\nmsgstr \"Несовместимые изменения:\"\n\n#: ../../changelog.rst:145\nmsgid \"See :doc:`/migration_guide` for full details\"\nmsgstr \"См. :doc:`/migration_guide` для подробностей\"\n\n#: ../../changelog.rst:146\nmsgid \"\"\n\"All methods wait for asynchronous operations to complete by default (see \"\n\"the new :code:`wait=<bool>` parameter)\"\nmsgstr \"\"\n\"Все методы теперь ожидают завершения асинхронных операций по умолчанию \"\n\"(см. новый параметр :code:`wait=<bool>`)\"\n\n#: ../../changelog.rst:148\nmsgid \"\"\n\"Iterating over the result of :any:`AsyncClient.listdir()` no longer \"\n\"requires the additional await keyword.\"\nmsgstr \"\"\n\"Итерация по результату :any:`AsyncClient.listdir()` больше не требует \"\n\"дополнительного ключевого слова await\"\n\n#: ../../changelog.rst:150\nmsgid \"\"\n\"Number of returned items of :any:`Client.get_files()` / \"\n\":any:`AsyncClient.get_files()` is now controlled by the :code:`max_items`\"\n\" parameter, rather than :code:`limit`\"\nmsgstr \"\"\n\"Число возвращаемых файлов :any:`Client.get_files()` / \"\n\":any:`AsyncClient.get_files()` теперь контролируется параметром \"\n\":code:`max_items`, вместо :code:`limit`\"\n\n#: ../../changelog.rst:153\nmsgid \"\"\n\"Methods :code:`set_token()`, :code:`set_headers()` of :any:`Session` and \"\n\":any:`AsyncSession` were removed\"\nmsgstr \"\"\n\"Методы :code:`set_token()`, :code:`set_headers()` интерфейсов \"\n\":any:`Session` и :any:`AsyncSession` были удалены\"\n\n#: ../../changelog.rst:155\nmsgid \"Some methods no longer accept the :code:`fields` parameter\"\nmsgstr \"Некоторые методы больше не принимают параметр :code:`fields`\"\n\n#: ../../changelog.rst:156\nmsgid \"\"\n\":any:`Client.get_last_uploaded()` / \"\n\":any:`AsyncClient.get_last_uploaded()` now return a list instead of a \"\n\"generator\"\nmsgstr \"\"\n\":any:`Client.get_last_uploaded()` / \"\n\":any:`AsyncClient.get_last_uploaded()` теперь возвращает список вместо \"\n\"генератора\"\n\n#: ../../changelog.rst:158\nmsgid \":code:`yadisk.api` is now a private module\"\nmsgstr \":code:`yadisk.api` - теперь скрытый модуль\"\n\n#: ../../changelog.rst:159\nmsgid \"\"\n\"All private modules were renamed to have names that start with :code:`_` \"\n\"(e.g, :code:`yadisk._api`)\"\nmsgstr \"\"\n\"Все скрытые модули были переименованы, их имена начинаются с :code:`_` \"\n\"(например, :code:`yadisk._api`)\"\n\n#: ../../changelog.rst:163\nmsgid \"\"\n\"Added methods to wait until an asynchronous operation completes (see \"\n\":any:`Client.wait_for_operation()` / \"\n\":any:`AsyncClient.wait_for_operation()`)\"\nmsgstr \"\"\n\"Добавлены методы для ожидания завершения асинхронной операции (см. \"\n\":any:`Client.wait_for_operation()` / \"\n\":any:`AsyncClient.wait_for_operation()`)\"\n\n#: ../../changelog.rst:165\nmsgid \"\"\n\"Methods that may start an asynchronous operation now accept additional \"\n\"parameters: :python:`wait: bool = True`, :python:`poll_interval: float = \"\n\"1.0` and :python:`poll_timeout: Optional[float] = None`\"\nmsgstr \"\"\n\"Методы, которые могут запускать асинхронную операцию, теперь принимают \"\n\"дополнительные параметры: :python:`wait: bool = True`, \"\n\":python:`poll_interval: float = 1.0` и :python:`poll_timeout: \"\n\"Optional[float] = None`\"\n\n#: ../../changelog.rst:169\nmsgid \"\"\n\":any:`Client.listdir()`, :any:`Client.get_files()` and their async \"\n\"variants now accept a new parameter :python:`max_items: Optional[int] = \"\n\"None`, which can be used to limit the maximum number of returned items\"\nmsgstr \"\"\n\":any:`Client.listdir()`, :any:`Client.get_files()` и их асинхронные \"\n\"вариации теперь принимают новый параметр :python:`max_items: \"\n\"Optional[int] = None`, который может быть использован, чтобы ограничить \"\n\"максимальное число возвращаемых файлов\"\n\n#: ../../changelog.rst:173\nmsgid \"\"\n\"Most :any:`Client` and :any:`AsyncClient` methods now accept an optional \"\n\"parameter :python:`retry_on: Optional[Tuple[Type[Exception], ...]] = \"\n\"None`, which lets you specify a tuple of additional exceptions that can \"\n\"trigger an automatic retry\"\nmsgstr \"\"\n\"Большинство методов :any:`Client` и :any:`AsyncClient` теперь принимает \"\n\":python:`retry_on: Optional[Tuple[Type[Exception], ...]] = None`, который\"\n\" позволяет указывать кортеж из дополнительных исключений, которые могут \"\n\"вызвать автоматическую повторную попытку\"\n\n#: ../../changelog.rst:177\nmsgid \":any:`yadisk.types` module is now public\"\nmsgstr \"Модуль :any:`yadisk.types` - теперь публичный\"\n\n#: ../../changelog.rst:178\nmsgid \"Added basic logging of outgoing API requests and automatic retries\"\nmsgstr \"\"\n\"Добавлено логирование исходящих запросов к API и автоматических повторных\"\n\" попыток\"\n\n#: ../../changelog.rst:179\nmsgid \"\"\n\"The logger instance for the library can be accessed as \"\n\":any:`yadisk.settings.logger`\"\nmsgstr \"Объект логгера библиотеки доступен как :any:`yadisk.settings.logger`\"\n\n#: ../../changelog.rst:181\nmsgid \"\"\n\"Added :any:`YaDiskObject.field()` and the :code:`@` operator \"\n\"(:any:`YaDiskObject.__matmul__()`) which verify that the given field is \"\n\"not :code:`None`\"\nmsgstr \"\"\n\"Добавлен метод :any:`YaDiskObject.field()` и оператор :code:`@` \"\n\"(:any:`YaDiskObject.__matmul__()`), который удостоверяется, что указанное\"\n\" поле объекта не является :code:`None`\"\n\n#: ../../changelog.rst:184\nmsgid \"\"\n\"Added :any:`Client.get_upload_link_object()`, \"\n\":any:`AsyncClient.get_upload_link_object()` whose return values \"\n\"additionally contain :code:`operation_id`\"\nmsgstr \"\"\n\"Добавлены методы :any:`Client.get_upload_link_object()`, \"\n\":any:`AsyncClient.get_upload_link_object()`, возвращаемые значения \"\n\"которых дополнительно содержат :code:`operation_id`\"\n\n#: ../../changelog.rst:187\nmsgid \":any:`utils.auto_retry()` now accepts more parameters\"\nmsgstr \":any:`utils.auto_retry()` теперь принимает больше параметров\"\n\n#: ../../changelog.rst:188\nmsgid \"Added a few missing fields for :any:`DiskInfoObject`\"\nmsgstr \"Добавлено несколько недостающих полей :any:`DiskInfoObject`\"\n\n#: ../../changelog.rst:189\nmsgid \":any:`EXIFObject` now contains GPS coordinates\"\nmsgstr \":any:`EXIFObject` теперь содержит GPS-координаты\"\n\n#: ../../changelog.rst:190\nmsgid \":any:`CaseInsensitiveDict` is now part of :any:`yadisk.utils`\"\nmsgstr \":any:`CaseInsensitiveDict` - теперь часть :any:`yadisk.utils`\"\n\n#: ../../changelog.rst:193\nmsgid \"\"\n\"Added full type hints for :any:`Client`, :any:`AsyncClient` through \"\n\":code:`.pyi` stub files\"\nmsgstr \"\"\n\"Добавлены полные подсказки типов для :any:`Client` и :any:`AsyncClient` с\"\n\" помощью файлов :code:`.pyi`\"\n\n#: ../../changelog.rst:195\nmsgid \"\"\n\"Docstrings for :any:`Client` / :any:`AsyncClient` now include more \"\n\"parameters\"\nmsgstr \"\"\n\"Строки документации для :any:`Client` / :any:`AsyncClient` теперь \"\n\"включают в себя больше параметров\"\n\n#: ../../changelog.rst:197\nmsgid \"\"\n\"Errors during JSON processing (e.g. :any:`InvalidResponseError`) also \"\n\"trigger automatic retries\"\nmsgstr \"\"\n\"Ошибки во время обработки JSON (например, :any:`InvalidResponseError`) \"\n\"также вызывают автоматические повторные попытки\"\n\n#: ../../changelog.rst:199\nmsgid \"\"\n\"Error message when the default session module is not available is now \"\n\"less confusing (see `issue #43`_)\"\nmsgstr \"\"\n\"Сообщение об ошибке в случае, когда модуль сессии по умолчанию \"\n\"недоступен, теперь не вводит в заблуждение (см. `issue #43`_)\"\n\n#: ../../changelog.rst:201\nmsgid \"\"\n\"Reduced :any:`Client.listdir()`'s default :code:`limit` to :code:`500` \"\n\"from :code:`10000` to avoid timeouts on large directories (see `issue \"\n\"#45`_)\"\nmsgstr \"\"\n\"Уменьшено значение :code:`limit` до :code:`500` (было :code:`10000`) для \"\n\":any:`Client.listdir()` для избежания таймаутов при больших папках (см. \"\n\"`issue #45`_)\"\n\n#: ../../changelog.rst:203\nmsgid \"\"\n\"Reduced :any:`Client.get_files()`'s default :code:`limit` to :code:`200` \"\n\"from :code:`1000` to avoid timeouts\"\nmsgstr \"\"\n\"Уменьшено значение :code:`limit` до :code:`200` (было :code:`1000`) для \"\n\":any:`Client.get_files()` для избежания таймаутов\"\n\n#: ../../changelog.rst:205\nmsgid \"\"\n\":any:`Client.download()` and similar methods no longer set \"\n\":code:`Connection: close` header, since it's not necessary (unlike with \"\n\":any:`Client.upload()`)\"\nmsgstr \"\"\n\":any:`Client.download()` и подобные методы больше не задают заголовок \"\n\":code:`Connection: close` т.к. в этом нет необходимости (в отличие от \"\n\":any:`Client.upload()`)\"\n\n#: ../../changelog.rst:208\nmsgid \":any:`UnknownYaDiskError` now includes status code in the error message\"\nmsgstr \"\"\n\":any:`UnknownYaDiskError` теперь включает код статуса в сообщение об \"\n\"ошибке\"\n\n#: ../../changelog.rst:211\nmsgid \"\"\n\"Fixed :code:`httpx`- and :code:`aiohttp`-based session implementations \"\n\"not converting their exceptions to :any:`RequestError` in their \"\n\":any:`Response.json()` / :any:`AsyncResponse.json()` implementations\"\nmsgstr \"\"\n\"Исправлены реализации на основе :code:`httpx` и :code:`aiohttp`: \"\n\"реализации методов :any:`Response.json()` / :any:`AsyncResponse.json()` \"\n\"не преобразовывали свои исключения в :any:`RequestError`\"\n\n#: ../../changelog.rst:214\nmsgid \"\"\n\"Fixed :python:`stream=True` not being set by default in \"\n\":any:`AsyncClient.download()`, :any:`AsyncClient.download_public()`\"\nmsgstr \"\"\n\"Исправлено: параметр :python:`stream=True` был не задан по умолчанию в \"\n\":any:`AsyncClient.download()`, :any:`AsyncClient.download_public()`\"\n\n#: ../../changelog.rst:216\nmsgid \"Other changes:\"\nmsgstr \"Другие изменения:\"\n\n#: ../../changelog.rst:218\nmsgid \":code:`typing_extensions` is now required for Python < 3.10\"\nmsgstr \":code:`typing_extensions` теперь требуется для Python < 3.10\"\n\n#: ../../changelog.rst:220\nmsgid \"**Release 2.1.0 (2024-01-03)**\"\nmsgstr \"**Release 2.1.0 (2024-01-03)**\"\n\n#: ../../changelog.rst:222\nmsgid \"Fixed a bug where POST request parameters were not encoded correctly\"\nmsgstr \"\"\n\"Исправлен баг, из-за которого параметры в теле POST-запроса неправильно \"\n\"кодировались\"\n\n#: ../../changelog.rst:223\nmsgid \"\"\n\"Fixed a bug in :code:`PycURLSession.send_request()` that made it ignore \"\n\"passed headers\"\nmsgstr \"\"\n\"Исправлен баг в :code:`PycURLSession.send_request()`, из-за которого \"\n\"переданные заголовки игнорировались\"\n\n#: ../../changelog.rst:224\nmsgid \"\"\n\":code:`RequestsSession.close()` now closes all underlying session \"\n\"instances, instead of only the current thread-local one\"\nmsgstr \":code:`RequestsSession.close()` теперь закрывает сессию для всех потоков\"\n\n#: ../../changelog.rst:226\nmsgid \"\"\n\"All methods of :any:`Client` and :any:`AsyncClient` now use existing \"\n\"session\"\nmsgstr \"\"\n\"Все методы :any:`Client` и :any:`AsyncClient` теперь используют \"\n\"существующую сессию\"\n\n#: ../../changelog.rst:227\nmsgid \"\"\n\"Removed :code:`session_factory` attribute and :code:`make_session()` \"\n\"method of :any:`Client` and :any:`AsyncClient`\"\nmsgstr \"\"\n\"Удалены аттрибут :code:`session_factory` и метод :code:`make_session()` \"\n\"классов :any:`Client` и :any:`AsyncClient`\"\n\n#: ../../changelog.rst:229\nmsgid \"\"\n\"Session class can now be specified as a string (see \"\n\":any:`Client`/:any:`AsyncClient`)\"\nmsgstr \"\"\n\"Класс сессии теперь может быть указан в качестве строки (см. \"\n\":any:`Client`/:any:`AsyncClient`)\"\n\n#: ../../changelog.rst:230\nmsgid \"\"\n\"Added \"\n\":any:`Client.get_device_code()`/:any:`AsyncClient.get_device_code()` \"\n\"methods\"\nmsgstr \"\"\n\"Добавлены методы \"\n\":any:`Client.get_device_code()`/:any:`AsyncClient.get_device_code()`\"\n\n#: ../../changelog.rst:231\nmsgid \"\"\n\"Added \"\n\":any:`Client.get_token_from_device_code()`/:any:`AsyncClient.get_token_from_device_code()`\"\n\" methods\"\nmsgstr \"\"\n\"Добавлены методы \"\n\":any:`Client.get_token_from_device_code()`/:any:`AsyncClient.get_token_from_device_code()`\"\n\n#: ../../changelog.rst:232\nmsgid \"\"\n\"Added missing :code:`redirect_uri` parameter for \"\n\":any:`Client.get_auth_url()`/:any:`AsyncClient.get_auth_url()` and \"\n\":any:`Client.get_code_url()`/:any:`AsyncClient.get_code_url()`\"\nmsgstr \"\"\n\"Добавлен недостающий параметр :code:`redirect_uri` для \"\n\":any:`Client.get_auth_url()`/:any:`AsyncClient.get_auth_url()` и \"\n\":any:`Client.get_code_url()`/:any:`AsyncClient.get_code_url()`\"\n\n#: ../../changelog.rst:234\nmsgid \"\"\n\"Added support for PKCE parameters for \"\n\":any:`Client.get_auth_url()`/:any:`AsyncClient.get_auth_url()`, \"\n\":any:`Client.get_code_url()`/:any:`AsyncClient.get_code_url()` and \"\n\":any:`Client.get_token()`/:any:`AsyncClient.get_token()`\"\nmsgstr \"\"\n\"Добавлена поддержка параметров PKCE для \"\n\":any:`Client.get_auth_url()`/:any:`AsyncClient.get_auth_url()`, \"\n\":any:`Client.get_code_url()`/:any:`AsyncClient.get_code_url()` и \"\n\":any:`Client.get_token()`/:any:`AsyncClient.get_token()`\"\n\n#: ../../changelog.rst:237\nmsgid \"Added :code:`scope` attribute for :any:`TokenObject`\"\nmsgstr \"Добавлен аттрибут :code:`scope` для :any:`TokenObject`\"\n\n#: ../../changelog.rst:238\nmsgid \"\"\n\"Added new exception classes: :any:`InvalidClientError`, \"\n\":any:`InvalidGrantError`, :any:`AuthorizationPendingError`, \"\n\":any:`BadVerificationCodeError` and :any:`UnsupportedTokenTypeError`\"\nmsgstr \"\"\n\"Добавлены новые классы исключений: :any:`InvalidClientError`, \"\n\":any:`InvalidGrantError`, :any:`AuthorizationPendingError`, \"\n\":any:`BadVerificationCodeError` и :any:`UnsupportedTokenTypeError`\"\n\n#: ../../changelog.rst:242\nmsgid \"**Release 2.0.0 (2023-12-12)**\"\nmsgstr \"**Release 2.0.0 (2023-12-12)**\"\n\n#: ../../changelog.rst:244\nmsgid \"\"\n\"The library now provides both synchronous and asynchronous APIs (see \"\n\":doc:`/intro` and :doc:`/api_reference/index`)\"\nmsgstr \"\"\n\"Библиотека теперь предоставляет как синхронный, так и асинхронный API \"\n\"(см. :doc:`/intro` и :doc:`/api_reference/index`)\"\n\n#: ../../changelog.rst:246\nmsgid \"\"\n\"Multiple HTTP libraries are supported by default (see \"\n\":doc:`/api_reference/sessions` for the full list)\"\nmsgstr \"\"\n\"Теперь поддерживается несколько HTTP библиотек (см. \"\n\":doc:`/api_reference/sessions` для полного списка)\"\n\n#: ../../changelog.rst:248\nmsgid \"\"\n\"It is now possible to add support for any HTTP library (see \"\n\":doc:`/api_reference/session_interface`)\"\nmsgstr \"\"\n\"Теперь возможно добавить поддержку любой HTTP библиотеки (см. \"\n\":doc:`/api_reference/session_interface`)\"\n\n#: ../../changelog.rst:250\nmsgid \"\"\n\"`requests`_ is now an optional dependency (although it's still used by \"\n\"default for synchronous API)\"\nmsgstr \"\"\n\"`requests`_ - теперь опциональная зависимость (хотя всё ещё используется \"\n\"по умолчанию для синхронного API)\"\n\n#: ../../changelog.rst:252\nmsgid \"\"\n\"Note that now requests-specific arguments must be passed differently (see\"\n\" :doc:`/api_reference/sessions`)\"\nmsgstr \"\"\n\"Обратите внимание, что аргументы, специфичные для requests теперь \"\n\"передаются по другому (см. :doc:`/api_reference/sessions`)\"\n\n#: ../../changelog.rst:253\nmsgid \"\"\n\"Preferred HTTP client libraries must be explicitly installed now (see \"\n\":doc:`/intro`)\"\nmsgstr \"\"\n\"Предпочитаемые HTTP библиотеки теперь должны быть установлены явным \"\n\"образом (см. :doc:`/intro`)\"\n\n#: ../../changelog.rst:254\nmsgid \"\"\n\":any:`Client.upload()` and :any:`Client.upload_by_link()` can now accept \"\n\"a function that returns an iterator (or a generator) as a payload\"\nmsgstr \"\"\n\":any:`Client.upload()` и :any:`Client.upload_by_link()` теперь могут \"\n\"принимать функцию, возвращающую итератор (или генератор) в качестве \"\n\"полезной нагрузки\"\n\n#: ../../changelog.rst:257\nmsgid \"**Release 1.3.4 (2023-10-15)**\"\nmsgstr \"**Release 1.3.4 (2023-10-15)**\"\n\n#: ../../changelog.rst:259\nmsgid \"\"\n\"`upload()` and `download()` (and related) methods can now upload/download\"\n\" non-seekable file-like objects (e.g. `stdin` or `stdout` when open in \"\n\"binary mode), see `PR #31`_\"\nmsgstr \"\"\n\"Методы `upload()` и `download()` (и связянные с ними) теперь могут \"\n\"загружать/скачивать файлы, не поддерживающие операцию `seek()` (например,\"\n\" `stdin` и `stdout`, при условии, что они открыты в режиме `\\\"rb\\\"` или \"\n\"`\\\"wb\\\"`), см. `PR #31`_\"\n\n#: ../../changelog.rst:263\nmsgid \"**Release 1.3.3 (2023-04-22)**\"\nmsgstr \"**Release 1.3.3 (2023-04-22)**\"\n\n#: ../../changelog.rst:265\nmsgid \"`app:/` paths now work correctly (see `issue #26`_)\"\nmsgstr \"Пути вида `app:/` теперь работают правильно (см. `issue #26`_)\"\n\n#: ../../changelog.rst:267\nmsgid \"**Release 1.3.2 (2023-03-20)**\"\nmsgstr \"**Release 1.3.2 (2023-03-20)**\"\n\n#: ../../changelog.rst:269\nmsgid \"Fixed `issue #29`_: TypeError: 'type' object is not subscriptable\"\nmsgstr \"Исправлено `issue #29`_: TypeError: 'type' object is not subscriptable\"\n\n#: ../../changelog.rst:271\nmsgid \"**Release 1.3.1 (2023-02-28)**\"\nmsgstr \"**Release 1.3.1 (2023-02-28)**\"\n\n#: ../../changelog.rst:273\nmsgid \"\"\n\"Fixed `issue #28`_: calling `download_public()` with `path` keyword \"\n\"argument raises `TypeError`\"\nmsgstr \"\"\n\"Исправлено `issue #28`_: `TypeError` при вызове `download_public()` с \"\n\"параметром `path`\"\n\n#: ../../changelog.rst:274\nmsgid \"\"\n\"Fixed `AttributeError` raised when calling \"\n\"`ResourceLinkObject.public_listdir()`\"\nmsgstr \"\"\n\"Исправлено `AttributeError` при вызове \"\n\"`ResourceLinkObject.public_listdir()`\"\n\n#: ../../changelog.rst:276\nmsgid \"**Release 1.3.0 (2023-01-30)**\"\nmsgstr \"**Release 1.3.0 (2023-01-30)**\"\n\n#: ../../changelog.rst:278\nmsgid \"\"\n\"Added convenience methods to `...Object` objects (e.g. see \"\n\"`ResourceObject`)\"\nmsgstr \"\"\n\"Добавлены convenience-методы для объектов `...Object` (например, см. \"\n\"`ResourceObject`)\"\n\n#: ../../changelog.rst:279\nmsgid \"Added type hints\"\nmsgstr \"Добавлены подсказки типов (type hints)\"\n\n#: ../../changelog.rst:280\nmsgid \"Improved error checking and response validation\"\nmsgstr \"Улучшены проверки ошибок и проверка ответа\"\n\n#: ../../changelog.rst:281\nmsgid \"\"\n\"Added `InvalidResponseError`, `PayloadTooLargeError`, \"\n\"`UploadTrafficLimitExceededError`\"\nmsgstr \"\"\n\"Добавлены `InvalidResponseError`, `PayloadTooLargeError`, \"\n\"`UploadTrafficLimitExceededError`\"\n\n#: ../../changelog.rst:282\nmsgid \"Added a few missing fields to `DiskInfoObject` and `SystemFoldersObject`\"\nmsgstr \"\"\n\"Добавлено несколько недостающих полей объектов `DiskInfoObject` и \"\n\"`SystemFoldersObject`\"\n\n#: ../../changelog.rst:283\nmsgid \"Added `rename()`, `upload_by_link()` and `download_by_link()` methods\"\nmsgstr \"Добавлены методы `rename()`, `upload_by_link()` и `download_by_link()`\"\n\n#: ../../changelog.rst:284\nmsgid \"Added `default_args` field for `YaDisk` object\"\nmsgstr \"Добавлен аттрибут `default_args` объекта `YaDisk`\"\n\n#: ../../changelog.rst:285\nmsgid \"`download()` and `upload()` now return `ResourceLinkObject`\"\nmsgstr \"`download()` и `upload()` теперь возвращают `ResourceLinkObject`\"\n\n#: ../../changelog.rst:286\nmsgid \"\"\n\"Returned `LinkObject` instances have been replaced by more specific \"\n\"subclasses\"\nmsgstr \"\"\n\"До этого возвращаемые объекты `LinkObject` были заменены более \"\n\"конкретными подклассами\"\n\n#: ../../changelog.rst:287\nmsgid \":any:`ConnectionError` now also triggers a retry\"\nmsgstr \":any:`ConnectionError` теперь тоже вызывает повторную попытку\"\n\n#: ../../changelog.rst:289\nmsgid \"**Release 1.2.19 (2023-01-20)**\"\nmsgstr \"**Release 1.2.19 (2023-01-20)**\"\n\n#: ../../changelog.rst:291\nmsgid \"\"\n\"Fixed incorrect behavior of the fix from 1.2.18 for paths `disk:` and \"\n\"`trash:` (only these two).\"\nmsgstr \"\"\n\"Исправлено неправильное поведение фикса из 1.2.18 для путей `disk:` и \"\n\"`trash:`.\"\n\n#: ../../changelog.rst:294\nmsgid \"**Release 1.2.18 (2023-01-20)**\"\nmsgstr \"**Release 1.2.18 (2023-01-20)**\"\n\n#: ../../changelog.rst:296\nmsgid \"\"\n\"Fixed `issue #26`_: ':' character in filenames causes `BadRequestError`. \"\n\"This is due the behavior of Yandex.Disk's REST API itself but is avoided \"\n\"on the library level with this fix.\"\nmsgstr \"\"\n\"Исправлено `issue #26`_: символ ':' в именах файлов приводит к \"\n\"`BadRequestError`. Это поведение вызвано работой самого REST API \"\n\"Яндекс.Диска, но было исправлено на уровне библиотеки.\"\n\n#: ../../changelog.rst:300\nmsgid \"**Release 1.2.17 (2022-12-11)**\"\nmsgstr \"**Release 1.2.17 (2022-12-11)**\"\n\n#: ../../changelog.rst:302\nmsgid \"\"\n\"Fixed a minor bug which could cause a `ReferenceError` (which would not \"\n\"cause a crash, but still show an error message). The bug involved using \"\n\"`__del__()` method in `SelfDestructingSession` to automatically close the\"\n\" sessions it seems to affect primarily old Python versions (such as 3.4).\"\nmsgstr \"\"\n\"Исправлен баг, связанный с автоматическим закрытием сессии.Использование \"\n\"метода `__del__()` приводило в некоторых случаях к ошибке \"\n\"`ReferenceError` (ошибка игнорировалась, но сообщение выводилось).Баг \"\n\"проявляется по большей части в старых версиях Python (например 3.4).\"\n\n#: ../../changelog.rst:308\nmsgid \"**Release 1.2.16 (2022-08-17)**\"\nmsgstr \"**Release 1.2.16 (2022-08-17)**\"\n\n#: ../../changelog.rst:310\nmsgid \"\"\n\"Fixed a bug in `check_token()`: could throw `ForbiddenError` if the \"\n\"application lacks necessary permissions (`issue #23`_).\"\nmsgstr \"\"\n\"Исправлен баг в `check_token()`: функция могла вызвать \"\n\":code:`ForbiddenError`, если у приложения недостатчно прав (`issue \"\n\"#23`_).\"\n\n#: ../../changelog.rst:313\nmsgid \"**Release 1.2.15 (2021-12-31)**\"\nmsgstr \"**Release 1.2.15 (2021-12-31)**\"\n\n#: ../../changelog.rst:315\nmsgid \"\"\n\"Fixed an issue where `http://` links were not recognized as operation \"\n\"links (they were assumed to always be `https://`, since all the other \"\n\"requests are always HTTPS). Occasionally, Yandex.Disk can for some reason\"\n\" return an `http://` link to an asynchronous operation instead of \"\n\"`https://`. Both links are now recognized correctly and an `https://` \"\n\"version will always be used by `get_operation_status()`, regardless of \"\n\"which one Yandex.Disk returned.\"\nmsgstr \"\"\n\"Исправлено: не распознавались ссылки на асинхронные операции, если они \"\n\"использовали `http://` (вместо `https://`). Иногда Яндекс.Диск может \"\n\"вернуть `http://` ссылку на асинхронную операцию. Теперь обе версии \"\n\"ссылок распознаются правильно, при этом, при получении информации об \"\n\"операции (через `get_operation_status()`) всегда используется `https://` \"\n\"версия ссылки, даже если Яндекс.Диск вернул `http://`.\"\n\n#: ../../changelog.rst:324\nmsgid \"**Release 1.2.14 (2019-03-26)**\"\nmsgstr \"**Release 1.2.14 (2019-03-26)**\"\n\n#: ../../changelog.rst:326\nmsgid \"\"\n\"Fixed a `TypeError` in `get_public_*` functions when passing `path` \"\n\"parameter (see `issue #7`_)\"\nmsgstr \"\"\n\"Исправлена ошибка `TypeError` в функциях `get_public_*` при использовании\"\n\" с параметром `path` (`issue #7`_)\"\n\n#: ../../changelog.rst:328\nmsgid \"Added `unlimited_autoupload_enabled` attribute for `DiskInfoObject`\"\nmsgstr \"Добавлен аттрибут `unlimited_autoupload_enabled` для `DiskInfoObject`\"\n\n#: ../../changelog.rst:330\nmsgid \"**Release 1.2.13 (2019-02-23)**\"\nmsgstr \"**Release 1.2.13 (2019-02-23)**\"\n\n#: ../../changelog.rst:332\nmsgid \"Added `md5` parameter for `remove()`\"\nmsgstr \"Добавлен параметр `md5` для `remove()`\"\n\n#: ../../changelog.rst:333\nmsgid \"Added `UserPublicInfoObject`\"\nmsgstr \"Добавлен `UserPublicInfoObject`\"\n\n#: ../../changelog.rst:334\nmsgid \"Added `country` attribute for `UserObject`\"\nmsgstr \"Добавлен аттрибут `country` для `UserObject`\"\n\n#: ../../changelog.rst:335\nmsgid \"\"\n\"Added `photoslice_time` attribute for `ResourceObject`, \"\n\"`PublicResourceObject` and `TrashResourceObject`\"\nmsgstr \"\"\n\"Добавлен аттрибут `photoslice_time` для `ResourceObject`, \"\n\"`PublicResourceObject` и `TrashResourceObject`\"\n\n#: ../../changelog.rst:338\nmsgid \"**Release 1.2.12 (2018-10-11)**\"\nmsgstr \"**Release 1.2.12 (2018-10-11)**\"\n\n#: ../../changelog.rst:340\nmsgid \"Fixed `fields` parameter not working properly in `listdir()` (`issue #4`_)\"\nmsgstr \"Исправлен баг: не работает параметр `fields` в `listdir()` (`issue #4`_)\"\n\n#: ../../changelog.rst:342\nmsgid \"**Release 1.2.11 (2018-06-30)**\"\nmsgstr \"**Release 1.2.11 (2018-06-30)**\"\n\n#: ../../changelog.rst:344\nmsgid \"Added the missing parameter `sort` for `get_meta()`\"\nmsgstr \"Добавлен недостающий параметр `sort` для `get_meta()`\"\n\n#: ../../changelog.rst:345\nmsgid \"\"\n\"Added `file` and `antivirus_status` attributes for `ResourceObject`, \"\n\"`PublicResourceObject` and `TrashResourceObject`\"\nmsgstr \"\"\n\"Добавлены аттрибуты `file` и `antivirus_status` для `ResourceObject`, \"\n\"`PublicResourceObject` и `TrashResourceObject`\"\n\n#: ../../changelog.rst:347\nmsgid \"Added `headers` parameter\"\nmsgstr \"Добавлен параметр `headers`\"\n\n#: ../../changelog.rst:348\nmsgid \"Fixed a typo in `download()` and `download_public()` (`issue #2`_)\"\nmsgstr \"Исправлена опечатка в `download()` и `download_public()` (`issue #2`_)\"\n\n#: ../../changelog.rst:349\nmsgid \"Removed `*args` parameter everywhere\"\nmsgstr \"Убран параметр `*args`\"\n\n#: ../../changelog.rst:351\nmsgid \"**Release 1.2.10 (2018-06-14)**\"\nmsgstr \"**Release 1.2.10 (2018-06-14)**\"\n\n#: ../../changelog.rst:353\nmsgid \"\"\n\"Fixed `timeout=None` behavior. `None` is supposed to mean 'no timeout' \"\n\"but in the older versions it was synonymous with the default timeout.\"\nmsgstr \"\"\n\"Исправлено поведение `timeout=None`. `None` должен означать 'без \"\n\"таймаута', но в предыдущих версиях значение `None` было синонимично со \"\n\"стандартным таймаутом.\"\n\n#: ../../changelog.rst:356\nmsgid \"**Release 1.2.9 (2018-04-28)**\"\nmsgstr \"**Release 1.2.9 (2018-04-28)**\"\n\n#: ../../changelog.rst:358\nmsgid \"Changed the license to LGPLv3 (see `COPYING` and `COPYING.lesser`)\"\nmsgstr \"Изменена лицензия на LGPLv3 (см. `COPYING` и `COPYING.lesser`)\"\n\n#: ../../changelog.rst:359\nmsgid \"Other package info updates\"\nmsgstr \"Другие изменения информации о пакете\"\n\n#: ../../changelog.rst:361\nmsgid \"**Release 1.2.8 (2018-04-17)**\"\nmsgstr \"**Release 1.2.8 (2018-04-17)**\"\n\n#: ../../changelog.rst:363\nmsgid \"\"\n\"Fixed a couple of typos: `PublicResourceListObject.items` and \"\n\"`TrashResourceListObject.items` had wrong types\"\nmsgstr \"\"\n\"Исправлено несколько опечаток: у `PublicResourceListObject.items` и \"\n\"`TrashResourceListObject.items` были неправильные типы данных\"\n\n#: ../../changelog.rst:365\nmsgid \"\"\n\"Substitute field aliases in `fields` parameter when performing API \"\n\"requests (e.g. `embedded` -> `_embedded`)\"\nmsgstr \"\"\n\"Псевдонимы полей в параметре `fields` заменяются при выполнении запросов \"\n\"API (например, `embedded` -> `_embedded`)\"\n\n#: ../../changelog.rst:368\nmsgid \"**Release 1.2.7 (2018-04-15)**\"\nmsgstr \"**Release 1.2.7 (2018-04-15)**\"\n\n#: ../../changelog.rst:370\nmsgid \"Fixed a file rewinding bug when uploading/downloading files after a retry\"\nmsgstr \"\"\n\"Исправлен баг перемотки файла при загрузке/скачивании после повторной \"\n\"попытки\"\n\n#: ../../changelog.rst:372\nmsgid \"**Release 1.2.6 (2018-04-13)**\"\nmsgstr \"**Release 1.2.6 (2018-04-13)**\"\n\n#: ../../changelog.rst:374\nmsgid \"\"\n\"Now caching `requests` sessions so that open connections can be reused \"\n\"(which can significantly speed things up sometimes)\"\nmsgstr \"\"\n\"Теперь объекты сессий `requests` кэшируются, чтобы их можно было \"\n\"переиспользовать (иногда может существенно ускорить выполнение запросов)\"\n\n#: ../../changelog.rst:376\nmsgid \"Disable `keep-alive` when uploading/downloading files by default\"\nmsgstr \"`keep-alive` отключается при загрузке/скачивании файлов по умолчанию\"\n\n#: ../../changelog.rst:378\nmsgid \"**Release 1.2.5 (2018-03-31)**\"\nmsgstr \"**Release 1.2.5 (2018-03-31)**\"\n\n#: ../../changelog.rst:380\nmsgid \"\"\n\"Fixed an off-by-one bug in `utils.auto_retry()` (which could sometimes \"\n\"result in `AttributeError`)\"\nmsgstr \"\"\n\"Исправлен баг (ошибка на единицу) в `utils.auto_retry()` (иногда мог \"\n\"вызвать `AttributeError`)\"\n\n#: ../../changelog.rst:382\nmsgid \"\"\n\"Retry the whole request for `upload()`, `download()` and \"\n\"`download_public()`\"\nmsgstr \"\"\n\"Повторные попытки применяются для `upload()`, `download()` и \"\n\"`download_public()` целиком\"\n\n#: ../../changelog.rst:383\nmsgid \"Set `stream=True` for `download()` and `download_public()`\"\nmsgstr \"Задано `stream=True` для `download()` и `download_public()`\"\n\n#: ../../changelog.rst:384\nmsgid \"Other minor fixes\"\nmsgstr \"Другие мелкие исправления\"\n\n#: ../../changelog.rst:386\nmsgid \"**Release 1.2.4 (2018-02-19)**\"\nmsgstr \"**Release 1.2.4 (2018-02-19)**\"\n\n#: ../../changelog.rst:388\nmsgid \"\"\n\"Fixed `TokenObject` having `exprires_in` instead of `expires_in` (fixed a\"\n\" typo)\"\nmsgstr \"\"\n\"Исправлена опечатка (`TokenObject.exprires_in` -> \"\n\"`TokenObject.expires_in`)\"\n\n#: ../../changelog.rst:390\nmsgid \"**Release 1.2.3 (2018-01-20)**\"\nmsgstr \"**Release 1.2.3 (2018-01-20)**\"\n\n#: ../../changelog.rst:392\nmsgid \"Fixed a `TypeError` when `WrongResourceTypeError` is raised\"\nmsgstr \"Исправлено `TypeError` при вызове `WrongResourceTypeError`\"\n\n#: ../../changelog.rst:394\nmsgid \"**Release 1.2.2 (2018-01-19)**\"\nmsgstr \"**Release 1.2.2 (2018-01-19)**\"\n\n#: ../../changelog.rst:396\nmsgid \"`refresh_token()` no longer requires a valid or empty token.\"\nmsgstr \"`refresh_token()` больше не требует валидный или пустой токен.\"\n\n#: ../../changelog.rst:398\nmsgid \"**Release 1.2.1 (2018-01-14)**\"\nmsgstr \"**Release 1.2.1 (2018-01-14)**\"\n\n#: ../../changelog.rst:400\nmsgid \"Fixed auto retries not working. Whoops.\"\nmsgstr \"Исправлена неработоспособность повторных попыток.\"\n\n#: ../../changelog.rst:402\nmsgid \"**Release 1.2.0 (2018-01-14)**\"\nmsgstr \"**Release 1.2.0 (2018-01-14)**\"\n\n#: ../../changelog.rst:404\nmsgid \"\"\n\"Fixed passing `n_retries=0` to `upload()`, `download()` and \"\n\"`download_public()`\"\nmsgstr \"\"\n\"Исправлено использование `n_retries=0` в `upload()`, `download()` и \"\n\"`download_public()`\"\n\n#: ../../changelog.rst:406\nmsgid \"\"\n\"`upload()`, `download()` and `download_public()` no longer return \"\n\"anything (see the docs)\"\nmsgstr \"\"\n\"`upload()`, `download()` и `download_public()` больше не возвращают \"\n\"ничего (см. документацию)\"\n\n#: ../../changelog.rst:408\nmsgid \"Added `utils` module (see the docs)\"\nmsgstr \"Добавлен модуль `utils` (см. документацию)\"\n\n#: ../../changelog.rst:409\nmsgid \"\"\n\"Added `RetriableYaDiskError`, `WrongResourceTypeError`, `BadGatewayError`\"\n\" and `GatewayTimeoutError`\"\nmsgstr \"\"\n\"Добавлены `RetriableYaDiskError`, `WrongResourceTypeError`, \"\n\"`BadGatewayError` и `GatewayTimeoutError`\"\n\n#: ../../changelog.rst:411\nmsgid \"\"\n\"`listdir()` now raises `WrongResourceTypeError` instead of \"\n\"`NotADirectoryError`\"\nmsgstr \"\"\n\"`listdir()` теперь вызывает `WrongResourceTypeError` вместо \"\n\"`NotADirectoryError`\"\n\n#: ../../changelog.rst:414\nmsgid \"**Release 1.1.1 (2017-12-29)**\"\nmsgstr \"**Release 1.1.1 (2017-12-29)**\"\n\n#: ../../changelog.rst:416\nmsgid \"\"\n\"Fixed argument handling in `upload()`, `download()` and \"\n\"`download_public()`. Previously, passing `n_retries` and `retry_interval`\"\n\" would raise an exception (`TypeError`).\"\nmsgstr \"\"\n\"Исправлена обработка аргументов в `upload()`, `download()` и \"\n\"`download_public()`. До этого использование `n_retries` и \"\n\"`retry_interval` вызывало исключение (`TypeError`).\"\n\n#: ../../changelog.rst:419\nmsgid \"**Release 1.1.0 (2017-12-27)**\"\nmsgstr \"**Release 1.1.0 (2017-12-27)**\"\n\n#: ../../changelog.rst:421\nmsgid \"Better exceptions (see the docs)\"\nmsgstr \"Усовершенствованные исключения (см. документацию)\"\n\n#: ../../changelog.rst:422\nmsgid \"Added support for `force_async` parameter\"\nmsgstr \"Добавлена поддержка параметра `force_async`\"\n\n#: ../../changelog.rst:423\nmsgid \"Minor bug fixes\"\nmsgstr \"Мелкие исправления багов\"\n\n#: ../../changelog.rst:425\nmsgid \"**Release 1.0.8 (2017-11-29)**\"\nmsgstr \"**Release 1.0.8 (2017-11-29)**\"\n\n#: ../../changelog.rst:427\nmsgid \"Fixed yet another `listdir()` bug\"\nmsgstr \"Исправлен ещё один баг в `listdir()`\"\n\n#: ../../changelog.rst:429\nmsgid \"**Release 1.0.7 (2017-11-04)**\"\nmsgstr \"**Release 1.0.7 (2017-11-04)**\"\n\n#: ../../changelog.rst:431\nmsgid \"Added `install_requires` argument to `setup.py`\"\nmsgstr \"Добавлен `install_requires` в `setup.py`\"\n\n#: ../../changelog.rst:433\nmsgid \"**Release 1.0.6 (2017-11-04)**\"\nmsgstr \"**Release 1.0.6 (2017-11-04)**\"\n\n#: ../../changelog.rst:435\nmsgid \"Return `OperationLinkObject` in some functions\"\nmsgstr \"Некоторые функции теперь возвращают `OperationLinkObject`\"\n\n#: ../../changelog.rst:437\nmsgid \"**Release 1.0.5 (2017-10-29)**\"\nmsgstr \"**Release 1.0.5 (2017-10-29)**\"\n\n#: ../../changelog.rst:439\nmsgid \"Fixed `setup.py` to exclude tests\"\nmsgstr \"Исправлен `setup.py`, теперь исключает тесты\"\n\n#: ../../changelog.rst:441\nmsgid \"**Release 1.0.4 (2017-10-23)**\"\nmsgstr \"**Release 1.0.4 (2017-10-23)**\"\n\n#: ../../changelog.rst:443\nmsgid \"Fixed bugs in `upload`, `download` and `listdir` functions\"\nmsgstr \"Исправлены баги в `upload`, `download` и `listdir`\"\n\n#: ../../changelog.rst:444\nmsgid \"Set default `listdir` `limit` to `10000`\"\nmsgstr \"Значение по-умолчанию `limit` в `listdir` установлено в `10000`\"\n\n#: ../../changelog.rst:446\nmsgid \"**Release 1.0.3 (2017-10-22)**\"\nmsgstr \"**Release 1.0.3 (2017-10-22)**\"\n\n#: ../../changelog.rst:448\nmsgid \"Added settings\"\nmsgstr \"Добавлен модуль `settings`\"\n\n#: ../../changelog.rst:450\nmsgid \"**Release 1.0.2 (2017-10-19)**\"\nmsgstr \"**Release 1.0.2 (2017-10-19)**\"\n\n#: ../../changelog.rst:452\nmsgid \"Fixed `get_code_url` function (added missing parameters)\"\nmsgstr \"Исправлена функция `get_code_url` (добавлены недостающие параметры)\"\n\n#: ../../changelog.rst:454\nmsgid \"**Release 1.0.1 (2017-10-18)**\"\nmsgstr \"**Release 1.0.1 (2017-10-18)**\"\n\n#: ../../changelog.rst:456\nmsgid \"Fixed a major bug in `GetTokenRequest` (added missing parameter)\"\nmsgstr \"\"\n\"Исправлен серьёзный баг в `GetTokenRequest` (добавлен недостающий \"\n\"параметр)\"\n\n#: ../../changelog.rst:458\nmsgid \"**Release 1.0.0 (2017-10-18)**\"\nmsgstr \"**Release 1.0.0 (2017-10-18)**\"\n\n#: ../../changelog.rst:460\nmsgid \"Initial release\"\nmsgstr \"Первый релиз\"\n\n#~ msgid \"\"\n#~ \":any:`Client.upload()` and :any:`Client.upload_by_link()`\"\n#~ \" can now accept a function that \"\n#~ \"returns an iterator (or a generator)\"\n#~ msgstr \"\"\n\n#~ msgid \"Fix a bug where POST request parameters were not encoded correctly\"\n#~ msgstr \"\"\n\n#~ msgid \"\"\n#~ \"**Release 3.0.1 (2024-07-09)** * Fixed \"\n#~ \"broken :code:`pyproject.toml` that did not \"\n#~ \"include full package contents\"\n#~ msgstr \"\"\n\n"
  },
  {
    "path": "docs/locales/ru/LC_MESSAGES/index.po",
    "content": "# index.rst translations.\n# Copyright (C) 2023, Ivan Konovalov\n# This file is distributed under the same license as the YaDisk package.\n# Ivan Konovalov <ivknv0@gmail.com>, 2023.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: YaDisk 2.0.0\\n\"\n\"Report-Msgid-Bugs-To: ivknv0@gmail.com\\n\"\n\"POT-Creation-Date: 2021-12-31 14:42+0500\\n\"\n\"PO-Revision-Date: 2023-12-12 19:59+0500\\n\"\n\"Last-Translator: Ivan Konovalov <ivknv0@gmail.com>\\n\"\n\"Language-Team: Russian\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.9.1\\n\"\n\n#: ../../index.rst:9\nmsgid \"Contents:\"\nmsgstr \"Содержание:\"\n\n#: ../../index.rst:7\nmsgid \"Welcome to YaDisk's documentation!\"\nmsgstr \"Документация YaDisk\"\n\n#: ../../index.rst:18\nmsgid \"Indices and tables\"\nmsgstr \"Индексы и таблицы\"\n\n#: ../../index.rst:20\nmsgid \":ref:`genindex`\"\nmsgstr \":ref:`genindex`\"\n\n#: ../../index.rst:21\nmsgid \":ref:`modindex`\"\nmsgstr \":ref:`modindex`\"\n\n#: ../../index.rst:22\nmsgid \":ref:`search`\"\nmsgstr \":ref:`search`\"\n"
  },
  {
    "path": "docs/locales/ru/LC_MESSAGES/intro.po",
    "content": "# intro.rst translations.\n# Copyright (C) 2023, Ivan Konovalov\n# This file is distributed under the same license as the YaDisk package.\n# Ivan Konovalov <ivknv0@gmail.com>, 2023.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: YaDisk 2.0.0\\n\"\n\"Report-Msgid-Bugs-To: ivknv0@gmail.com\\n\"\n\"POT-Creation-Date: 2025-07-09 17:39+0500\\n\"\n\"PO-Revision-Date: 2023-12-12 20:02+0500\\n\"\n\"Last-Translator: Ivan Konovalov <ivknv0@gmail.com>\\n\"\n\"Language-Team: Russian\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../intro.rst:2\nmsgid \"Introduction\"\nmsgstr \"Введение\"\n\n#: ../../intro.rst:4\nmsgid \"YaDisk is a Yandex.Disk REST API client library.\"\nmsgstr \"YaDisk - это библиотека-клиент REST API Яндекс.Диска.\"\n\n#: ../../intro.rst:7\nmsgid \"Installation\"\nmsgstr \"Установка\"\n\n#: ../../intro.rst:9\nmsgid \"\"\n\":code:`yadisk` supports multiple HTTP client libraries and has both \"\n\"synchronous and asynchronous API.\"\nmsgstr \"\"\n\":code:`yadisk` поддерживает несколько HTTP библиотек и реализует \"\n\"одновременно как синхронный, так и асинхронный API.\"\n\n#: ../../intro.rst:12\nmsgid \"The following HTTP client libraries are currently supported:\"\nmsgstr \"На данный момент поддерживаются следующие HTTP библиотеки:\"\n\n#: ../../intro.rst:14\nmsgid \":code:`requests` (used by default for synchronous API)\"\nmsgstr \":code:`requests` (используется по умолчанию для синхронного API)\"\n\n#: ../../intro.rst:15\nmsgid \"\"\n\":code:`httpx` (both synchronous and asynchronous, used by default for \"\n\"asynchronous API)\"\nmsgstr \"\"\n\":code:`httpx` (синхронный и асинхронный API, используется по умолчанию \"\n\"для асинхронного API)\"\n\n#: ../../intro.rst:16\nmsgid \":code:`aiohttp` (asynchronous only)\"\nmsgstr \":code:`aiohttp` (асинхронный API)\"\n\n#: ../../intro.rst:17\nmsgid \":code:`pycurl` (synchronous only)\"\nmsgstr \":code:`pycurl` (синхронный API)\"\n\n#: ../../intro.rst:19\nmsgid \"For synchronous API (installs :code:`requests`):\"\nmsgstr \"Для синхронного API (устанавливает :code:`requests`):\"\n\n#: ../../intro.rst:25\nmsgid \"For asynchronous API (installs :code:`aiofiles` and :code:`httpx`):\"\nmsgstr \"Для асинхронного API (устанавливает :code:`httpx` и :code:`aiofiles`):\"\n\n#: ../../intro.rst:31\nmsgid \"\"\n\"Alternatively, you can manually choose which optional libraries to \"\n\"install:\"\nmsgstr \"Вы можете также вручную установить нужные библиотеки:\"\n\n#: ../../intro.rst:42\nmsgid \"Links to Official Yandex.Disk REST API Docs\"\nmsgstr \"Ссылки на официальную документацию REST API Яндекс.Диска\"\n\n#: ../../intro.rst:44\nmsgid \"`Official Yandex.Disk REST API Docs <https://yandex.com/dev/disk/rest/>`__\"\nmsgstr \"`Официальная документация REST API Яндекс.Диска <https://yandex.ru/dev/disk/rest/>`__\"\n\n#: ../../intro.rst:45\nmsgid \"`Polygon <https://yandex.com/dev/disk/poligon>`__\"\nmsgstr \"`Полигон <https://yandex.ru/dev/disk/poligon>`__\"\n\n#: ../../intro.rst:48\nmsgid \"Examples\"\nmsgstr \"Примеры\"\n\n#: ../../intro.rst:51\nmsgid \"Synchronous API\"\nmsgstr \"Синхронный API\"\n\n#: ../../intro.rst:89 ../../intro.rst:264\nmsgid \"Receiving token with confirmation code\"\nmsgstr \"Получение токена через код подтверждения\"\n\n#: ../../intro.rst:119 ../../intro.rst:295\nmsgid \"Recursive upload\"\nmsgstr \"Рекурсивная загрузка файлов\"\n\n#: ../../intro.rst:153 ../../intro.rst:364\nmsgid \"Setting custom properties of files\"\nmsgstr \"Задание пользовательских свойств файлов\"\n\n#: ../../intro.rst:182 ../../intro.rst:394\nmsgid \"Emptying the trash bin\"\nmsgstr \"Очищение корзины\"\n\n#: ../../intro.rst:206 ../../intro.rst:419\nmsgid \"Specifying HTTP client library\"\nmsgstr \"Выбор HTTP библиотеки\"\n\n#: ../../intro.rst:217\nmsgid \"Asynchronous API\"\nmsgstr \"Асинхронный API\"\n\n"
  },
  {
    "path": "docs/locales/ru/LC_MESSAGES/known_issues.po",
    "content": "# known_issues.rst translations.\n# Copyright (C) 2025, Ivan Konovalov\n# This file is distributed under the same license as the YaDisk package.\n# Ivan Konovalov <ivknv0@gmail.com>, 2025.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: YaDisk 3.2.0\\n\"\n\"Report-Msgid-Bugs-To: ivknv0@gmail.com\\n\"\n\"POT-Creation-Date: 2025-04-29 18:00+0500\\n\"\n\"PO-Revision-Date: 2023-12-12 20:03+0500\\n\"\n\"Last-Translator: Ivan Konovalov <ivknv0@gmail.com>\\n\"\n\"Language-Team: Russian\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.17.0\\n\"\n\n#: ../../known_issues.rst:2\nmsgid \"Known Issues\"\nmsgstr \"Известные проблемы\"\n\n#: ../../known_issues.rst:5\nmsgid \"Very Slow Upload of Certain Types of Files\"\nmsgstr \"Очень медленная загрузка некоторых типов файлов на Яндекс.Диск\"\n\n#: ../../known_issues.rst:7\nmsgid \"\"\n\"Yandex.Disk's REST API limits upload speeds up to 128 KiB/s for certain \"\n\"MIME types of files. More specifically, throttling takes place based on \"\n\"value of :code:`media_type` (see :any:`yadisk.Client.get_meta`). It \"\n\"appears there are 3 types of media types that are throttled:\"\nmsgstr \"\"\n\"REST API Яндекс.Диск ограничивает скорость загрузки файлов на Диск до 128\"\n\" KiB/s для определенных MIME типов файлов. Если быть точнее, троттлинг \"\n\"осуществляется в зависимости от значения :code:`media_type` (см. \"\n\":any:`yadisk.Client.get_meta`). Судя по всему ограничение скорости \"\n\"действует на 3 типа файлов (media type):\"\n\n#: ../../known_issues.rst:12\nmsgid \":code:`data` (.db, .dat, etc.)\"\nmsgstr \":code:`data` (.db, .dat, etc.)\"\n\n#: ../../known_issues.rst:13\nmsgid \":code:`compressed` (.zip, .gz, .tgz, .rar, .etc)\"\nmsgstr \":code:`compressed` (.zip, .gz, .tgz, .rar, .etc)\"\n\n#: ../../known_issues.rst:14\nmsgid \":code:`video` (.3gp, .mp4, .avi, etc.)\"\nmsgstr \":code:`video` (.3gp, .mp4, .avi, etc.)\"\n\n#: ../../known_issues.rst:16\nmsgid \"\"\n\"This behavior of throttling is predetermined at the moment of requesting \"\n\"an upload link (with :any:`yadisk.Client.get_upload_link`). The content \"\n\"of the uploaded file does not matter.\"\nmsgstr \"\"\n\"Ограничение скорости предопределяется в момент получения ссылки для \"\n\"загрузки файла на диск (см. :any:`yadisk.Client.get_upload_link`). \"\n\"Содержимое загружаемого файла не имеет значения.\"\n\n#: ../../known_issues.rst:20\nmsgid \"\"\n\"The reason why this problem cannot be observed when uploading through the\"\n\" official website, is that this throttling does not apply to internal \"\n\"services (the Yandex.Disk website uses an intermediate internal API to \"\n\"obtain upload links).\"\nmsgstr \"\"\n\"Причина, по которой эта проблема не наблюдается при попытке загрузить \"\n\"файл через официальный сайт, заключается в том, что ограничение скорости \"\n\"не применяется для внутренних сервисов (сайт Яндекс.Диска использует \"\n\"промежуточный внутренний API для получения ссылок).\"\n\n#: ../../known_issues.rst:24\nmsgid \"\"\n\"While it is not clear what the purpose of this throttling is, it is \"\n\"certain at this point that this is not a bug.\"\nmsgstr \"Хотя и не понятно, в чем смысл такого ограничения, это точно не баг.\"\n\n#: ../../known_issues.rst:27\nmsgid \"\"\n\"One workaround is to upload files with changed filename extensions (or \"\n\"without them entirely). For example, if you want to upload a file named \"\n\":code:`\\\"my_database.db\\\"`, you can initially upload it under the name \"\n\":code:`\\\"my_database.some_other_extension\\\"` and then rename it back to \"\n\":code:`\\\"my_database.db\\\"`.\"\nmsgstr \"\"\n\"Один из способов обхода данной проблемы - это загрузка \"\n\"файлов с измененным расширением (или без расширения). Например, если вы \"\n\"хотите загрузить на Диск файл :code:`\\\"my_database.db\\\"`, вы можете изначально \"\n\"загрузить его под именем :code:`\\\"my_database.some_other_extension\\\"` и после \"\n\"загрузки переименовать обратно в :code:`\\\"my_database.db\\\"`.\"\n\n#: ../../known_issues.rst:32\nmsgid \"\"\n\"Another workaround is to spoof user agent (see `PR#57 \"\n\"<https://github.com/ivknv/yadisk/pull/57>`_). Starting with version \"\n\":code:`3.3.0`, the user agent is spoofed by default (see \"\n\":any:`yadisk.Client.get_upload_link()`'s :code:`spoof_user_agent` \"\n\"parameter).\"\nmsgstr \"Другой способ - это спуфинг строки user-agent (см. `PR#57 \"\n\"<https://github.com/ivknv/yadisk/pull/57>`_). Начиная с версии :code:`3.3.0`, \"\n\"спуфинг строки user-agent включен по умолчанию (см. параметр \"\n\":code:`spoof_user_agent` метода :any:`yadisk.Client.get_upload_link()`).\"\n\n#: ../../known_issues.rst:37\nmsgid \"Low Upload Speed on Windows When Using requests\"\nmsgstr \"\"\n\"Низкая скорость загрузки файлов на Диск под Windows при использовании \"\n\"requests\"\n\n#: ../../known_issues.rst:42\nmsgid \"\"\n\"If you use `requests`_ and experience low upload speeds on Windows, the \"\n\"reason might be due to Python's standard library internally using \"\n\":code:`select()` to wait for sockets. The best way around it is to use a \"\n\"different HTTP library (e.g. `httpx`_, see \"\n\":doc:`/api_reference/sessions`)\"\nmsgstr \"\"\n\"Если вы используете `requests`_ и столкнулись с низкой скоростью загрузки\"\n\" файлов на Диск под Windows, то причиной может быть стандартная \"\n\"библиотека Python, которая внутри использует :code:`select()` для \"\n\"ожидания сокетов. Наилучшее решение этой проблемы - это использовать \"\n\"другую HTTP библиотеку (например, `httpx`_, см. \"\n\":doc:`/api_reference/sessions`)\"\n\n"
  },
  {
    "path": "docs/locales/ru/LC_MESSAGES/migration_guide.po",
    "content": "# migration_guide.rst translations.\n# Copyright (C) 2024, Ivan Konovalov\n# This file is distributed under the same license as the YaDisk package.\n# Ivan Konovalov <ivknv0@gmail.com>, 2024.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: YaDisk 3.0.0\\n\"\n\"Report-Msgid-Bugs-To: ivknv0@gmail.com\\n\"\n\"POT-Creation-Date: 2024-07-04 22:17+0500\\n\"\n\"PO-Revision-Date: 2024-07-05 02:01+0500\\n\"\n\"Last-Translator: Ivan Konovalov <ivknv0@gmail.com>\\n\"\n\"Language: ru\\n\"\n\"Language-Team: ru <LL@li.org>\\n\"\n\"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && \"\n\"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=utf-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Generated-By: Babel 2.15.0\\n\"\n\n#: ../../migration_guide.rst:2\nmsgid \"Migration Guide\"\nmsgstr \"Руководство по миграции\"\n\n#: ../../migration_guide.rst:5\nmsgid \"Migrating From 2.x to 3.x\"\nmsgstr \"Миграция с 2.x на 3.x\"\n\n#: ../../migration_guide.rst:8\nmsgid \"Waiting for asynchronous operations to complete\"\nmsgstr \"Ожидание завершения асинхронной операции\"\n\n#: ../../migration_guide.rst:10\nmsgid \"\"\n\"Starting with the version 3.0.0, the following methods will automatically\"\n\" wait for the asynchronous operation to complete:\"\nmsgstr \"Начиная с версии 3.0.0, следующие методы автоматически ожидают \"\n\"завершения асинхронной операции:\"\n\n#: ../../migration_guide.rst:13\nmsgid \":any:`Client.copy()`, :any:`AsyncClient.copy()`\"\nmsgstr \":any:`Client.copy()`, :any:`AsyncClient.copy()`\"\n\n#: ../../migration_guide.rst:14\nmsgid \":any:`Client.move()`, :any:`AsyncClient.move()`\"\nmsgstr \":any:`Client.move()`, :any:`AsyncClient.move()`\"\n\n#: ../../migration_guide.rst:15\nmsgid \":any:`Client.remove()`, :any:`AsyncClient.remove()`\"\nmsgstr \":any:`Client.remove()`, :any:`AsyncClient.remove()`\"\n\n#: ../../migration_guide.rst:16\nmsgid \":any:`Client.remove_trash()`, :any:`AsyncClient.remove_trash()`\"\nmsgstr \":any:`Client.remove_trash()`, :any:`AsyncClient.remove_trash()`\"\n\n#: ../../migration_guide.rst:17\nmsgid \":any:`Client.rename()`, :any:`AsyncClient.rename()`\"\nmsgstr \":any:`Client.rename()`, :any:`AsyncClient.rename()`\"\n\n#: ../../migration_guide.rst:18\nmsgid \":any:`Client.restore_trash()`, :any:`AsyncClient.restore_trash()`\"\nmsgstr \":any:`Client.restore_trash()`, :any:`AsyncClient.restore_trash()`\"\n\n#: ../../migration_guide.rst:19\nmsgid \":any:`Client.save_to_disk()`, :any:`AsyncClient.save_to_disk()`\"\nmsgstr \":any:`Client.save_to_disk()`, :any:`AsyncClient.save_to_disk()`\"\n\n#: ../../migration_guide.rst:20\nmsgid \":any:`Client.upload_url()`, :any:`AsyncClient.upload_url()`.\"\nmsgstr \":any:`Client.upload_url()`, :any:`AsyncClient.upload_url()`.\"\n\n#: ../../migration_guide.rst:22\nmsgid \"\"\n\"This new behavior is controlled by the :code:`wait` parameter, which \"\n\"defaults to :code:`True`. Waiting is performed by repeatedly checking the\"\n\" operation status (see :any:`Client.get_operation_status()` and \"\n\":any:`Client.wait_for_operation()`) and calling :any:`time.sleep` / \"\n\":any:`asyncio.sleep`. If this parameter is explicitly set to \"\n\":code:`False`, no additional waiting is performed, this matches the old \"\n\"behavior.\"\nmsgstr \"Новое поведение контролируется параметром :code:`wait`, который по \"\n\"умолчанию задан как :code:`True`. Ожидание осуществляется за счёт периодической \"\n\"проверки статуса операции (см. :any:`Client.get_operation_status()` и \"\n\":any:`Client.wait_for_operation()`) и вызова :any:`time.sleep` / \"\n\":any:`asyncio.sleep`. Если этот параметр установлен в значение :code:`False`, \"\n\"ожидание операции не будет выполнено, это соответствует старому поведению.\"\n\n#: ../../migration_guide.rst:31\nmsgid \"\"\n\"If :code:`wait=True` is set, there is a possibility of getting an \"\n\":any:`AsyncOperationFailedError`, though this is very unlikely in \"\n\"practice.\"\nmsgstr \"Если :code:`wait=True`, то существует вероятность получить \"\n\":any:`AsyncOperationFailedError`, хотя это маловероятно на практике.\"\n\n#: ../../migration_guide.rst:34\nmsgid \"\"\n\"For more details, see documentation for any of the above-mentioned \"\n\"methods.\"\nmsgstr \"См. документацию для вышеупомянутых методов для дополнительных \"\n\"подробностей.\"\n\n#: ../../migration_guide.rst:37\nmsgid \"Iterating over AsyncClient.listdir()\"\nmsgstr \"Итерация по AsyncClient.listdir()\"\n\n#: ../../migration_guide.rst:39\nmsgid \"\"\n\"Iterating over the result of :any:`AsyncClient.listdir()` no longer \"\n\"requires the additional :code:`await` keyword:\"\nmsgstr \"Итерация по результату :any:`AsyncClient.listdir()` больше не требует \"\n\"дополнительного ключевого слова :code:`await`:\"\n\n#: ../../migration_guide.rst:54\nmsgid \"Changes with get_files()\"\nmsgstr \"Изменения, касающиеся get_files()\"\n\n#: ../../migration_guide.rst:56\nmsgid \"\"\n\"Before the version 3.0.0, :any:`Client.get_files()` / \"\n\":any:`AsyncClient.get_files()` would return up to :code:`limit` files, \"\n\"unless it was set to :code:`None`, in which case it would return all of \"\n\"them.\"\nmsgstr \"До версии 3.0.0., :any:`Client.get_files()` / \"\n\":any:`AsyncClient.get_files()` возвращал не более :code:`limit` файлов, \"\n\"если :code:`limit != None`, иначе метод возвращал все файлы.\"\n\n#: ../../migration_guide.rst:60\nmsgid \"\"\n\"Starting with the version 3.0.0, to control the number of returned files,\"\n\" a new parameter :code:`max_items` is introduced. :code:`limit` only \"\n\"affects the number of files queried by a single request (requests are \"\n\"sent until :code:`max_items` files are obtained or end of the list is \"\n\"reached). This new behavior is consistent with :any:`Client.listdir()` / \"\n\":any:`AsyncClient.listdir()`.\"\nmsgstr \"Начиная с версии 3.0.0, для контроля числа возвращённых файлов \"\n\"доступен новый параметр :code:`max_items`. :code:`limit` влияет только на \"\n\"количество файлов, запрашиваемых одним запросом (запросы отправляются до тех \"\n\"пор, пока не получено :code:`max_items` файлов или достигнут конец списка). \"\n\"Новое поведение соответствует :any:`Client.listdir()` / \"\n\":any:`AsyncClient.listdir()`.\"\n\n#: ../../migration_guide.rst:68\nmsgid \"get_last_uploaded() returns a list instead of a generator\"\nmsgstr \"get_last_uploaded() возвращает список вместо генератора\"\n\n#: ../../migration_guide.rst:70\nmsgid \"\"\n\"Starting with the version 3.0.0, :any:`Client.get_last_uploaded()` / \"\n\":any:`AsyncClient.get_last_uploaded()` return a list of files instead of \"\n\"a generator.\"\nmsgstr \"Начиная с версии 3.0.0, :any:`Client.get_last_uploaded()` / \"\n\":any:`AsyncClient.get_last_uploaded()` возвращает список файлов вместо \"\n\"генератора.\"\n\n#: ../../migration_guide.rst:75\nmsgid \"Changes with the Session interface\"\nmsgstr \"Изменения интерфейса Session\"\n\n#: ../../migration_guide.rst:77\nmsgid \"In version 3.0.0, the following methods were removed:\"\nmsgstr \"В версии 3.0.0 были удалены следующие методы:\"\n\n#: ../../migration_guide.rst:79\nmsgid \":code:`Session.set_token()`, :code:`AsyncSession.set_token()`\"\nmsgstr \":code:`Session.set_token()`, :code:`AsyncSession.set_token()`\"\n\n#: ../../migration_guide.rst:80\nmsgid \":code:`Session.set_headers()`, :code:`AsyncSession.set_headers()`.\"\nmsgstr \":code:`Session.set_headers()`, :code:`AsyncSession.set_headers()`.\"\n\n#: ../../migration_guide.rst:82\nmsgid \"\"\n\"Starting with the version 3.0.0, all HTTP headers (including the \"\n\":code:`Authorization` header) are explicitly passed to \"\n\":any:`Session.send_request()` / :any:`AsyncSession.send_request()`.\"\nmsgstr \"Начиная с версии 3.0.0, все заголовки HTTP запросов (включая заголовок \"\n\":code:`Authorization`) передаются явным образом напрямую в \"\n\":any:`Session.send_request()` / :any:`AsyncSession.send_request()`.\"\n\n#: ../../migration_guide.rst:87\nmsgid \"Some methods no longer accept the fields parameter\"\nmsgstr \"Некоторые методы больше не принимают параметр fields\"\n\n#: ../../migration_guide.rst:89\nmsgid \"\"\n\"Prior to version 3.0.0, the following methods used to accept the optional\"\n\" :code:`fields` parameter:\"\nmsgstr \"До версии 3.0.0, следующие методы принимали опциональный параметр \"\n\":code:`fields`:\"\n\n#: ../../migration_guide.rst:92\nmsgid \"\"\n\":any:`Client.get_operation_status()`, \"\n\":any:`AsyncClient.get_operation_status()`\"\nmsgstr \"\"\n\":any:`Client.get_operation_status()`, \"\n\":any:`AsyncClient.get_operation_status()`\"\n\n#: ../../migration_guide.rst:93\nmsgid \":any:`Client.get_download_link()`, :any:`AsyncClient.get_download_link()`\"\nmsgstr \":any:`Client.get_download_link()`, :any:`AsyncClient.get_download_link()`\"\n\n#: ../../migration_guide.rst:94\nmsgid \"\"\n\":any:`Client.get_public_download_link()`, \"\n\":any:`AsyncClient.get_public_download_link()`\"\nmsgstr \"\"\n\":any:`Client.get_public_download_link()`, \"\n\":any:`AsyncClient.get_public_download_link()`\"\n\n#: ../../migration_guide.rst:95\nmsgid \":any:`Client.get_upload_link()`, :any:`AsyncClient.get_upload_link()`.\"\nmsgstr \":any:`Client.get_upload_link()`, :any:`AsyncClient.get_upload_link()`.\"\n\n#: ../../migration_guide.rst:98\nmsgid \"Migrating From 1.x to 2.x\"\nmsgstr \"Миграция с 1.x на 2.x\"\n\n#: ../../migration_guide.rst:101\nmsgid \"Merge with yadisk-async\"\nmsgstr \"Слияние с yadisk-async\"\n\n#: ../../migration_guide.rst:103\nmsgid \"\"\n\"Starting with version 2.0.0, the library provides both synchronous and \"\n\"asynchronous APIs.\"\nmsgstr \"Начиная с версии 2.0.0, библиотека предоставляет как синхронный, так и \"\n\"асинхронный интерфейсы.\"\n\n#: ../../migration_guide.rst:107\nmsgid \"Changes to exception handling\"\nmsgstr \"Изменения в обработке исключений\"\n\n#: ../../migration_guide.rst:109\nmsgid \"\"\n\"Starting with version 2.0.0, all exceptions raised by :any:`Client` and \"\n\":any:`AsyncClient` are derived from :any:`YaDiskError`. Exceptions from \"\n\"underlying dependencies (e.g. :code:`requests` or :code:`aiohttp`) are \"\n\"converted to :any:`RequestError`. A non-exhaustive list of possible \"\n\"exceptions is provided by the documentation for :any:`Client` and \"\n\":any:`AsyncClient`. More details about exceptions are available in \"\n\"documentation for each specific API method.\"\nmsgstr \"Начиная с версии 2.0.0, все исключения, вызванные :any:`Client` и \"\n\":any:`AsyncClient` наследуются от :any:`YaDiskError`. Исключения от \"\n\"нижележащих зависимостей (например, :code:`requests` или :code:`aiohttp`) \"\n\"преобразуются в :any:`RequestError`. Частичный список возможных исключений \"\n\"приведён в документации для :any:`Client` и :any:`AsyncClient`. Дополнительные \"\n\"подробности доступны для каждого отдельного метода API.\"\n\n#: ../../migration_guide.rst:118\nmsgid \"requests and aiohttp are optional dependencies\"\nmsgstr \"requests и aiohttp - теперь опциональные зависимости\"\n\n#: ../../migration_guide.rst:120\nmsgid \"\"\n\"Prior to version 2.0.0, :code:`requests` was listed as a dependency (and \"\n\":code:`aiohttp` was listed as a dependency for :code:`yadisk-async`). \"\n\":code:`requests` is still used by default but must be explicitly \"\n\"installed. As for the asynchronous API, :code:`httpx` is used by default,\"\n\" instead of :code:`aiohttp`. There are now multiple supported HTTP client\"\n\" libraries.\"\nmsgstr \"До версии 2.0.0, :code:`requests` была указана в качестве обязательной \"\n\"зависимости (и :code:`aiohttp` была указана как зависимость для \"\n\":code:`yadisk-async`). Библиотека :code:`requests` всё ещё используется по \"\n\"умолчанию, но должна быть явным образом установлена. Что касается асинхронного \"\n\"API, по умолчанию теперь используется :code:`httpx`, вместо :code:`aiohttp`. \"\n\"Поддерживается несколько библиотек HTTP.\"\n\n#: ../../migration_guide.rst:126\nmsgid \"\"\n\"See :doc:`/api_reference/sessions` for a full list of supported HTTP \"\n\"client libraries and :doc:`/intro` for installation instructions.\"\nmsgstr \"См. :doc:`/api_reference/sessions` для полного списка поддерживаемых \"\n\"библиотек HTTP и :doc:`/intro` для инструкции по установке.\"\n\n"
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\r\n\r\npushd %~dp0\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=python -msphinx\r\n)\r\nset SOURCEDIR=.\r\nset BUILDDIR=_build\r\nset SPHINXPROJ=YaDisk\r\n\r\nif \"%1\" == \"\" goto help\r\n\r\n%SPHINXBUILD% >NUL 2>NUL\r\nif errorlevel 9009 (\r\n\techo.\r\n\techo.The Sphinx module was not found. Make sure you have Sphinx installed,\r\n\techo.then set the SPHINXBUILD environment variable to point to the full\r\n\techo.path of the 'sphinx-build' executable. Alternatively you may add the\r\n\techo.Sphinx directory to PATH.\r\n\techo.\r\n\techo.If you don't have Sphinx installed, grab it from\r\n\techo.http://sphinx-doc.org/\r\n\texit /b 1\r\n)\r\n\r\n%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%\r\ngoto end\r\n\r\n:help\r\n%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%\r\n\r\n:end\r\npopd\r\n"
  },
  {
    "path": "docs/migration_guide.rst",
    "content": "Migration Guide\n===============\n\nMigrating From 2.x to 3.x\n#########################\n\nWaiting for asynchronous operations to complete\n-----------------------------------------------\n\nStarting with the version 3.0.0, the following methods will automatically\nwait for the asynchronous operation to complete:\n\n* :any:`Client.copy()`, :any:`AsyncClient.copy()`\n* :any:`Client.move()`, :any:`AsyncClient.move()`\n* :any:`Client.remove()`, :any:`AsyncClient.remove()`\n* :any:`Client.remove_trash()`, :any:`AsyncClient.remove_trash()`\n* :any:`Client.rename()`, :any:`AsyncClient.rename()`\n* :any:`Client.restore_trash()`, :any:`AsyncClient.restore_trash()`\n* :any:`Client.save_to_disk()`, :any:`AsyncClient.save_to_disk()`\n* :any:`Client.upload_url()`, :any:`AsyncClient.upload_url()`.\n\nThis new behavior is controlled by the :code:`wait` parameter, which defaults\nto :code:`True`. Waiting is performed by repeatedly checking the operation\nstatus (see :any:`Client.get_operation_status()` and\n:any:`Client.wait_for_operation()`) and calling :any:`time.sleep` /\n:any:`asyncio.sleep`. If this parameter is explicitly set to :code:`False`, no\nadditional waiting is performed, this matches the old behavior.\n\n.. note::\n\n   If :code:`wait=True` is set, there is a possibility of getting an\n   :any:`AsyncOperationFailedError`, though this is very unlikely in practice.\n\nFor more details, see documentation for any of the above-mentioned methods.\n\nIterating over AsyncClient.listdir()\n------------------------------------\n\nIterating over the result of :any:`AsyncClient.listdir()` no longer requires\nthe additional :code:`await` keyword:\n\n.. code:: python\n\n    async with yadisk.AsyncClient(token=...) as client:\n        # yadisk 3.x\n        async for resource in client.listdir():\n            do_something(resource)\n\n        # yadisk 2.x, no longer valid, will not work\n        async for resource in await client.listdir():\n            do_something(resource)\n\nChanges with get_files()\n------------------------\n\nBefore the version 3.0.0, :any:`Client.get_files()` /\n:any:`AsyncClient.get_files()` would return up to :code:`limit` files, unless\nit was set to :code:`None`, in which case it would return all of them.\n\nStarting with the version 3.0.0, to control the number of returned files,\na new parameter :code:`max_items` is introduced. :code:`limit` only affects\nthe number of files queried by a single request (requests are sent until\n:code:`max_items` files are obtained or end of the list is reached). This new\nbehavior is consistent with :any:`Client.listdir()` /\n:any:`AsyncClient.listdir()`.\n\nget_last_uploaded() returns a list instead of a generator\n---------------------------------------------------------\n\nStarting with the version 3.0.0, :any:`Client.get_last_uploaded()` /\n:any:`AsyncClient.get_last_uploaded()` return a list of files instead of a\ngenerator.\n\nChanges with the Session interface\n----------------------------------\n\nIn version 3.0.0, the following methods were removed:\n\n* :code:`Session.set_token()`, :code:`AsyncSession.set_token()`\n* :code:`Session.set_headers()`, :code:`AsyncSession.set_headers()`.\n\nStarting with the version 3.0.0, all HTTP headers (including the\n:code:`Authorization` header) are explicitly passed to\n:any:`Session.send_request()` / :any:`AsyncSession.send_request()`.\n\nSome methods no longer accept the fields parameter\n--------------------------------------------------\n\nPrior to version 3.0.0, the following methods used to accept the optional\n:code:`fields` parameter:\n\n* :any:`Client.get_operation_status()`, :any:`AsyncClient.get_operation_status()`\n* :any:`Client.get_download_link()`, :any:`AsyncClient.get_download_link()`\n* :any:`Client.get_public_download_link()`, :any:`AsyncClient.get_public_download_link()`\n* :any:`Client.get_upload_link()`, :any:`AsyncClient.get_upload_link()`.\n\nMigrating From 1.x to 2.x\n#########################\n\nMerge with yadisk-async\n-----------------------\n\nStarting with version 2.0.0, the library provides both synchronous and\nasynchronous APIs.\n\nChanges to exception handling\n-----------------------------\n\nStarting with version 2.0.0, all exceptions raised by :any:`Client` and\n:any:`AsyncClient` are derived from :any:`YaDiskError`. Exceptions from\nunderlying dependencies (e.g. :code:`requests` or :code:`aiohttp`) are\nconverted to :any:`RequestError`. A non-exhaustive list of possible exceptions\nis provided by the documentation for :any:`Client` and :any:`AsyncClient`.\nMore details about exceptions are available in documentation for each specific\nAPI method.\n\nrequests and aiohttp are optional dependencies\n----------------------------------------------\n\nPrior to version 2.0.0, :code:`requests` was listed as a dependency (and\n:code:`aiohttp` was listed as a dependency for :code:`yadisk-async`).\n:code:`requests` is still used by default but must be explicitly installed.\nAs for the asynchronous API, :code:`httpx` is used by default, instead of\n:code:`aiohttp`. There are now multiple supported HTTP client libraries.\n\nSee :doc:`/api_reference/sessions` for a full list of supported HTTP client\nlibraries and :doc:`/intro` for installation instructions.\n"
  },
  {
    "path": "docs/requirements.in",
    "content": "# It is expected that the install command is running from the parent directory\n-e .[async_files,aiohttp,httpx,pycurl,requests]\n\nsphinx==7.4.7\nsphinx-intl==2.3.2\nsphinx_rtd_theme==3.1.0\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "#\n# This file is autogenerated by pip-compile with Python 3.9\n# by the following command:\n#\n#    pip-compile --output-file=docs/requirements.txt docs/requirements.in\n#\n-e .[async_files,aiohttp,httpx,pycurl,requests]\n    # via -[async-files,aiohttp,httpx,pycurl,requests]\naiofiles==25.1.0\n    # via yadisk\naiohappyeyeballs==2.6.1\n    # via aiohttp\naiohttp==3.13.5\n    # via yadisk\naiosignal==1.4.0\n    # via aiohttp\nalabaster==0.7.16\n    # via sphinx\nanyio==4.12.1\n    # via httpx\nasync-timeout==5.0.1\n    # via aiohttp\nattrs==26.1.0\n    # via aiohttp\nbabel==2.18.0\n    # via\n    #   sphinx\n    #   sphinx-intl\ncertifi==2026.2.25\n    # via\n    #   httpcore\n    #   httpx\n    #   requests\ncharset-normalizer==3.4.7\n    # via requests\nclick==8.1.8\n    # via sphinx-intl\ndocutils==0.21.2\n    # via\n    #   sphinx\n    #   sphinx-rtd-theme\nexceptiongroup==1.3.1\n    # via anyio\nfrozenlist==1.8.0\n    # via\n    #   aiohttp\n    #   aiosignal\nh11==0.16.0\n    # via httpcore\nhttpcore==1.0.9\n    # via httpx\nhttpx==0.28.1\n    # via yadisk\nidna==3.11\n    # via\n    #   anyio\n    #   httpx\n    #   requests\n    #   yarl\nimagesize==1.5.0\n    # via sphinx\nimportlib-metadata==8.7.1\n    # via sphinx\njinja2==3.1.6\n    # via sphinx\nmarkupsafe==3.0.3\n    # via jinja2\nmultidict==6.7.1\n    # via\n    #   aiohttp\n    #   yarl\npackaging==26.1\n    # via sphinx\npropcache==0.4.1\n    # via\n    #   aiohttp\n    #   yarl\npycurl==7.45.7\n    # via yadisk\npygments==2.20.0\n    # via sphinx\nrequests==2.32.5\n    # via\n    #   sphinx\n    #   yadisk\nsnowballstemmer==3.0.1\n    # via sphinx\nsphinx==7.4.7\n    # via\n    #   -r docs/requirements.in\n    #   sphinx-intl\n    #   sphinx-rtd-theme\n    #   sphinxcontrib-jquery\nsphinx-intl==2.3.2\n    # via -r docs/requirements.in\nsphinx-rtd-theme==3.1.0\n    # via -r docs/requirements.in\nsphinxcontrib-applehelp==2.0.0\n    # via sphinx\nsphinxcontrib-devhelp==2.0.0\n    # via sphinx\nsphinxcontrib-htmlhelp==2.1.0\n    # via sphinx\nsphinxcontrib-jquery==4.1\n    # via sphinx-rtd-theme\nsphinxcontrib-jsmath==1.0.1\n    # via sphinx\nsphinxcontrib-qthelp==2.0.0\n    # via sphinx\nsphinxcontrib-serializinghtml==2.0.0\n    # via sphinx\ntomli==2.4.1\n    # via sphinx\ntyping-extensions==4.15.0\n    # via\n    #   aiosignal\n    #   anyio\n    #   exceptiongroup\n    #   multidict\n    #   yadisk\nurllib3==2.6.3\n    # via requests\nyarl==1.22.0\n    # via aiohttp\nzipp==3.23.1\n    # via importlib-metadata\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"setuptools\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[tool.setuptools]\npackage-dir = {\"\" = \"src\"}\n\n[project]\nname = \"yadisk\"\ndynamic = [\"version\"]\ndescription = \"Библиотека-клиент REST API Яндекс.Диска / Yandex.Disk REST API client library\"\nreadme = \"README.rst\"\nrequires-python = \">=3.8\"\nlicense = \"LGPL-3.0-or-later\"\nkeywords = [\"yandex.disk\", \"yandex\", \"rest\"]\nauthors = [\n    {name = \"Ivan Konovalov\", email = \"ivknv0@gmail.com\"}\n]\nclassifiers = [\n    \"Development Status :: 5 - Production/Stable\",\n    \"Intended Audience :: Developers\",\n    \"Programming Language :: Python\",\n    \"Programming Language :: Python :: 3\",\n    \"Programming Language :: Python :: 3 :: Only\",\n    \"Programming Language :: Python :: 3.9\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Programming Language :: Python :: 3.13\",\n    \"Programming Language :: Python :: 3.14\",\n    \"Operating System :: OS Independent\",\n    \"Topic :: Internet\",\n    \"Topic :: Software Development :: Libraries\",\n    \"Topic :: Software Development :: Libraries :: Python Modules\"\n]\ndependencies = [\"typing_extensions; python_version<'3.10'\"]\n\n[tool.setuptools.dynamic]\nversion = {attr = \"yadisk.__version__\"}\n\n[project.optional-dependencies]\nsync_defaults  = [\"requests\"]\nasync_defaults = [\"aiofiles\", \"httpx\"]\nasync_files    = [\"aiofiles\"]\naiohttp        = [\"aiohttp\"]\nhttpx          = [\"httpx\"]\npycurl         = [\"pycurl\"]\nrequests       = [\"requests\"]\n\n[project.urls]\n\"Source code\" = \"https://github.com/ivknv/yadisk\"\n\"Documentation (EN)\" = \"https://yadisk.readthedocs.io/en/latest\"\n\"Documentation (RU)\" = \"https://yadisk.readthedocs.io/ru/latest\"\n\"Bug tracker\" = \"https://github.com/ivknv/yadisk/issues\"\n\n[tool.mypy]\npackages = [\"yadisk\", \"tests\"]\n\n[tool.pyright]\nreportInvalidTypeForm = \"none\"\n\n[tool.ruff]\nline-length = 120\nindent-width = 4\ntarget-version = \"py38\"\n\n[tool.ruff.lint]\nselect = [\"E\", \"F\", \"I\", \"W\", \"B\", \"PIE\", \"RUF\"]\nignore = [\"F403\", \"F405\", \"RUF010\", \"I001\", \"PIE790\", \"RUF012\"]\n\n[tool.ruff.lint.per-file-ignores]\n\"__init__.py\" = [\"F401\"]\n"
  },
  {
    "path": "requirements-dev.in",
    "content": "-e .[async-files,aiohttp,httpx,pycurl,requests]\n\n# Stub packages\ntypes-aiofiles\ntypes-requests\ntypes-pycurl\n\n# Tests\npytest==8.4.2\npytest-mock==3.15.1\npytest-cov==7.1.0\nanyio==4.5.2\nstarlette==0.49.3\nuvicorn==0.39.0\n\n# Linting\nmypy==1.19.1\nruff==0.15.10\n\n# Packaging\nbuild==1.4.3\ntwine==6.2.0\n\n# For compiling requirements-dev.txt\npip-tools==7.5.3\n\n# Documentation requirements are listed in docs/requirements.in\n-r docs/requirements.in\n"
  },
  {
    "path": "requirements-dev.txt",
    "content": "#\n# This file is autogenerated by pip-compile with Python 3.9\n# by the following command:\n#\n#    pip-compile --output-file=requirements-dev.txt requirements-dev.in\n#\n-e .[async-files,aiohttp,httpx,pycurl,requests]\n    # via -[async-files,aiohttp,httpx,pycurl,requests]\naiofiles==25.1.0\n    # via yadisk\naiohappyeyeballs==2.6.1\n    # via aiohttp\naiohttp==3.13.5\n    # via yadisk\naiosignal==1.4.0\n    # via aiohttp\nalabaster==0.7.16\n    # via sphinx\nanyio==4.5.2\n    # via\n    #   -r requirements-dev.in\n    #   httpx\n    #   starlette\nasync-timeout==5.0.1\n    # via aiohttp\nattrs==26.1.0\n    # via aiohttp\nbabel==2.18.0\n    # via\n    #   sphinx\n    #   sphinx-intl\nbackports-tarfile==1.2.0\n    # via jaraco-context\nbuild==1.4.3\n    # via\n    #   -r requirements-dev.in\n    #   pip-tools\ncertifi==2026.2.25\n    # via\n    #   httpcore\n    #   httpx\n    #   requests\ncffi==2.0.0\n    # via cryptography\ncharset-normalizer==3.4.7\n    # via requests\nclick==8.1.8\n    # via\n    #   pip-tools\n    #   sphinx-intl\n    #   uvicorn\ncoverage[toml]==7.10.7\n    # via pytest-cov\ncryptography==46.0.7\n    # via secretstorage\ndocutils==0.21.2\n    # via\n    #   readme-renderer\n    #   sphinx\n    #   sphinx-rtd-theme\nexceptiongroup==1.3.1\n    # via\n    #   anyio\n    #   pytest\nfrozenlist==1.8.0\n    # via\n    #   aiohttp\n    #   aiosignal\nh11==0.16.0\n    # via\n    #   httpcore\n    #   uvicorn\nhttpcore==1.0.9\n    # via httpx\nhttpx==0.28.1\n    # via yadisk\nid==1.6.1\n    # via twine\nidna==3.11\n    # via\n    #   anyio\n    #   httpx\n    #   requests\n    #   yarl\nimagesize==1.5.0\n    # via sphinx\nimportlib-metadata==8.7.1\n    # via\n    #   build\n    #   keyring\n    #   sphinx\n    #   twine\niniconfig==2.1.0\n    # via pytest\njaraco-classes==3.4.0\n    # via keyring\njaraco-context==6.1.1\n    # via keyring\njaraco-functools==4.4.0\n    # via keyring\njeepney==0.9.0\n    # via\n    #   keyring\n    #   secretstorage\njinja2==3.1.6\n    # via sphinx\nkeyring==25.7.0\n    # via twine\nlibrt==0.9.0\n    # via mypy\nmarkdown-it-py==3.0.0\n    # via rich\nmarkupsafe==3.0.3\n    # via jinja2\nmdurl==0.1.2\n    # via markdown-it-py\nmore-itertools==10.8.0\n    # via\n    #   jaraco-classes\n    #   jaraco-functools\nmultidict==6.7.1\n    # via\n    #   aiohttp\n    #   yarl\nmypy==1.19.1\n    # via -r requirements-dev.in\nmypy-extensions==1.1.0\n    # via mypy\nnh3==0.3.4\n    # via readme-renderer\npackaging==26.1\n    # via\n    #   build\n    #   pytest\n    #   sphinx\n    #   twine\n    #   wheel\npathspec==1.0.4\n    # via mypy\npip-tools==7.5.3\n    # via -r requirements-dev.in\npluggy==1.6.0\n    # via\n    #   pytest\n    #   pytest-cov\npropcache==0.4.1\n    # via\n    #   aiohttp\n    #   yarl\npycparser==2.23\n    # via cffi\npycurl==7.45.7\n    # via yadisk\npygments==2.20.0\n    # via\n    #   pytest\n    #   readme-renderer\n    #   rich\n    #   sphinx\npyproject-hooks==1.2.0\n    # via\n    #   build\n    #   pip-tools\npytest==8.4.2\n    # via\n    #   -r requirements-dev.in\n    #   pytest-cov\n    #   pytest-mock\npytest-cov==7.1.0\n    # via -r requirements-dev.in\npytest-mock==3.15.1\n    # via -r requirements-dev.in\nreadme-renderer==44.0\n    # via twine\nrequests==2.32.5\n    # via\n    #   requests-toolbelt\n    #   sphinx\n    #   twine\n    #   yadisk\nrequests-toolbelt==1.0.0\n    # via twine\nrfc3986==2.0.0\n    # via twine\nrich==15.0.0\n    # via twine\nruff==0.15.10\n    # via -r requirements-dev.in\nsecretstorage==3.3.3\n    # via keyring\nsniffio==1.3.1\n    # via anyio\nsnowballstemmer==3.0.1\n    # via sphinx\nsphinx==7.4.7\n    # via\n    #   -r docs/requirements.in\n    #   sphinx-intl\n    #   sphinx-rtd-theme\n    #   sphinxcontrib-jquery\nsphinx-intl==2.3.2\n    # via -r docs/requirements.in\nsphinx-rtd-theme==3.1.0\n    # via -r docs/requirements.in\nsphinxcontrib-applehelp==2.0.0\n    # via sphinx\nsphinxcontrib-devhelp==2.0.0\n    # via sphinx\nsphinxcontrib-htmlhelp==2.1.0\n    # via sphinx\nsphinxcontrib-jquery==4.1\n    # via sphinx-rtd-theme\nsphinxcontrib-jsmath==1.0.1\n    # via sphinx\nsphinxcontrib-qthelp==2.0.0\n    # via sphinx\nsphinxcontrib-serializinghtml==2.0.0\n    # via sphinx\nstarlette==0.49.3\n    # via -r requirements-dev.in\ntomli==2.4.1\n    # via\n    #   build\n    #   coverage\n    #   mypy\n    #   pip-tools\n    #   pytest\n    #   sphinx\ntwine==6.2.0\n    # via -r requirements-dev.in\ntypes-aiofiles==25.1.0.20251011\n    # via -r requirements-dev.in\ntypes-pycurl==7.45.7.20251101\n    # via -r requirements-dev.in\ntypes-requests==2.32.4.20260107\n    # via -r requirements-dev.in\ntyping-extensions==4.15.0\n    # via\n    #   aiosignal\n    #   anyio\n    #   cryptography\n    #   exceptiongroup\n    #   multidict\n    #   mypy\n    #   starlette\n    #   uvicorn\n    #   yadisk\nurllib3==2.6.3\n    # via\n    #   id\n    #   requests\n    #   twine\n    #   types-requests\nuvicorn==0.39.0\n    # via -r requirements-dev.in\nwheel==0.46.3\n    # via pip-tools\nyarl==1.22.0\n    # via aiohttp\nzipp==3.23.1\n    # via importlib-metadata\n\n# The following packages are considered to be unsafe in a requirements file:\n# pip\n# setuptools\n"
  },
  {
    "path": "src/yadisk/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2025 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom . import objects, exceptions, utils, types\n\nfrom ._client import Client\nfrom ._async_client import AsyncClient\nfrom ._session import Session, Response\nfrom ._async_session import AsyncSession, AsyncResponse\nfrom ._import_session import import_session, import_async_session\n\n__version__ = \"3.4.1\"\n\nYaDisk = Client\nAsyncYaDisk = AsyncClient\n\n__all__ = [\n    \"AsyncClient\",\n    \"AsyncResponse\",\n    \"AsyncSession\",\n    \"AsyncYaDisk\",\n    \"Client\",\n    \"Response\",\n    \"Session\",\n    \"YaDisk\",\n    \"import_async_session\",\n    \"import_session\"\n]\n"
  },
  {
    "path": "src/yadisk/_api/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom .api_request import *\nfrom .disk import *\nfrom .resources import *\nfrom .operations import *\nfrom .auth import *\n"
  },
  {
    "path": "src/yadisk/_api/api_request.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nimport inspect\nfrom ..exceptions import InvalidResponseError\n\nfrom ..utils import auto_retry, async_auto_retry, CaseInsensitiveDict\nfrom .. import settings\nfrom .._common import is_default_timeout\n\nfrom typing import Any, Optional, Union, Type, TypeVar, TYPE_CHECKING\nfrom .._typing_compat import Set, Dict, Tuple, Callable, Awaitable\nimport json\n\nif TYPE_CHECKING:  # pragma: no cover\n    from .._session import Session\n    from .._async_session import AsyncSession\n    from ..types import AnySession, HTTPMethod, JSON, TimeoutParameter\n    from .._client import Client\n    from .._async_client import AsyncClient\n\n__all__ = [\"APIRequest\"]\n\n\nclass APIRequest(object):\n    \"\"\"\n        Base class for all API requests.\n\n        :param session: an instance of :any:`Session`\n        :param timeout: `float` or `tuple`, request timeout\n        :param headers: `dict` or `None`, additional request headers\n        :param n_retries: `int`, maximum number of retries\n        :param retry_interval: delay between retries in seconds\n        :param retry_on: `tuple`, additional exception classes to retry on\n        :param kwargs: other arguments for :any:`Session.send_request`\n\n        :ivar base_url: `str`, base URL for sending the request\n        :ivar url: `str`, request URL\n        :ivar path: `str`, URL path for the request\n        :ivar method: `str`, request method\n        :ivar content_type: `str`, Content-Type header (\"application/x-www-form-urlencoded\" by default)\n        :ivar timeout: `float` or `tuple`, request timeout\n        :ivar n_retries: `int`, maximum number of retries\n        :ivar success_codes: `list`-like, list of response codes that indicate request's success\n        :ivar retry_interval: `float`, delay between retries in seconds\n        :ivar retry_on: `tuple`, additional exception classes to retry on\n    \"\"\"\n\n    base_url: str = \"\"\n    url: str = \"\"\n    path: str = \"\"\n    method: Optional[\"HTTPMethod\"] = None\n    content_type: str = \"application/x-www-form-urlencoded\"\n\n    timeout: \"TimeoutParameter\"\n    n_retries: Optional[int] = None\n    success_codes: Set[int] = {200}\n    retry_interval: Optional[Union[int, float]] = None\n\n    data: Union[Dict, bytes]\n    params: Dict[str, Any]\n    send_kwargs: Dict[str, Any]\n    retry_on: Tuple[Type[Exception], ...] = tuple()\n\n    session: Any\n\n    T = TypeVar(\"T\")\n\n    def __init__(self, session: \"AnySession\", **kwargs):\n        base_url = self.base_url or settings.BASE_API_URL\n        n_retries = kwargs.pop(\"n_retries\", None)\n        retry_interval = kwargs.pop(\"retry_interval\", None)\n        headers = kwargs.pop(\"headers\", {})\n        retry_on = kwargs.pop(\"retry_on\", self.retry_on)\n\n        if headers is None:\n            headers = {}\n\n        timeout = kwargs.get(\"timeout\", ...)\n\n        if is_default_timeout(timeout):\n            timeout = settings.DEFAULT_TIMEOUT\n\n        kwargs[\"timeout\"] = timeout\n\n        if n_retries is None:\n            n_retries = self.n_retries\n        if n_retries is None:\n            n_retries = settings.DEFAULT_N_RETRIES\n\n        if retry_interval is None:\n            retry_interval = self.retry_interval\n        if retry_interval is None:\n            retry_interval = settings.DEFAULT_RETRY_INTERVAL\n\n        self.session = session\n        self.send_kwargs = kwargs\n        self.base_url = base_url\n        self.timeout = timeout\n        self.n_retries = n_retries\n        self.retry_interval = retry_interval\n        self.headers = headers\n        self.data = {}\n        self.content = None\n        self.params = {}\n        self.retry_on = retry_on\n\n        if not self.url:\n            self.url = f\"{self.base_url}/{self.path.lstrip('/')}\"\n\n    def _prepare_send_args(self) -> Dict[str, Any]:\n        headers = CaseInsensitiveDict()\n        headers[\"Content-Type\"] = self.content_type\n        headers.update(self.headers)\n\n        if self.data:\n            if isinstance(self.data, Dict):\n                data = json.dumps(self.data).encode(\"utf8\")\n            else:\n                data = self.data\n        else:\n            data = None\n\n        kwargs = dict(self.send_kwargs)\n        kwargs.update({\"headers\": headers,\n                       \"data\":    data,\n                       \"params\":  self.params})\n\n        return kwargs\n\n    def _attempt(\n        self,\n        yadisk: Optional[\"Client\"],\n        then: Callable[[Any], Any]\n    ) -> Any:\n        assert self.method is not None\n        assert self.url\n\n        kwargs = self._prepare_send_args()\n\n        session: \"Session\" = self.session\n        response = session.send_request(self.method, self.url, **kwargs)\n\n        json: JSON = None\n\n        if response.status == 0:\n            # Request has not been sent yet\n            # This can happen with pycurl with stream=True\n            try:\n                json = response.json()\n            except ValueError:\n                pass\n\n            json_already_parsed = True\n        else:\n            json_already_parsed = False\n\n        success = response.status in self.success_codes\n\n        if not success:\n            raise response.get_exception()\n\n        if not json_already_parsed:\n            try:\n                json = response.json()\n            except ValueError:\n                pass\n\n        try:\n            result = self.process_json(json, yadisk=yadisk)\n        except ValueError as e:\n            raise InvalidResponseError(f\"Server returned invalid response: {e}\") from e\n\n        return then(result)\n\n    async def _async_attempt(\n        self,\n        yadisk: Optional[\"AsyncClient\"],\n        then: Union[Callable[[Any], Any], Callable[[Any], Awaitable[Any]]]\n    ) -> Any:\n        assert self.method is not None\n        assert self.url\n\n        kwargs = self._prepare_send_args()\n\n        session: \"AsyncSession\" = self.session\n\n        response = await session.send_request(self.method, self.url, **kwargs)\n\n        success = response.status in self.success_codes\n\n        if not success:\n            raise await response.get_exception()\n\n        try:\n            json = await response.json()\n        except ValueError:\n            json = None\n\n        try:\n            result = self.process_json(json, yadisk=yadisk)\n        except ValueError as e:\n            raise InvalidResponseError(f\"Server returned invalid response: {e}\") from e\n\n        if inspect.iscoroutinefunction(then):\n            return await then(result)\n        else:\n            return then(result)\n\n    def send(\n        self,\n        yadisk: Optional[\"Client\"],\n        then: Optional[Callable[[Any], Any]] = None\n    ) -> Any:\n        \"\"\"\n            Actually send the request\n\n            :param yadisk: :any:`Client` instance that will be passed to :any:`process_json()`\n            :param then: function that will be called at the end of the attempt\n\n            :returns: :any:`Response` (`self.response`)\n        \"\"\"\n\n        settings.logger.info(f\"sending APIRequest {self.__class__.__name__}, {self.method} {self.url}\")\n\n        return auto_retry(\n            self._attempt,\n            self.n_retries,\n            self.retry_interval,\n            args=(yadisk, then or (lambda x: x)),\n            retry_on=self.retry_on\n        )\n\n    async def asend(\n        self,\n        yadisk: Optional[\"AsyncClient\"],\n        then: Optional[Union[Callable[[Any], Any], Callable[[Any], Awaitable[Any]]]] = None\n    ) -> Any:\n        \"\"\"\n            Actually send the request\n\n            :param yadisk: :any:`AsyncClient` instance that will be passed to :any:`process_json()`\n            :param then: function that will be called at the end of the attempt\n\n            :returns: :any:`AsyncResponse` (`self.response`)\n        \"\"\"\n\n        settings.logger.info(f\"sending APIRequest {self.__class__.__name__}, {self.method} {self.url}\")\n\n        return await async_auto_retry(\n            self._async_attempt,\n            self.n_retries,\n            self.retry_interval,\n            args=(yadisk, then or (lambda x: x)),\n            retry_on=self.retry_on\n        )\n\n    def process_json(self, js: \"JSON\", **kwargs) -> Any:\n        \"\"\"\n            Process the JSON response.\n\n            :param js: `dict` or `None`, JSON response\n            :param kwargs: extra arguments (optional)\n\n            :returns: processed response, can be anything\n        \"\"\"\n\n        raise NotImplementedError\n"
  },
  {
    "path": "src/yadisk/_api/auth.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom .api_request import APIRequest\nfrom ..objects import TokenObject, TokenRevokeStatusObject, DeviceCodeObject\nfrom ..exceptions import InvalidResponseError\nfrom ..types import JSON\nfrom .. import settings\n\nfrom typing import Optional, Union, Literal, TYPE_CHECKING\n\nfrom urllib.parse import urlencode\n\nif TYPE_CHECKING:  # pragma: no cover\n    from ..types import AnySession\n\n__all__ = [\n    \"GetDeviceCodeRequest\",\n    \"GetTokenRequest\",\n    \"RefreshTokenRequest\",\n    \"RevokeTokenRequest\"\n]\n\n\nclass RefreshTokenRequest(APIRequest):\n    \"\"\"\n        A request to refresh an existing token.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param refresh_token: the refresh token that was received with the original token\n        :param client_id: application ID\n        :param client_secret: application secret password\n\n        :returns: :any:`TokenObject`\n    \"\"\"\n\n    method = \"POST\"\n    base_url = settings.BASE_OAUTH_API_URL\n    path = \"/token\"\n\n    def __init__(\n        self,\n        session:       \"AnySession\",\n        refresh_token: str,\n        client_id:     str,\n        client_secret: str,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.data = urlencode({\n            \"grant_type\":    \"refresh_token\",\n            \"refresh_token\": refresh_token,\n            \"client_id\":     client_id,\n            \"client_secret\": client_secret,\n        }).encode(\"utf8\")\n\n    def process_json(self, js: JSON, **kwargs) -> TokenObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk did not return valid JSON\")\n\n        return TokenObject(js)\n\n\nclass RevokeTokenRequest(APIRequest):\n    \"\"\"\n        A request to revoke the token.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param token: the token to be revoked\n        :param client_id: application ID\n        :param client_secret: application secret password\n\n        :returns: :any:`TokenRevokeStatusObject`\n    \"\"\"\n\n    method = \"POST\"\n    base_url = settings.BASE_OAUTH_API_URL\n    path = \"/revoke_token\"\n\n    def __init__(\n        self,\n        session:       \"AnySession\",\n        token:         str,\n        client_id:     str,\n        client_secret: str,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.data = urlencode({\n            \"access_token\":  token,\n            \"client_id\":     client_id,\n            \"client_secret\": client_secret\n        }).encode(\"utf8\")\n\n    def process_json(self, js: JSON, **kwargs) -> TokenRevokeStatusObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk did not return valid JSON\")\n\n        return TokenRevokeStatusObject(js)\n\n\nclass GetTokenRequest(APIRequest):\n    \"\"\"\n        A request to get the token.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param code: confirmation code\n        :param client_id: application ID\n        :param client_secret: application secret password\n        :param device_id: unique device ID (between 6 and 50 characters)\n        :param device_name: device name, should not be longer than 100 characters\n        :param code_verifier: `str`, verifier code, used with the PKCE authorization flow\n\n        :returns: :any:`TokenObject`\n    \"\"\"\n\n    method = \"POST\"\n    base_url = settings.BASE_OAUTH_API_URL\n    path = \"/token\"\n\n    def __init__(\n        self,\n        session: \"AnySession\",\n        grant_type: Union[\n            Literal[\"authorization_code\"],\n            Literal[\"device_code\"],\n            Literal[\"refresh_token\"]\n        ],\n        client_id:     str,\n        code:          Optional[str] = None,\n        token:         Optional[str] = None,\n        client_secret: Optional[str] = None,\n        device_id:     Optional[str] = None,\n        device_name:   Optional[str] = None,\n        code_verifier: Optional[str] = None,\n        **kwargs\n    ):\n        APIRequest.__init__(self, session, **kwargs)\n\n        data = {\n            \"grant_type\": grant_type,\n            \"client_id\": client_id\n        }\n\n        if code:\n            data[\"code\"] = code\n\n        if token:\n            data[\"token\"] = token\n\n        if client_secret:\n            data[\"client_secret\"] = client_secret\n\n        if device_id:\n            data[\"device_id\"] = device_id\n\n        if device_name:\n            data[\"device_name\"] = device_name\n\n        if code_verifier:\n            data[\"code_verifier\"] = code_verifier\n\n        self.data = urlencode(data).encode(\"utf8\")\n\n    def process_json(self, js: JSON, **kwargs) -> TokenObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk did not return valid JSON\")\n\n        return TokenObject(js)\n\n\nclass GetDeviceCodeRequest(APIRequest):\n    \"\"\"\n        This request is used for authorization using the Yandex OAuth page.\n        In this case the user must enter the verification code (:code:`user_code`)\n        in the browser on the Yandex OAuth page.\n        After the user has entered the code on the OAuth page, the application\n        can exchange the :code:`device_code` for the token.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param client_id: application ID\n        :param device_id: unique device ID (between 6 and 50 characters)\n        :param device_name: device name, should not be longer than 100 characters\n        :param scope: `str`, list of permissions for the application\n        :param optional_scope: `str`, list of optional permissions for the application\n    \"\"\"\n\n    method = \"POST\"\n    base_url = settings.BASE_OAUTH_API_URL\n    path = \"/device/code\"\n\n    def __init__(\n        self,\n        session:        \"AnySession\",\n        client_id:      str,\n        device_id:      Optional[str] = None,\n        device_name:    Optional[str] = None,\n        scope:          Optional[str] = None,\n        optional_scope: Optional[str] = None,\n        **kwargs\n    ):\n        APIRequest.__init__(self, session, **kwargs)\n\n        data = {\"client_id\": client_id}\n\n        if device_id:\n            data[\"device_id\"] = device_id\n\n        if device_name:\n            data[\"device_name\"] = device_name\n\n        if scope:\n            data[\"scope\"] = scope\n\n        if optional_scope:\n            data[\"optional_scope\"] = optional_scope\n\n        self.data = urlencode(data).encode(\"utf8\")\n\n    def process_json(self, js: JSON, **kwargs) -> DeviceCodeObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk did not return valid JSON\")\n\n        return DeviceCodeObject(js)\n"
  },
  {
    "path": "src/yadisk/_api/disk.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom .api_request import APIRequest\nfrom ..objects import DiskInfoObject\nfrom ..exceptions import InvalidResponseError\n\nfrom typing import Optional, TYPE_CHECKING\nfrom .._typing_compat import Iterable\n\nif TYPE_CHECKING:  # pragma: no cover\n    from ..types import AnySession, JSON\n\n__all__ = [\"DiskInfoRequest\"]\n\n\nclass DiskInfoRequest(APIRequest):\n    \"\"\"\n        A request to get disk information.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param extra_fields: list of additional keys to be included in the response\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`DiskInfoObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk\"\n\n    def __init__(\n        self,\n        session: \"AnySession\",\n        extra_fields: Optional[Iterable[str]] = None,\n        fields: Optional[Iterable[str]] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        if extra_fields is not None:\n            self.params[\"extra_fields\"] = \",\".join(extra_fields)\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(self, js: \"JSON\", **kwargs) -> DiskInfoObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        return DiskInfoObject(js)\n"
  },
  {
    "path": "src/yadisk/_api/operations.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom urllib.parse import urlparse, parse_qs, quote\n\nfrom .api_request import APIRequest\nfrom ..objects import OperationStatusObject\nfrom .._common import is_operation_link\nfrom ..exceptions import InvalidResponseError\n\nfrom typing import Optional, TYPE_CHECKING\nfrom .._typing_compat import Iterable\n\nif TYPE_CHECKING:  # pragma: no cover\n    from ..types import AnySession, JSON\n\n__all__ = [\"GetOperationStatusRequest\"]\n\n\nclass GetOperationStatusRequest(APIRequest):\n    \"\"\"\n        A request to get operation status.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param operation_id: operation ID or link\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`OperationStatusObject`\n    \"\"\"\n\n    method = \"GET\"\n\n    def __init__(\n        self,\n        session: \"AnySession\",\n        operation_id: str,\n        fields: Optional[Iterable[str]] = None,\n        **kwargs\n    ) -> None:\n        if is_operation_link(operation_id):\n            parsed_url = urlparse(operation_id)\n            operation_id = parsed_url.path.rpartition(\"/\")[2]\n\n            params = parse_qs(parsed_url.query)\n\n            if fields is None:\n                fields = params.get(\"fields\", [None])[0]\n        else:\n            operation_id = quote(operation_id)\n\n        self.path = f\"/v1/disk/operations/{operation_id}\"\n\n        APIRequest.__init__(self, session, **kwargs)\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(self, js: \"JSON\", **kwargs) -> OperationStatusObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if js.get(\"status\") not in (\"in-progress\", \"success\", \"failed\"):\n            raise InvalidResponseError(f\"Yandex.Disk returned invalid operation status object: {js}\")\n\n        return OperationStatusObject(js)\n"
  },
  {
    "path": "src/yadisk/_api/resources.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2025 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nimport typing\nfrom ..types import PublicSettings\nfrom .api_request import APIRequest\nfrom ..objects import (\n    PublicResourcesListObject, SyncPublicResourcesListObject, AsyncPublicResourcesListObject,\n    TrashResourceObject, SyncTrashResourceObject, AsyncTrashResourceObject,\n    FilesResourceListObject, SyncFilesResourceListObject, AsyncFilesResourceListObject,\n    LastUploadedResourceListObject, SyncLastUploadedResourceListObject, AsyncLastUploadedResourceListObject,\n    ResourceObject, SyncResourceObject, AsyncResourceObject, ResourceUploadLinkObject,\n    PublicResourceObject, SyncPublicResourceObject, AsyncPublicResourceObject,\n    OperationLinkObject, SyncOperationLinkObject, AsyncOperationLinkObject,\n    ResourceLinkObject, SyncResourceLinkObject, AsyncResourceLinkObject, ResourceDownloadLinkObject,\n    PublicSettingsObject, PublicAvailableSettingsObject\n)\n\nfrom .._common import is_operation_link, ensure_path_has_scheme\nfrom ..exceptions import InvalidResponseError\n\nfrom .._typing_compat import Iterable, Dict, List\nfrom typing import Optional, Union, TYPE_CHECKING\n\nif TYPE_CHECKING:  # pragma: no cover\n    from ..types import AnySession, AnyClient, JSON\n\n__all__ = [\n    \"CopyRequest\",\n    \"DeleteRequest\",\n    \"DeleteTrashRequest\",\n    \"FilesRequest\",\n    \"GetDownloadLinkRequest\",\n    \"GetMetaRequest\",\n    \"GetPublicAvailableSettingsRequest\",\n    \"GetPublicDownloadLinkRequest\",\n    \"GetPublicMetaRequest\",\n    \"GetPublicResourcesRequest\",\n    \"GetPublicSettingsRequest\",\n    \"GetTrashRequest\",\n    \"GetUploadLinkRequest\",\n    \"LastUploadedRequest\",\n    \"MkdirRequest\",\n    \"MoveRequest\",\n    \"PatchRequest\",\n    \"PublishRequest\",\n    \"RestoreTrashRequest\",\n    \"SaveToDiskRequest\",\n    \"UnpublishRequest\",\n    \"UpdatePublicSettingsRequest\",\n    \"UploadURLRequest\",\n]\n\nFields = Iterable[str]\n\n\ndef _substitute_keys(keys: Iterable[str], sub_map: Dict[str, str]) -> List[str]:\n    return [\".\".join(sub_map.get(f, f) for f in k.split(\".\")) for k in keys]\n\n\nclass GetPublicResourcesRequest(APIRequest):\n    \"\"\"\n        A request to get a list of public resources.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param offset: offset from the beginning of the list\n        :param limit: maximum number of elements in the list\n        :param preview_size: size of the file preview\n        :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n        :param type: filter based on type of resources (\"file\" or \"dir\")\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`PublicResourcesListObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/resources/public\"\n\n    def __init__(\n        self,\n        session:      \"AnySession\",\n        offset:       int                     = 0,\n        limit:        int                     = 20,\n        preview_size: Optional[str]           = None,\n        preview_crop: Optional[bool]          = None,\n        type:         Optional[str]           = None,\n        fields:       Optional[Iterable[str]] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"offset\"] = offset\n        self.params[\"limit\"] = limit\n\n        if preview_size is not None:\n            self.params[\"preview_size\"] = preview_size\n\n        if preview_crop is not None:\n            self.params[\"preview_crop\"] = \"true\" if preview_crop else \"false\"\n\n        if type is not None:\n            self.params[\"type\"] = type\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> PublicResourcesListObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncPublicResourcesListObject(js, yadisk)\n        else:\n            return AsyncPublicResourcesListObject(js, yadisk)\n\n\nclass UnpublishRequest(APIRequest):\n    \"\"\"\n        A request to make a public resource private.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the resource to be unpublished\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceLinkObject`\n    \"\"\"\n\n    method = \"PUT\"\n    path = \"/v1/disk/resources/unpublish\"\n\n    def __init__(\n        self,\n        session:  \"AnySession\",\n        path:     str,\n        fields:   Optional[Iterable[str]] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> ResourceLinkObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncResourceLinkObject(js, yadisk)\n        else:\n            return AsyncResourceLinkObject(js, yadisk)\n\n\nclass GetDownloadLinkRequest(APIRequest):\n    \"\"\"\n        A request to get a download link to a resource.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the resource to be downloaded\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceDownloadLinkObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/resources/download\"\n\n    def __init__(\n        self,\n        session:  \"AnySession\",\n        path:     str,\n        fields:   Optional[Iterable[str]] = None,\n        **kwargs\n    ):\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> ResourceDownloadLinkObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        return ResourceDownloadLinkObject(js, yadisk)\n\n\nclass GetTrashRequest(APIRequest):\n    \"\"\"\n        A request to get meta-information about a trash resource.\n\n        :param path: path to the trash resource\n        :param limit: number of children resources to be included in the response\n        :param offset: number of children resources to be skipped in the response\n        :param preview_size: size of the file preview\n        :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n        :param sort: `str`, field to be used as a key to sort children resources\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`TrashResourceObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/trash/resources\"\n\n    def __init__(\n        self,\n        session:      \"AnySession\",\n        path:         str,\n        offset:       int                     = 0,\n        limit:        int                     = 20,\n        sort:         Optional[str]           = None,\n        preview_size: Optional[str]           = None,\n        preview_crop: Optional[bool]          = None,\n        fields:       Optional[Iterable[str]] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path, \"trash\")\n        self.params[\"offset\"] = offset\n        self.params[\"limit\"] = limit\n\n        if sort is not None:\n            self.params[\"sort\"] = sort\n\n        if preview_size is not None:\n            self.params[\"preview_size\"] = preview_size\n\n        if preview_crop is not None:\n            self.params[\"preview_crop\"] = \"true\" if preview_crop else \"false\"\n\n        if fields is not None:\n            sub_map = {\"embedded\": \"_embedded\"}\n\n            self.params[\"fields\"] = \",\".join(_substitute_keys(fields, sub_map))\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> TrashResourceObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncTrashResourceObject(js, yadisk)\n        else:\n            return AsyncTrashResourceObject(js, yadisk)\n\n\nclass RestoreTrashRequest(APIRequest):\n    \"\"\"\n        A request to restore trash.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the trash resource to be restored\n        :param dst_path: destination path\n        :param force_async: forces the operation to be executed asynchronously\n        :param overwrite: `bool`, determines whether the destination can be overwritten\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceLinkObject` or :any:`OperationLinkObject`\n    \"\"\"\n\n    method = \"PUT\"\n    path = \"/v1/disk/trash/resources/restore\"\n    success_codes = {201, 202}\n\n    def __init__(\n        self,\n        session:     \"AnySession\",\n        path:        str,\n        dst_path:    Optional[str]           = None,\n        force_async: bool                    = False,\n        overwrite:   bool                    = False,\n        fields:      Optional[Iterable[str]] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path, \"trash\")\n        self.params[\"overwrite\"] = \"true\" if overwrite else \"false\"\n        self.params[\"force_async\"] = \"true\" if force_async else \"false\"\n\n        if dst_path is not None:\n            self.params[\"name\"] = dst_path\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> Union[OperationLinkObject, ResourceLinkObject]:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\", disable_retry=True)\n\n        if is_operation_link(js.get(\"href\", \"\")):\n            if yadisk is None or yadisk.synchronous:\n                return SyncOperationLinkObject(js, yadisk)\n            else:\n                return AsyncOperationLinkObject(js, yadisk)\n        elif self.params.get(\"force_async\") == \"true\":\n            raise InvalidResponseError(\n                \"Yandex.Disk did not return an operation link, despite force_async=true\",\n                disable_retry=True\n            )\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncResourceLinkObject(js, yadisk)\n        else:\n            return AsyncResourceLinkObject(js, yadisk)\n\n\nclass DeleteTrashRequest(APIRequest):\n    \"\"\"\n        A request to delete a trash resource.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the trash resource to be deleted\n        :param force_async: forces the operation to be executed asynchronously\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`OperationLinkObject` or `None`\n    \"\"\"\n\n    method = \"DELETE\"\n    path = \"/v1/disk/trash/resources\"\n    success_codes = {202, 204}\n\n    def __init__(\n        self,\n        session:     \"AnySession\",\n        path:        Optional[str]           = None,\n        force_async: bool                    = False,\n        fields:      Optional[Iterable[str]] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        if path is not None:\n            self.params[\"path\"] = ensure_path_has_scheme(path, \"trash\")\n\n        self.params[\"force_async\"] = \"true\" if force_async else \"false\"\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> Optional[OperationLinkObject]:\n        if js is not None:\n            if not isinstance(js, dict):\n                raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\", disable_retry=True)\n\n            if yadisk is None or yadisk.synchronous:\n                return SyncOperationLinkObject(js, yadisk)\n            else:\n                return AsyncOperationLinkObject(js, yadisk)\n        elif self.params.get(\"force_async\") == \"true\":\n            raise InvalidResponseError(\n                \"Yandex.Disk did not return an operation link, despite force_async=true\",\n                disable_retry=True\n            )\n\n        return None\n\n\nclass LastUploadedRequest(APIRequest):\n    \"\"\"\n        A request to get the list of latest uploaded files sorted by upload date.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param limit: maximum number of elements in the list\n        :param media_type: type of files to include in the list\n        :param preview_size: size of the file preview\n        :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`LastUploadedResourceListObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/resources/last-uploaded\"\n\n    def __init__(\n        self,\n        session: \"AnySession\",\n        limit:        int                                 = 20,\n        media_type:   Optional[Union[str, Iterable[str]]] = None,\n        preview_size: Optional[str]                       = None,\n        preview_crop: Optional[bool]                      = None,\n        fields:       Optional[Iterable[str]]             = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"limit\"] = limit\n\n        if media_type is not None:\n            if not isinstance(media_type, Iterable):\n                raise TypeError(\"media_type should be a string or an iterable\")\n\n            if isinstance(media_type, str):\n                self.params[\"media_type\"] = media_type\n            else:\n                self.params[\"media_type\"] = \",\".join(media_type)\n\n        if preview_size is not None:\n            self.params[\"preview_size\"] = preview_size\n\n        if preview_crop is not None:\n            self.params[\"preview_crop\"] = \"true\" if preview_crop else \"false\"\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> LastUploadedResourceListObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncLastUploadedResourceListObject(js, yadisk)\n        else:\n            return AsyncLastUploadedResourceListObject(js, yadisk)\n\n\nclass CopyRequest(APIRequest):\n    \"\"\"\n        A request to copy a file or a directory.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param src_path: source path\n        :param dst_path: destination path\n        :param overwrite: if `True` the destination path can be overwritten,\n                          otherwise, an error will be raised\n        :param force_async: forces the operation to be executed asynchronously\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceLinkObject` or :any:`OperationLinkObject`\n    \"\"\"\n\n    method = \"POST\"\n    path = \"/v1/disk/resources/copy\"\n    success_codes = {201, 202}\n\n    def __init__(\n        self,\n        session:     \"AnySession\",\n        src_path:    str,\n        dst_path:    str,\n        overwrite:   bool             = False,\n        force_async: bool             = False,\n        fields:      Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"from\"] = ensure_path_has_scheme(src_path)\n        self.params[\"path\"] = ensure_path_has_scheme(dst_path)\n        self.params[\"overwrite\"] = \"true\" if overwrite else \"false\"\n        self.params[\"force_async\"] = \"true\" if force_async else \"false\"\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> Union[OperationLinkObject, ResourceLinkObject]:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\", disable_retry=True)\n\n        if is_operation_link(js.get(\"href\", \"\")):\n            if yadisk is None or yadisk.synchronous:\n                return SyncOperationLinkObject(js, yadisk)\n            else:\n                return AsyncOperationLinkObject(js, yadisk)\n        elif self.params.get(\"force_async\") == \"true\":\n            raise InvalidResponseError(\n                \"Yandex.Disk did not return an operation link, despite force_async=true\",\n                disable_retry=True\n            )\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncResourceLinkObject(js, yadisk)\n        else:\n            return AsyncResourceLinkObject(js, yadisk)\n\n\nclass GetMetaRequest(APIRequest):\n    \"\"\"\n        A request to get meta-information about a resource.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the resource\n        :param limit: number of children resources to be included in the response\n        :param offset: number of children resources to be skipped in the response\n        :param preview_size: size of the file preview\n        :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n        :param sort: `str`, field to be used as a key to sort children resources\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/resources\"\n\n    def __init__(\n        self,\n        session: \"AnySession\",\n        path:         str,\n        limit:        Optional[int]    = None,\n        offset:       Optional[int]    = None,\n        preview_size: Optional[str]    = None,\n        preview_crop: Optional[bool]   = None,\n        sort:         Optional[str]    = None,\n        fields:       Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n\n        if limit is not None:\n            self.params[\"limit\"] = limit\n\n        if offset is not None:\n            self.params[\"offset\"] = offset\n\n        if preview_size is not None:\n            self.params[\"preview_size\"] = preview_size\n\n        if preview_crop is not None:\n            self.params[\"preview_crop\"] = \"true\" if preview_crop else \"false\"\n\n        if sort is not None:\n            self.params[\"sort\"] = sort\n\n        if fields is not None:\n            sub_map = {\"embedded\": \"_embedded\"}\n\n            self.params[\"fields\"] = \",\".join(_substitute_keys(fields, sub_map))\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> ResourceObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncResourceObject(js, yadisk)\n        else:\n            return AsyncResourceObject(js, yadisk)\n\n\nclass GetUploadLinkRequest(APIRequest):\n    \"\"\"\n        A request to get an upload link.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to be uploaded at\n        :param overwrite: `bool`, determines whether to overwrite the destination\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceUploadLinkObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/resources/upload\"\n\n    def __init__(\n        self,\n        session:   \"AnySession\",\n        path:      str,\n        overwrite: bool             = False,\n        fields:    Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n        self.params[\"overwrite\"] = \"true\" if overwrite else \"false\"\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> ResourceUploadLinkObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        return ResourceUploadLinkObject(js, yadisk)\n\n\nclass MkdirRequest(APIRequest):\n    \"\"\"\n        A request to create a new directory.\n\n        :param path: path to the directory to be created\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceLinkObject`\n    \"\"\"\n\n    method = \"PUT\"\n    path = \"/v1/disk/resources\"\n    success_codes = {201}\n\n    def __init__(\n        self,\n        session:  \"AnySession\",\n        path:     str,\n        fields:   Optional[Fields] = None,\n        **kwargs\n    ):\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> ResourceLinkObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\", disable_retry=True)\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncResourceLinkObject(js, yadisk)\n        else:\n            return AsyncResourceLinkObject(js, yadisk)\n\n\nclass PublishRequest(APIRequest):\n    \"\"\"\n        A request to make a resource public.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the resource to be published\n        :param allow_address_access: `bool`, specifies the request format, i.e.\n            with personal access settings (when set to `True`) or without\n        :param public_settings: :any:`PublicSettings`, public access settings for the resource\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceLinkObject`\n    \"\"\"\n\n    method = \"PUT\"\n    path = \"/v1/disk/resources/publish\"\n    content_type = \"application/json\"\n\n    def __init__(\n        self,\n        session:              \"AnySession\",\n        path:                 str,\n        allow_address_access: bool = False,\n        public_settings:      Optional[PublicSettings] = None,\n        fields:               Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n        self.params[\"allow_address_access\"] = \"true\" if allow_address_access else \"false\"\n        self.data = {\"public_settings\": public_settings or {}}\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> ResourceLinkObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncResourceLinkObject(js, yadisk)\n        else:\n            return AsyncResourceLinkObject(js, yadisk)\n\n\nclass GetPublicSettingsRequest(APIRequest):\n    \"\"\"\n        A request to get public settings of a resource.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the resource\n        :param allow_address_access: `bool`, specifies the request format, i.e.\n            with personal access settings (when set to `True`) or without\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`PublicSettingsObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/public/resources/public-settings\"\n\n    def __init__(\n        self,\n        session: \"AnySession\",\n        path: str,\n        allow_address_access: bool = False,\n        fields: Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n        self.params[\"allow_address_access\"] = \"true\" if allow_address_access else \"false\"\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> PublicSettingsObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        return PublicSettingsObject(js)\n\n\nclass GetPublicAvailableSettingsRequest(APIRequest):\n    \"\"\"\n        A request to get public settings of a shared resource for the current OAuth token owner.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the resource\n\n        :returns: :any:`PublicAvailableSettingsObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/public/resources/public-settings/available-settings\"\n\n    def __init__(\n        self,\n        session: \"AnySession\",\n        path: str,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> PublicAvailableSettingsObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        return PublicAvailableSettingsObject(js)\n\n\nclass UpdatePublicSettingsRequest(APIRequest):\n    \"\"\"\n        A request to update public settings of a shared resource.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the resource\n        :param public_settings: :any:`PublicSettings`, public access settings for the resource\n\n        :returns: `None`\n    \"\"\"\n\n    method = \"PATCH\"\n    path = \"/v1/disk/public/resources/public-settings\"\n    content_type = \"application/json\"\n\n    def __init__(\n        self,\n        session: \"AnySession\",\n        path: str,\n        public_settings: PublicSettings,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n        self.data = typing.cast(Dict, public_settings)\n\n    def process_json(self, js: \"JSON\", yadisk: Optional[\"AnyClient\"] = None, **kwargs) -> None:\n        return\n\n\nclass UploadURLRequest(APIRequest):\n    \"\"\"\n        A request to upload a file from URL.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param url: source URL\n        :param path: destination path\n        :param disable_redirects: `bool`, forbid redirects\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`OperationLinkObject`\n    \"\"\"\n\n    method = \"POST\"\n    path = \"/v1/disk/resources/upload\"\n    success_codes = {202}\n\n    def __init__(\n        self,\n        session:           \"AnySession\",\n        url:               str,\n        path:              str,\n        disable_redirects: bool             = False,\n        fields:            Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"url\"] = url\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n        self.params[\"disable_redirects\"] = \"true\" if disable_redirects else \"false\"\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> OperationLinkObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\", disable_retry=True)\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncOperationLinkObject(js, yadisk)\n        else:\n            return AsyncOperationLinkObject(js, yadisk)\n\n\nclass DeleteRequest(APIRequest):\n    \"\"\"\n        A request to delete a file or a directory.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the resource to be removed\n        :param permanently: if `True`, the resource will be removed permanently,\n                            otherwise, it will be just moved to the trash\n        :param force_async: forces the operation to be executed asynchronously\n        :param md5: `str`, MD5 hash of the file to remove\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`OperationLinkObject` or `None`\n    \"\"\"\n\n    method = \"DELETE\"\n    path = \"/v1/disk/resources\"\n    success_codes = {202, 204}\n\n    def __init__(\n        self,\n        session:     \"AnySession\",\n        path:        str,\n        permanently: bool             = False,\n        md5:         Optional[str]    = None,\n        force_async: bool             = False,\n        fields:      Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n        self.params[\"permanently\"] = \"true\" if permanently else \"false\"\n        self.params[\"force_async\"] = \"true\" if force_async else \"false\"\n\n        if md5 is not None:\n            self.params[\"md5\"] = md5\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> Optional[OperationLinkObject]:\n        if isinstance(js, dict):\n            if yadisk is None or yadisk.synchronous:\n                return SyncOperationLinkObject(js, yadisk)\n            else:\n                return AsyncOperationLinkObject(js, yadisk)\n        elif js is not None:\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\", disable_retry=True)\n        elif self.params.get(\"force_async\") == \"true\":\n            raise InvalidResponseError(\n                \"Yandex.Disk did not return an operation link, despite force_async=true\",\n                disable_retry=True\n            )\n\n        return None\n\n\nclass SaveToDiskRequest(APIRequest):\n    \"\"\"\n        A request to save a public resource to the disk.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param public_key: public key or public URL of the resource\n        :param name: filename of the saved resource\n        :param path: path to the copied resource in the public folder\n        :param save_path: path to the destination directory (downloads directory by default)\n        :param force_async: forces the operation to be executed asynchronously\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceLinkObject` or :any:`OperationLinkObject`\n    \"\"\"\n\n    method = \"POST\"\n    path = \"/v1/disk/public/resources/save-to-disk\"\n    success_codes = {201, 202}\n\n    def __init__(\n        self,\n        session:     \"AnySession\",\n        public_key:  str,\n        name:        Optional[str]    = None,\n        path:        Optional[str]    = None,\n        save_path:   Optional[str]    = None,\n        force_async: bool             = False,\n        fields:      Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"public_key\"] = public_key\n\n        if name is not None:\n            self.params[\"name\"] = name\n\n        if path is not None:\n            self.params[\"path\"] = path\n\n        if save_path is not None:\n            self.params[\"save_path\"] = ensure_path_has_scheme(save_path)\n\n        self.params[\"force_async\"] = \"true\" if force_async else \"false\"\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> Union[OperationLinkObject, ResourceLinkObject]:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\", disable_retry=True)\n\n        if is_operation_link(js.get(\"href\", \"\")):\n            if yadisk is None or yadisk.synchronous:\n                return SyncOperationLinkObject(js, yadisk)\n            else:\n                return AsyncOperationLinkObject(js, yadisk)\n        elif self.params.get(\"force_async\") == \"true\":\n            raise InvalidResponseError(\n                \"Yandex.Disk did not return an operation link, despite force_async=true\",\n                disable_retry=True\n            )\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncResourceLinkObject(js, yadisk)\n        else:\n            return AsyncResourceLinkObject(js, yadisk)\n\n\nclass GetPublicMetaRequest(APIRequest):\n    \"\"\"\n        A request to get meta-information about a public resource.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param public_key: public key or public URL of the resource\n        :param path: relative path to a resource in a public folder.\n                     By specifying the key of the published folder in `public_key`,\n                     you can request metainformation for any resource in the folder.\n        :param offset: offset from the beginning of the list of nested resources\n        :param limit: maximum number of nested elements to be included in the list\n        :param sort: `str`, field to be used as a key to sort children resources\n        :param preview_size: file preview size\n        :param preview_crop: `bool`, allow preview crop\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`PublicResourceObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/public/resources\"\n\n    def __init__(\n        self,\n        session:      \"AnySession\",\n        public_key:   str,\n        offset:       int              = 0,\n        limit:        int              = 20,\n        path:         Optional[str]    = None,\n        sort:         Optional[str]    = None,\n        preview_size: Optional[str]    = None,\n        preview_crop: Optional[bool]   = None,\n        fields:       Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"public_key\"] = public_key\n        self.params[\"offset\"] = offset\n        self.params[\"limit\"] = limit\n\n        if path is not None:\n            self.params[\"path\"] = path\n\n        if sort is not None:\n            self.params[\"sort\"] = sort\n\n        if preview_size is not None:\n            self.params[\"preview_size\"] = preview_size\n\n        if preview_crop is not None:\n            self.params[\"preview_crop\"] = \"true\" if preview_crop else \"false\"\n\n        if fields is not None:\n            sub_map = {\"embedded\": \"_embedded\",\n                       \"view_count\": \"views_count\"}\n\n            self.params[\"fields\"] = \",\".join(_substitute_keys(fields, sub_map))\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> PublicResourceObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncPublicResourceObject(js, yadisk)\n        else:\n            return AsyncPublicResourceObject(js, yadisk)\n\n\nclass GetPublicDownloadLinkRequest(APIRequest):\n    \"\"\"\n        A request to get a download link for a public resource.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param public_key: public key or public URL of the resource\n        :param path: relative path to the resource within the public folder\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceDownloadLinkObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/public/resources/download\"\n\n    def __init__(\n        self,\n        session:    \"AnySession\",\n        public_key: str,\n        path:       Optional[str]    = None,\n        fields:     Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"public_key\"] = public_key\n\n        if path is not None:\n            self.params[\"path\"] = path\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> ResourceDownloadLinkObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        return ResourceDownloadLinkObject(js, yadisk)\n\n\nclass MoveRequest(APIRequest):\n    \"\"\"\n        A request to move a resource.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param src_path: source path to be moved\n        :param dst_path: destination path\n        :param force_async: forces the operation to be executed asynchronously\n        :param overwrite: `bool`, determines whether to overwrite the destination\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`OperationLinkObject` or :any:`ResourceLinkObject`\n    \"\"\"\n\n    method = \"POST\"\n    path = \"/v1/disk/resources/move\"\n    success_codes = {201, 202}\n\n    def __init__(\n        self,\n        session:      \"AnySession\",\n        src_path:    str,\n        dst_path:    str,\n        force_async: bool             = False,\n        overwrite:   bool             = False,\n        fields:      Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"from\"] = ensure_path_has_scheme(src_path)\n        self.params[\"path\"] = ensure_path_has_scheme(dst_path)\n        self.params[\"overwrite\"] = \"true\" if overwrite else \"false\"\n        self.params[\"force_async\"] = \"true\" if force_async else \"false\"\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> Union[OperationLinkObject, ResourceLinkObject]:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\", disable_retry=True)\n\n        if is_operation_link(js.get(\"href\", \"\")):\n            if yadisk is None or yadisk.synchronous:\n                return SyncOperationLinkObject(js, yadisk)\n            else:\n                return AsyncOperationLinkObject(js, yadisk)\n        elif self.params.get(\"force_async\") == \"true\":\n            raise InvalidResponseError(\n                \"Yandex.Disk did not return an operation link, despite force_async=true\",\n                disable_retry=True\n            )\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncResourceLinkObject(js, yadisk)\n        else:\n            return AsyncResourceLinkObject(js, yadisk)\n\n\nclass FilesRequest(APIRequest):\n    \"\"\"\n        A request to get a flat list of all files (that doesn't include directories).\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param offset: offset from the beginning of the list\n        :param limit: number of list elements to be included\n        :param media_type: type of files to include in the list\n        :param sort: `str`, field to be used as a key to sort children resources\n        :param preview_size: size of the file preview\n        :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`FilesResourceListObject`\n    \"\"\"\n\n    method = \"GET\"\n    path = \"/v1/disk/resources/files\"\n\n    def __init__(\n        self,\n        session:      \"AnySession\",\n        offset:       int                                 = 0,\n        limit:        int                                 = 20,\n        media_type:   Optional[Union[str, Iterable[str]]] = None,\n        preview_size: Optional[str]                       = None,\n        preview_crop: Optional[bool]                      = None,\n        sort:         Optional[str]                       = None,\n        fields:       Optional[Fields]                    = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"offset\"] = offset\n        self.params[\"limit\"] = limit\n\n        if media_type is not None:\n            if not isinstance(media_type, Iterable):\n                raise TypeError(\"media_type should be a string or an iterable\")\n\n            if isinstance(media_type, str):\n                self.params[\"media_type\"] = media_type\n            else:\n                self.params[\"media_type\"] = \",\".join(media_type)\n\n        if preview_size is not None:\n            self.params[\"preview_size\"] = preview_size\n\n        if preview_crop is not None:\n            self.params[\"preview_crop\"] = \"true\" if preview_crop else \"false\"\n\n        if sort is not None:\n            self.params[\"sort\"] = sort\n\n        if fields is not None:\n            self.params[\"fields\"] = \",\".join(fields)\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> FilesResourceListObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncFilesResourceListObject(js, yadisk)\n        else:\n            return AsyncFilesResourceListObject(js, yadisk)\n\n\nclass PatchRequest(APIRequest):\n    \"\"\"\n        A request to update custom properties of a resource.\n\n        :param session: an instance of :any:`Session` or :any:`AsyncSession` with prepared headers\n        :param path: path to the resource\n        :param properties: `dict`, custom properties to update\n        :param fields: list of keys to be included in the response\n\n        :returns: :any:`ResourceObject`\n    \"\"\"\n\n    method = \"PATCH\"\n    path = \"/v1/disk/resources\"\n    content_type = \"application/json\"\n\n    def __init__(\n        self,\n        session:    \"AnySession\",\n        path:       str,\n        properties: dict,\n        fields:     Optional[Fields] = None,\n        **kwargs\n    ) -> None:\n        APIRequest.__init__(self, session, **kwargs)\n\n        self.params[\"path\"] = ensure_path_has_scheme(path)\n        self.data = {\"custom_properties\": properties}\n\n        if fields is not None:\n            sub_map = {\"embedded\": \"_embedded\"}\n\n            self.params[\"fields\"] = \",\".join(_substitute_keys(fields, sub_map))\n\n    def process_json(\n        self,\n        js: \"JSON\",\n        yadisk: Optional[\"AnyClient\"] = None,\n        **kwargs\n    ) -> ResourceObject:\n        if not isinstance(js, dict):\n            raise InvalidResponseError(\"Yandex.Disk returned invalid JSON\")\n\n        if yadisk is None or yadisk.synchronous:\n            return SyncResourceObject(js, yadisk)\n        else:\n            return AsyncResourceObject(js, yadisk)\n"
  },
  {
    "path": "src/yadisk/_async_client.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nimport asyncio\nimport inspect\nfrom pathlib import PurePosixPath\n\nimport posixpath\nfrom urllib.parse import urlencode\n\nfrom .types import (\n    AsyncFileOrPath, AsyncFileOrPathDestination, AsyncOpenFileCallback,\n    AsyncSessionFactory, FileOpenMode, BinaryAsyncFileLike, AsyncSessionName,\n    OperationStatus, PublicSettings\n)\n\nfrom . import settings\nfrom ._api import *\nfrom .exceptions import (\n    AsyncOperationFailedError, AsyncOperationPollingTimeoutError,\n    InvalidResponseError, ParentNotFoundError, RetriableYaDiskError, UnauthorizedError,\n    OperationNotFoundError, PathNotFoundError, WrongResourceTypeError\n)\nfrom .utils import auto_retry, CaseInsensitiveDict\nfrom .objects import (\n    AsyncResourceLinkObject, AsyncPublicResourceLinkObject, TokenObject,\n    TokenRevokeStatusObject, DiskInfoObject, AsyncResourceObject,\n    AsyncOperationLinkObject, AsyncTrashResourceObject,\n    AsyncPublicResourceObject, AsyncPublicResourcesListObject,\n    AsyncFilesResourceListObject, AsyncLastUploadedResourceListObject,\n    DeviceCodeObject, ResourceUploadLinkObject, PublicSettingsObject, PublicAvailableSettingsObject\n)\n\nfrom typing import Any, Optional, Union, IO, BinaryIO, Literal\nfrom ._typing_compat import Callable, AsyncGenerator, Awaitable, Dict, List, Type\n\nfrom ._async_session import AsyncSession\nfrom ._import_session import import_async_session\n\nfrom ._client_common import (\n    _add_spoof_user_agent_header, _apply_default_args,\n    _filter_request_kwargs, _set_authorization_header,\n    _add_authorization_header, _validate_listdir_response,\n    _validate_link_response, _validate_get_type_response\n)\n\nfrom ._common import remove_path_scheme, is_async_func\n\n_default_open_file: AsyncOpenFileCallback\n\ntry:\n    import aiofiles\n\n\n    async def _open_file_with_aiofiles(path: Union[str, bytes], mode: FileOpenMode) -> BinaryAsyncFileLike:\n        return await aiofiles.open(path, mode)\n\n\n    _default_open_file = _open_file_with_aiofiles\nexcept ImportError:\n    async def _open_file(path: Union[str, bytes], mode: FileOpenMode) -> BinaryIO:\n        return open(path, mode)\n\n\n    _default_open_file = _open_file\n\n__all__ = [\"AsyncClient\"]\n\n\nasync def _exists(get_meta_function: Callable[..., Awaitable], /, *args, **kwargs) -> bool:\n    try:\n        # We want to query the bare minimum number of fields, that's what\n        # the fields parameter is for\n        await get_meta_function(*args, fields=[\"type\"], **kwargs)\n\n        return True\n    except PathNotFoundError:\n        return False\n\n\nResourceType = Union[\"AsyncResourceObject\", \"AsyncPublicResourceObject\", \"AsyncTrashResourceObject\"]\n\n\nasync def _get_type(\n    get_meta_function: Callable[..., Awaitable[ResourceType]],\n    /,\n    *args,\n    **kwargs\n) -> str:\n    return (\n        await get_meta_function(\n            *args,\n            _then=_validate_get_type_response,\n            fields=[\"type\"],\n            **kwargs\n        )\n    ).type  # type: ignore[return-value]\n\n\nasync def _listdir(\n    get_meta_function: Callable[..., Awaitable[ResourceType]],\n    path: str,\n    /,\n    *,\n    max_items: Optional[int] = None,\n    **kwargs\n) -> AsyncGenerator:\n    if kwargs.get(\"limit\") is None:\n        kwargs[\"limit\"] = 500\n\n    if kwargs.get(\"fields\") is None:\n        kwargs[\"fields\"] = []\n\n    kwargs[\"fields\"] = [\"embedded.items.%s\" % (k,) for k in kwargs[\"fields\"]]\n\n    # Fields that are absolutely necessary\n    NECESSARY_FIELDS = [\"type\",\n                        \"embedded\",\n                        \"embedded.offset\",\n                        \"embedded.limit\",\n                        \"embedded.total\",\n                        \"embedded.items\"]\n\n    kwargs[\"fields\"].extend(NECESSARY_FIELDS)\n\n    remaining_items = max_items\n\n    if remaining_items is not None:\n        # Do not query more items than necessary\n        kwargs[\"limit\"] = min(remaining_items, kwargs[\"limit\"])\n\n    result = await get_meta_function(path, _then=_validate_listdir_response, **kwargs)\n\n    if result.type == \"file\":\n        raise WrongResourceTypeError(\"%r is a file\" % (path,))\n\n    for child in result.embedded.items[:remaining_items]:  # type: ignore[union-attr,index]\n        yield child\n\n    limit: int = result.embedded.limit  # type: ignore[assignment,union-attr]\n    offset: int = result.embedded.offset  # type: ignore[assignment,union-attr]\n    total: int = result.embedded.total  # type: ignore[assignment,union-attr]\n\n    while offset + limit < total:\n        if remaining_items is not None:\n            remaining_items -= len(result.embedded.items)  # type: ignore[union-attr,arg-type]\n\n            if remaining_items <= 0:\n                break\n\n            # Do not query more items than necessary\n            kwargs[\"limit\"] = min(remaining_items, kwargs[\"limit\"])\n        else:\n            remaining_items = None\n\n        offset += limit\n        kwargs[\"offset\"] = offset\n        result = await get_meta_function(path, _then=_validate_listdir_response, **kwargs)\n\n        if result.type == \"file\":\n            raise WrongResourceTypeError(\"%r is a file\" % (path,))\n\n        for child in result.embedded.items[:remaining_items]:  # type: ignore[union-attr,index]\n            yield child\n\n        limit = result.embedded.limit  # type: ignore[assignment,union-attr]\n        total = result.embedded.total  # type: ignore[assignment,union-attr]\n\n\nasync def read_in_chunks(file: IO, chunk_size: int = 64 * 1024) -> Union[AsyncGenerator[str, None],\n                                                                         AsyncGenerator[bytes, None]]:\n    while chunk := await file.read(chunk_size):\n        yield chunk\n\n\nasync def read_in_chunks_sync(file: IO, chunk_size: int = 64 * 1024) -> Union[AsyncGenerator[str, None],\n                                                                              AsyncGenerator[bytes, None]]:\n    while chunk := file.read(chunk_size):\n        yield chunk\n\n\nasync def _file_tell(file: Any) -> int:\n    if is_async_func(file.tell):\n        return await file.tell()\n    else:\n        return file.tell()\n\n\nasync def _file_seek(file: Any, offset: int, whence: int = 0) -> int:\n    if is_async_func(file.seek):\n        return await file.seek(offset, whence)\n    else:\n        return file.seek(offset, whence)\n\n\nasync def _is_file_seekable(file: Any) -> bool:\n    if not hasattr(file, \"seekable\"):\n        # Assume the file is seekable if there's no way to check\n        return True\n\n    if is_async_func(file.seekable):\n        return await file.seekable()\n\n    return file.seekable()\n\n\nclass AsyncClient:\n    \"\"\"\n        Implements access to Yandex.Disk REST API (provides asynchronous API).\n\n        HTTP client implementation can be specified using the :code:`session`\n        parameter. :any:`AsyncHTTPXSession` is used by default. For other options,\n        see :doc:`/api_reference/sessions`.\n\n        Almost all methods of :any:`AsyncClient` (the ones that accept `**kwargs`)\n        accept some additional arguments:\n\n        * **n_retries** - `int`, maximum number of retries for a request\n        * **retry_interval** - `float`, delay between retries (in seconds)\n        * **headers** - `dict` or `None`, additional request headers\n        * **timeout** - `tuple` (:code:`(<connect timeout>, <read timeout>)`) or\n          `float` (specifies both connect and read timeout), request timeout\n          (in seconds)\n\n        Additional parameters, specific to a given HTTP client library can also\n        be passed, see documentation for specific :any:`AsyncSession` subclasses\n        (:doc:`/api_reference/sessions`).\n\n        .. note::\n           Do not forget to call :any:`AsyncClient.close` or use the `async with` statement\n           to close all the connections. Otherwise, you may get a warning.\n\n           In :any:`Client` this is handled in the destructor, but since\n           :any:`AsyncClient.close` is a coroutine function the\n           same cannot be done here, so you have to do it explicitly.\n\n        :param id: application ID\n        :param secret: application secret password\n        :param token: application token\n        :param default_args: `dict` or `None`, default arguments for methods.\n                             Can be used to set the default timeout, headers, etc.\n        :param session: `None`, `str` or an instance of :any:`AsyncSession`.\n                        If :code:`session` is a string, the appropriate session\n                        class will be imported, it must be one of the\n                        following values:\n\n                          * :code:`\"aiohttp\"` - :any:`AIOHTTPSession`\n                          * :code:`\"httpx\"` - :any:`AsyncHTTPXSession`\n\n        :param open_file: `None` or an async function that opens a file for\n                           reading or writing (:code:`aiofiles.open()` by default)\n        :param session_factory: kept for compatibility, callable that returns an\n                                instance of :any:`AsyncSession`\n\n        :ivar id: `str`, application ID\n        :ivar secret: `str`, application secret password\n        :ivar token: `str`, application token\n        :ivar default_args: `dict`, default arguments for methods. Can be used to\n                            set the default timeout, headers, etc.\n        :ivar session: current session (:any:`AsyncSession` instance)\n        :ivar open_file: async function that opens a file for reading or writing\n                         (:code:`aiofiles.open()` by default)\n\n        The following exceptions may be raised by most API requests:\n\n        :raises RequestError: HTTP client raised an exception while making a request\n        :raises BadRequestError: server returned HTTP code 400\n        :raises FieldValidationError: request contains fields with invalid data\n        :raises UnauthorizedError: server returned HTTP code 401\n        :raises ForbiddenError: server returned HTTP code 403\n        :raises NotAcceptableError: server returned HTTP code 406\n        :raises ConflictError: server returned HTTP code 409\n        :raises PayloadTooLargeError: server returned code 413\n        :raises UnsupportedMediaError: server returned HTTP code 415\n        :raises LockedError: server returned HTTP code 423\n        :raises TooManyRequestsError: server returned HTTP code 429\n        :raises InternalServerError: server returned HTTP code 500\n        :raises BadGatewayError: server returned HTTP code 502\n        :raises UnavailableError: server returned HTTP code 503\n        :raises GatewayTimeoutError: server returned HTTP code 504\n        :raises InsufficientStorageError: server returned HTTP code 509\n        :raises UnknownYaDiskError: other unknown error\n    \"\"\"\n\n    id: str\n    secret: str\n    token: str\n    default_args: Dict[str, Any]\n    session: AsyncSession\n    open_file: AsyncOpenFileCallback\n\n    synchronous = False\n\n    def __init__(\n        self,\n        id:     str = \"\",\n        secret: str = \"\",\n        token:  str = \"\",\n        *,\n        default_args:    Optional[Dict[str, Any]] = None,\n        session:         Optional[Union[AsyncSession, AsyncSessionName]] = None,\n        open_file:       Optional[AsyncOpenFileCallback] = None,\n        session_factory: Optional[AsyncSessionFactory] = None\n    ) -> None:\n        self.id = id\n        self.secret = secret\n\n        self.token = \"\"\n\n        self.default_args = {} if default_args is None else default_args\n\n        if session is None:\n            if session_factory is not None:\n                session = session_factory()\n            else:\n                try:\n                    session = import_async_session(\"httpx\")()\n                except ModuleNotFoundError as e:\n                    if e.name == \"httpx\":\n                        raise ModuleNotFoundError(\n                            \"httpx is not installed. Either install httpx or provide a custom session\",\n                            name=e.name,\n                            path=e.path) from e\n                    else:\n                        raise\n        elif isinstance(session, str):\n            session = import_async_session(session)()\n\n        self.session = session\n\n        if open_file is None:\n            open_file = _default_open_file\n\n        self.open_file = open_file\n\n        self.token = token\n\n    async def __aenter__(self):\n        return self\n\n    async def __aexit__(self, *args, **kwargs) -> None:\n        await self.close()\n\n    async def close(self) -> None:\n        \"\"\"\n            Closes the session.\n            Do not call this method while there are other active threads using this object.\n\n            This method can also be called implicitly by using the `async with`\n            statement.\n        \"\"\"\n\n        await self.session.close()\n\n    async def _maybe_wait(\n        self,\n        request_class: Type[APIRequest],\n        /,\n        *args,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        **kwargs\n    ) -> Any:\n        request = request_class(self.session, *args, **kwargs)\n\n        if wait:\n            args_to_filter = (\n                \"permanently\", \"md5\", \"overwrite\", \"force_async\", \"fields\"\n            )\n\n            for arg in args_to_filter:\n                kwargs.pop(arg, None)\n\n            async def then(response: Optional[AsyncOperationLinkObject]) -> Optional[AsyncOperationLinkObject]:\n                if not isinstance(response, AsyncOperationLinkObject):\n                    return response\n\n                try:\n                    await response.wait(\n                        poll_interval=poll_interval,\n                        poll_timeout=poll_timeout,\n                        **kwargs\n                    )\n                except RetriableYaDiskError as e:\n                    # We want to trigger a full retry (including the operation iteslf)\n                    # only if the asynchronous operation failed\n                    if not isinstance(e, AsyncOperationFailedError):\n                        e.disable_retry = True\n                    else:\n                        settings.logger.info(\"asynchronous operation failed, attempting to restart it\")\n\n                    raise e from None\n\n                return response\n\n            return await request.asend(yadisk=self, then=then)\n        else:\n            return await request.asend(yadisk=self)\n\n    def get_auth_url(\n        self,\n        type:                  Union[Literal[\"code\"], Literal[\"token\"]],\n        device_id:             Optional[str] = None,\n        device_name:           Optional[str] = None,\n        redirect_uri:          Optional[str] = None,\n        login_hint:            Optional[str] = None,\n        scope:                 Optional[str] = None,\n        optional_scope:        Optional[str] = None,\n        force_confirm:         bool = True,\n        state:                 Optional[str] = None,\n        code_challenge:        Optional[str] = None,\n        code_challenge_method: Optional[Union[Literal[\"plain\"], Literal[\"S256\"]]] = None,\n        display:               None = None,\n    ) -> str:\n        \"\"\"\n            Get authentication URL for the user to go to.\n            This method doesn't send any HTTP requests and merely constructs the URL.\n\n            :param type: response type (\"code\" to get the confirmation code or \"token\" to get the token automatically)\n            :param device_id: unique device ID, must be between 6 and 50 characters\n            :param device_name: device name, should not be longer than 100 characters\n            :param redirect_uri: the URL to redirect the user to after they allow access to the app,\n                                 by default, the first redirect URI specified in the app settings\n                                 is used\n            :param display: doesn't do anything, kept for compatibility\n            :param login_hint: username or email for the account the token is being requested for\n            :param scope: `str`, list of permissions for the application\n            :param optional_scope: `str`, list of optional permissions for the application\n            :param force_confirm: if True, user will be required to confirm access to the account\n                                  even if the user has already granted access for the application\n            :param state: The state string, which Yandex.OAuth returns without any changes (<= 1024 characters)\n            :param code_challenge: string derived from the generated :code:`code_verifier` value\n                                   using one of the two possible transformations (plain or S256)\n            :param code_challenge_method: specifies what function was used to transform\n                                          the :code:`code_verifier` value to :code:`code_challenge`,\n                                          allowed values are :code:`\"plain\"` and :code:`\"S256\"` (recommended).\n                                          If :code:`\"S256\"` is used, :code:`code_challenge` must be produced\n                                          by hashing the :code:`code_verifier` value and encoding it to base64\n\n            :raises ValueError: invalid arguments were passed\n\n            :returns: authentication URL\n        \"\"\"\n\n        if type not in (\"code\", \"token\"):\n            raise ValueError(\"type must be either 'code' or 'token'\")\n\n        if code_challenge_method not in (None, \"plain\", \"S256\"):\n            raise ValueError(\"code_challenge_method must be either 'plain' or 'S256'\")\n\n        params = {\"response_type\": type,\n                  \"client_id\":     self.id,\n                  \"force_confirm\": \"yes\" if force_confirm else \"no\"}\n\n        if device_id is not None:\n            params[\"device_id\"] = device_id\n\n        if device_name is not None:\n            params[\"device_name\"] = device_name\n\n        if redirect_uri is not None:\n            params[\"redirect_uri\"] = redirect_uri\n\n        if login_hint is not None:\n            params[\"login_hint\"] = login_hint\n\n        if scope is not None:\n            params[\"scope\"] = \" \".join(scope)\n\n        if optional_scope is not None:\n            params[\"optional_scope\"] = \" \".join(optional_scope)\n\n        if state is not None:\n            params[\"state\"] = state\n\n        if code_challenge is not None:\n            params[\"code_challenge\"] = code_challenge\n\n        if code_challenge_method is not None:\n            params[\"code_challenge_method\"] = code_challenge_method\n\n        return \"https://oauth.yandex.ru/authorize?\" + urlencode(params)\n\n    def get_code_url(\n        self,\n        device_id:             Optional[str] = None,\n        device_name:           Optional[str] = None,\n        redirect_uri:          Optional[str] = None,\n        login_hint:            Optional[str] = None,\n        scope:                 Optional[str] = None,\n        optional_scope:        Optional[str] = None,\n        force_confirm:         bool = True,\n        state:                 Optional[str] = None,\n        code_challenge:        Optional[str] = None,\n        code_challenge_method: Optional[Union[Literal[\"plain\"], Literal[\"S256\"]]] = None,\n        display:               None = None\n    ) -> str:\n        \"\"\"\n            Get the URL for the user to get the confirmation code.\n            The confirmation code can later be used to get the token.\n            This method doesn't send any HTTP requests and merely constructs the URL.\n\n            :param device_id: unique device ID, must be between 6 and 50 characters\n            :param device_name: device name, should not be longer than 100 characters\n            :param redirect_uri: the URL to redirect the user to after they allow access to the app,\n                                 by default, the first redirect URI specified in the app settings\n                                 is used\n            :param display: doesn't do anything, kept for compatibility\n            :param login_hint: username or email for the account the token is being requested for\n            :param scope: `str`, list of permissions for the application\n            :param optional_scope: `str`, list of optional permissions for the application\n            :param force_confirm: if True, user will be required to confirm access to the account\n                                  even if the user has already granted access for the application\n            :param state: The state string, which Yandex.OAuth returns without any changes (<= 1024 characters)\n            :param code_challenge: string derived from the generated :code:`code_verifier` value\n                                   using one of the two possible transformations (plain or S256)\n            :param code_challenge_method: specifies what function was used to transform\n                                          the :code:`code_verifier` value to :code:`code_challenge`,\n                                          allowed values are :code:`\"plain\"` and :code:`\"S256\"` (recommended).\n                                          If :code:`\"S256\"` is used, :code:`code_challenge` must be produced\n                                          by hashing the :code:`code_verifier` value and encoding it to base64\n\n            :raises ValueError: invalid arguments were passed\n\n            :returns: authentication URL\n        \"\"\"\n\n        return self.get_auth_url(\n            \"code\",\n            device_id=device_id,\n            device_name=device_name,\n            redirect_uri=redirect_uri,\n            display=display,\n            login_hint=login_hint,\n            scope=scope,\n            optional_scope=optional_scope,\n            force_confirm=force_confirm,\n            state=state,\n            code_challenge=code_challenge,\n            code_challenge_method=code_challenge_method\n        )\n\n    async def get_device_code(self, **kwargs) -> \"DeviceCodeObject\":\n        \"\"\"\n            This request is used for authorization using the Yandex OAuth page.\n            In this case the user must enter the verification code (:code:`user_code`)\n            in the browser on the Yandex OAuth page.\n            After the user has entered the code on the OAuth page, the application\n            can exchange the :code:`device_code` for the token using the\n            :any:`AsyncClient.get_token_from_device_code()`.\n\n            :param device_id: unique device ID (between 6 and 50 characters)\n            :param device_name: device name, should not be longer than 100 characters\n            :param scope: `str`, list of permissions for the application\n            :param optional_scope: `str`, list of optional permissions for the application\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises InvalidClientError: invalid client ID or client secret\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`DeviceCodeObject` containing :code:`user_code` and :code:`device_code`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        return await GetDeviceCodeRequest(self.session, self.id, **kwargs).asend(yadisk=self)\n\n    async def get_token(self, code: str, /, **kwargs) -> \"TokenObject\":\n        \"\"\"\n            Get a new token.\n\n            :param code: confirmation code\n            :param device_id: unique device ID (between 6 and 50 characters)\n            :param code_verifier: `str`, verifier code, used with the PKCE authorization flow\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises BadVerificationCodeError: confirmation code has invalid format\n            :raises InvalidGrantError: invalid or expired confirmation code\n            :raises InvalidClientError: invalid client ID or client secret\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`TokenObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        return await GetTokenRequest(\n            self.session,\n            \"authorization_code\",\n            self.id,\n            code=code,\n            client_secret=self.secret,\n            **kwargs\n        ).asend(yadisk=self)\n\n    async def get_token_from_device_code(self, device_code: str, /, **kwargs) -> \"TokenObject\":\n        \"\"\"\n            Get a new token from a device code, previously obtained with :any:`AsyncClient.get_device_code()`.\n\n            :param device_code: device code, obtained from :any:`AsyncClient.get_device_code()`\n            :param device_id: unique device ID (between 6 and 50 characters)\n            :param device_name: device name, should not be longer than 100 characters\n            :param code_verifier: `str`, verifier code, used with the PKCE authorization flow\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises AuthorizationPendingError: user has not authorized the application yet\n            :raises BadVerificationCodeError: :code:`device_code` has invalid format\n            :raises InvalidGrantError: invalid or expired :code:`device_code`\n            :raises InvalidClientError: invalid client ID or client secret\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`TokenObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        return await GetTokenRequest(\n            self.session,\n            \"device_code\",\n            client_id=self.id,\n            code=device_code,\n            client_secret=self.secret,\n            **kwargs\n        ).asend(yadisk=self)\n\n    async def refresh_token(self, refresh_token: str, /, **kwargs) -> \"TokenObject\":\n        \"\"\"\n            Refresh an existing token.\n\n            :param refresh_token: the refresh token that was received with the token\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises InvalidGrantError: invalid or expired refresh token or it\n                                       doesn't belong to this application\n            :raises InvalidClientError: invalid client ID or client secret\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`TokenObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        return await RefreshTokenRequest(\n            self.session,\n            refresh_token,\n            self.id,\n            self.secret,\n            **kwargs\n        ).asend(yadisk=self)\n\n    async def revoke_token(\n        self,\n        token: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"TokenRevokeStatusObject\":\n        \"\"\"\n            Revoke the token.\n\n            :param token: token to revoke, equivalent to `self.token` if `None`\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises InvalidGrantError: specified token doesn't belong to this application\n            :raises InvalidClientError: invalid client ID or client secret\n            :raises UnsupportedTokenTypeError: token could not be revoked because\n                                               it doesn't have a :code:`device_id`\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`TokenRevokeStatusObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        if token is None:\n            token = self.token\n\n        return await RevokeTokenRequest(\n            self.session,\n            token,\n            self.id,\n            self.secret,\n            **kwargs\n        ).asend(yadisk=self)\n\n    async def get_disk_info(self, **kwargs) -> \"DiskInfoObject\":\n        \"\"\"\n            Get disk information.\n\n            :param extra_fields: list of additional keys to be included in the response\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/capacity>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk/GetDisk>`__\n\n            :returns: :any:`DiskInfoObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await DiskInfoRequest(self.session, **kwargs).asend(yadisk=self)\n\n    async def get_meta(self, path: str, /, **kwargs) -> \"AsyncResourceObject\":\n        \"\"\"\n            Get meta information about a file/directory.\n\n            :param path: path to the resource\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/meta>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetResource>`__\n\n            :returns: :any:`AsyncResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is for internal error handling\n        _then = kwargs.pop(\"_then\", None)\n\n        return await GetMetaRequest(self.session, path, **kwargs).asend(yadisk=self, then=_then)\n\n    async def exists(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` exists.\n\n            :param path: path to the resource\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        return await _exists(self.get_meta, path, **kwargs)\n\n    async def get_type(self, path: str, /, **kwargs) -> str:\n        \"\"\"\n            Get resource type.\n\n            :param path: path to the resource\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        return await _get_type(self.get_meta, path, **kwargs)\n\n    async def is_file(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` is a file.\n\n            :param path: path to the resource\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a file, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return (await self.get_type(path, **kwargs)) == \"file\"\n        except PathNotFoundError:\n            return False\n\n    async def is_dir(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` is a directory.\n\n            :param path: path to the resource\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return (await self.get_type(path, **kwargs)) == \"dir\"\n        except PathNotFoundError:\n            return False\n\n    async def listdir(\n        self,\n        path: str,\n        /,\n        **kwargs\n    ) -> AsyncGenerator[\"AsyncResourceObject\", None]:\n        \"\"\"\n            Get contents of `path`.\n\n            :param path: path to the directory\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: async generator of :any:`AsyncResourceObject`\n        \"\"\"\n\n        async for file in _listdir(self.get_meta, path, **kwargs):\n            yield file\n\n    async def get_upload_link(\n        self,\n        path: str,\n        /,\n        spoof_user_agent: bool = True,\n        **kwargs\n    ) -> str:\n        \"\"\"\n            Get a link to upload the file using the PUT request.\n\n            :param path: destination path\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/upload>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetResourceUploadLink>`__\n\n            :returns: `str`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is used to bypass Yandex.Disk's upload speed limit for some file types\n        if spoof_user_agent:\n            _add_spoof_user_agent_header(kwargs)\n\n        return (\n            await GetUploadLinkRequest(\n                self.session, path, fields=[\"href\"], **kwargs\n            ).asend(yadisk=self, then=_validate_link_response)\n        ).href\n\n    async def get_upload_link_object(\n        self,\n        path: str,\n        /,\n        spoof_user_agent: bool = True,\n        **kwargs\n    ) -> ResourceUploadLinkObject:\n        \"\"\"\n            Get a link to upload the file using the PUT request.\n            This is similar to :any:`AsyncClient.get_upload_link()`, except it returns\n            an instance of :any:`ResourceUploadLinkObject` which also contains\n            an asynchronous operation ID.\n\n            :param path: destination path\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param fields: list of keys to be included in the response\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: :any:`ResourceUploadLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is used to bypass Yandex.Disk's upload speed limit for some file types\n        if spoof_user_agent:\n            _add_spoof_user_agent_header(kwargs)\n\n        return await GetUploadLinkRequest(\n            self.session, path, **kwargs\n        ).asend(yadisk=self)\n\n    async def _upload(self,\n                      get_upload_link_function: Callable[..., Awaitable[str]],\n                      file_or_path: AsyncFileOrPath,\n                      dst_path: str, /, **kwargs) -> None:\n        timeout = kwargs.get(\"timeout\", ...)\n\n        if timeout is ...:\n            timeout = settings.DEFAULT_UPLOAD_TIMEOUT\n\n        retry_interval = kwargs.get(\"retry_interval\")\n\n        if retry_interval is None:\n            retry_interval = settings.DEFAULT_UPLOAD_RETRY_INTERVAL\n\n        n_retries = kwargs.get(\"n_retries\")\n\n        if n_retries is None:\n            n_retries = settings.DEFAULT_N_RETRIES\n\n        # Number of retries for getting the upload link.\n        # It is set to 0, unless the file is not seekable, in which case\n        # we have to use a different retry scheme\n        n_retries_for_upload_link = 0\n\n        kwargs[\"timeout\"] = timeout\n\n        # Make sure we don't get any inconsistent behavior with header names\n        kwargs[\"headers\"] = CaseInsensitiveDict(kwargs.get(\"headers\") or {})\n\n        file: Any = None\n        close_file = False\n        generator_factory: Optional[Callable[[], AsyncGenerator]] = None\n        file_position = 0\n\n        session = self.session\n\n        try:\n            if isinstance(file_or_path, (str, bytes)):\n                close_file = True\n                file = await self.open_file(file_or_path, \"rb\")\n            elif inspect.isasyncgenfunction(file_or_path):\n                generator_factory = file_or_path\n            else:\n                close_file = False\n                file = file_or_path\n\n            if generator_factory is None:\n                if await _is_file_seekable(file):\n                    file_position = await _file_tell(file)\n                else:\n                    n_retries, n_retries_for_upload_link = 0, n_retries\n\n            async def attempt() -> None:\n                temp_kwargs = dict(kwargs)\n                temp_kwargs[\"n_retries\"] = n_retries_for_upload_link\n                temp_kwargs[\"retry_interval\"] = 0.0\n\n                link = await get_upload_link_function(dst_path, **temp_kwargs)\n\n                # session.get() doesn't accept some of the passed parameters\n                _filter_request_kwargs(temp_kwargs)\n\n                # Disable keep-alive by default, since the upload server is random\n                temp_kwargs[\"headers\"].setdefault(\"Connection\", \"close\")\n\n                # This is generally not necessary, libraries like aiohttp\n                # will generally always set this header while others might not\n                # We're setting content-type here just to fix this inconsistency,\n                # this makes testing easier\n                temp_kwargs[\"headers\"].setdefault(\"Content-Type\", \"application/octet-stream\")\n\n                data: Any = None\n\n                if generator_factory is None:\n                    if await _is_file_seekable(file):\n                        await _file_seek(file, file_position)\n\n                    if is_async_func(file.read):\n                        data = read_in_chunks(file)\n                    else:\n                        data = read_in_chunks_sync(file)\n                else:\n                    data = generator_factory()\n\n                settings.logger.info(f\"uploading file to {dst_path} at {link}\")\n\n                async with await session.send_request(\"PUT\", link, data=data, **temp_kwargs) as response:\n                    if response.status != 201:\n                        raise await response.get_exception()\n\n            await auto_retry(attempt, n_retries, retry_interval)\n        finally:\n            if close_file and file is not None:\n                if is_async_func(file.close):\n                    await file.close()\n                else:\n                    file.close()\n\n    async def upload(\n        self,\n        path_or_file: AsyncFileOrPath,\n        dst_path: str,\n        /,\n        **kwargs\n    ) -> AsyncResourceLinkObject:\n        \"\"\"\n            Upload a file to disk.\n\n            :param path_or_file: path, file-like object or an async generator function to be uploaded\n            :param dst_path: destination path\n            :param overwrite: if `True`, the resource will be overwritten if it already exists,\n                              an error will be raised otherwise\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: :any:`AsyncResourceLinkObject`, link to the destination resource\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n\n        await self._upload(self.get_upload_link, path_or_file, dst_path, **kwargs)\n        return AsyncResourceLinkObject.from_path(dst_path, yadisk=self)\n\n    async def upload_by_link(self,\n                             file_or_path: AsyncFileOrPath,\n                             link: str, /, **kwargs) -> None:\n        \"\"\"\n            Upload a file to disk using an upload link.\n\n            :param file_or_path: path, file-like object or an async generator function to be uploaded\n            :param link: upload link\n            :param overwrite: if `True`, the resource will be overwritten if it already exists,\n                              an error will be raised otherwise\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n\n        async def get_link(*args, **kwargs) -> str:\n            return link\n\n        await self._upload(get_link, file_or_path, \"\", **kwargs)\n\n    async def get_download_link(self, path: str, /, **kwargs) -> str:\n        \"\"\"\n            Get a download link for a file (or a directory).\n\n            :param path: path to the resource\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/content>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetResourceDownloadLink>`__\n\n            :returns: `str`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return (\n            await GetDownloadLinkRequest(\n                self.session, path, fields=[\"href\"], **kwargs\n            ).asend(yadisk=self, then=_validate_link_response)\n        ).href\n\n    async def _download(\n        self,\n        get_download_link_function: Callable[..., Awaitable[str]],\n        src_path: str,\n        file_or_path: AsyncFileOrPathDestination,\n        /,\n        **kwargs\n    ) -> None:\n        n_retries = kwargs.get(\"n_retries\")\n\n        if n_retries is None:\n            n_retries = settings.DEFAULT_N_RETRIES\n\n        # Number of retries for getting the download link.\n        # It is set to 0, unless the file is not seekable, in which case\n        # we have to use a different retry scheme\n        n_retries_for_download_link = 0\n\n        retry_interval = kwargs.get(\"retry_interval\")\n\n        if retry_interval is None:\n            retry_interval = settings.DEFAULT_RETRY_INTERVAL\n\n        timeout = kwargs.get(\"timeout\", ...)\n\n        if timeout is ...:\n            timeout = settings.DEFAULT_TIMEOUT\n\n        kwargs[\"timeout\"] = timeout\n\n        file: Any = None\n        close_file = False\n        file_position = 0\n\n        session = self.session\n\n        try:\n            if isinstance(file_or_path, (str, bytes)):\n                close_file = True\n                file = await self.open_file(file_or_path, \"wb\")\n            else:\n                close_file = False\n                file = file_or_path\n\n            if await _is_file_seekable(file):\n                file_position = await _file_tell(file)\n            else:\n                n_retries, n_retries_for_download_link = 0, n_retries\n\n            async def attempt() -> None:\n                temp_kwargs = dict(kwargs)\n                temp_kwargs[\"n_retries\"] = n_retries_for_download_link\n                temp_kwargs[\"retry_interval\"] = 0.0\n                link = await get_download_link_function(src_path, **temp_kwargs)\n\n                # session.get() doesn't accept some of the passed parameters\n                _filter_request_kwargs(temp_kwargs)\n\n                temp_kwargs.setdefault(\"stream\", True)\n\n                if await _is_file_seekable(file):\n                    await _file_seek(file, file_position)\n\n                settings.logger.info(f\"downloading file {src_path} from {link}\")\n\n                async with await session.send_request(\"GET\", link, **temp_kwargs) as response:\n                    if response.status != 200:\n                        raise await response.get_exception()\n\n                    await response.download(file.write)\n\n            return await auto_retry(attempt, n_retries, retry_interval)\n        finally:\n            if close_file and file is not None:\n                if is_async_func(file.close):\n                    await file.close()\n                else:\n                    file.close()\n\n    async def download(\n        self,\n        src_path: str,\n        path_or_file: AsyncFileOrPathDestination,\n        /,\n        **kwargs\n    ) -> AsyncResourceLinkObject:\n        \"\"\"\n            Download the file.\n\n            :param src_path: source path\n            :param path_or_file: destination path or file-like object\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`AsyncResourceLinkObject`, link to the source resource\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n\n        await self._download(self.get_download_link, src_path, path_or_file, **kwargs)\n        return AsyncResourceLinkObject.from_path(src_path, yadisk=self)\n\n    async def download_by_link(\n        self,\n        link: str,\n        file_or_path: AsyncFileOrPathDestination,\n        /,\n        **kwargs\n    ) -> None:\n        \"\"\"\n            Download the file from the link.\n\n            :param link: download link\n            :param file_or_path: destination path or file-like object\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n\n        async def get_link(*args, **kwargs) -> str:\n            return link\n\n        await self._download(get_link, \"\", file_or_path, **kwargs)\n\n    async def remove(\n        self,\n        path: str,\n        /,\n        **kwargs\n    ) -> Optional[AsyncOperationLinkObject]:\n        \"\"\"\n            Remove the resource.\n\n            :param path: path to the resource to be removed\n            :param permanently: if `True`, the resource will be removed permanently,\n                                otherwise, it will be just moved to the trash\n            :param md5: `str`, MD5 hash of the file to remove\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises BadRequestError: MD5 check is only available for files\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/delete>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/DeleteResource>`__\n\n            :returns: :any:`AsyncOperationLinkObject` if the operation is performed asynchronously, `None` otherwise\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await self._maybe_wait(DeleteRequest, path, **kwargs)\n\n    async def mkdir(self, path: str, /, **kwargs) -> AsyncResourceLinkObject:\n        \"\"\"\n            Create a new directory.\n\n            :param path: path to the directory to be created\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises DirectoryExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot create directory due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/create-folder>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/CreateResource>`__\n\n            :returns: :any:`AsyncResourceLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await MkdirRequest(self.session, path, **kwargs).asend(yadisk=self)\n\n    async def makedirs(self, path: str, /, **kwargs) -> AsyncResourceLinkObject:\n        \"\"\"\n            Create a new directory at `path`. If its parent directory doesn't\n            exist it will also be created recursively.\n\n            :param path: path to the directory to be created\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises DirectoryExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot create directory due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`AsyncResourceLinkObject`\n        \"\"\"\n\n        while True:\n            try:\n                return await self.mkdir(path, **kwargs)\n            except ParentNotFoundError as e:\n                # We first have to remove the scheme, otherwise posixpath.split()\n                # may treat it as part of the path\n                scheme, path_without_scheme = remove_path_scheme(path)\n\n                # Extract the parent directory\n                head, _tail = posixpath.split(path_without_scheme)\n                head = head.strip(\"/\")\n\n                if head == \"\":\n                    # We should never find ourselves in this situation\n                    raise e from None\n\n                # Restore the scheme\n                if scheme:\n                    head = f\"{scheme}:/{head}\"\n\n                await self.makedirs(head, **kwargs)\n\n    async def check_token(self, token: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the token is valid.\n\n            :param token: token to check, equivalent to `self.token` if `None`\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :returns: `bool`\n        \"\"\"\n\n        # Any ID will do, doesn't matter whether it exists or not\n        fake_operation_id = \"0000\"\n\n        if token is None:\n            token = self.token\n\n        if not token:\n            return False\n\n        _set_authorization_header(kwargs, token)\n\n        try:\n            # get_operation_status() doesn't require any permissions, unlike most other requests\n            await self.get_operation_status(fake_operation_id, **kwargs)\n            return True\n        except OperationNotFoundError:\n            return True\n        except UnauthorizedError:\n            return False\n\n    async def get_trash_meta(self, path: str, /, **kwargs) -> \"AsyncTrashResourceObject\":\n        \"\"\"\n            Get meta information about a trash resource.\n\n            :param path: path to the trash resource\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/meta>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47trash47resources/GetTrashResource>`__\n\n            :returns: :any:`AsyncTrashResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is for internal error handling\n        _then = kwargs.pop(\"_then\", None)\n\n        return await GetTrashRequest(\n            self.session, path, **kwargs\n        ).asend(yadisk=self, then=_then)\n\n    async def trash_exists(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the trash resource at `path` exists.\n\n            :param path: path to the trash resource\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        return await _exists(self.get_trash_meta, path, **kwargs)\n\n    async def copy(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        \"\"\"\n            Copy `src_path` to `dst_path`.\n            If the operation is performed asynchronously, returns the link to the operation,\n            otherwise, returns the link to the newly created resource.\n\n            :param src_path: source path\n            :param dst_path: destination path\n            :param overwrite: if `True` the destination path can be overwritten,\n                              otherwise, an error will be raised\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises InsufficientStorageError: cannot complete request due to lack of storage space\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/copy>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/CopyResource>`__\n\n            :returns: :any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await self._maybe_wait(CopyRequest, src_path, dst_path, **kwargs)\n\n    async def restore_trash(\n        self,\n        path: str,\n        dst_path: Optional[str] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        \"\"\"\n            Restore a trash resource.\n            Returns a link to the newly created resource or a link to the asynchronous operation.\n\n            :param path: path to the trash resource to restore\n            :param dst_path: destination path\n            :param overwrite: `bool`, determines whether the destination can be overwritten\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/trash-restore>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47trash47resources/RestoreFromTrash>`__\n\n            :returns: :any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await self._maybe_wait(\n            RestoreTrashRequest, path, dst_path=dst_path, **kwargs\n        )\n\n    async def move(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        **kwargs\n    ) -> Union[AsyncOperationLinkObject, AsyncResourceLinkObject]:\n        \"\"\"\n            Move `src_path` to `dst_path`.\n\n            :param src_path: source path to be moved\n            :param dst_path: destination path\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/move>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/MoveResource>`__\n\n            :returns: :any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await self._maybe_wait(MoveRequest, src_path, dst_path, **kwargs)\n\n    async def rename(\n        self,\n        src_path: str,\n        new_name: str,\n        /,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        \"\"\"\n            Rename `src_path` to have filename `new_name`.\n            Does the same as `move()` but changes only the filename.\n\n            :param src_path: source path to be moved\n            :param new_name: target filename to rename to\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises ValueError: `new_name` is not a valid filename or `src_path` is root\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\n        \"\"\"\n\n        new_name = new_name.rstrip(\"/\")\n\n        if \"/\" in new_name or new_name in (\".\", \"..\", \"\"):\n            raise ValueError(f\"Invalid filename: {new_name}\")\n\n        # Remove scheme first, otherwise PurePosixPath will treat it as part of the path\n        scheme, src_path_without_scheme = remove_path_scheme(src_path)\n        sanitized_src_path = PurePosixPath(src_path_without_scheme.strip(\"/\"))\n\n        if len(sanitized_src_path.parts) == 0:\n            raise ValueError(\"Cannot rename root\")\n\n        dst_path = str(sanitized_src_path.parent / new_name)\n\n        # Restore scheme back\n        if scheme:\n            dst_path = f\"{scheme}:/{dst_path}\"\n\n        return await self.move(src_path, dst_path, **kwargs)\n\n    async def remove_trash(\n        self,\n        path: str,\n        /,\n        **kwargs\n    ) -> Optional[AsyncOperationLinkObject]:\n        \"\"\"\n            Remove a trash resource.\n\n            :param path: path to the trash resource to be deleted\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/trash-delete>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47trash47resources/ClearTrash>`__\n\n            :returns: :any:`AsyncOperationLinkObject` if the operation is performed asynchronously, `None` otherwise\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await self._maybe_wait(DeleteTrashRequest, path, **kwargs)\n\n    async def publish(self, path: str, /, **kwargs) -> AsyncResourceLinkObject:\n        \"\"\"\n            Make a resource public.\n\n            :param path: path to the resource to be published\n            :param allow_address_access: `bool`, specifies the request format, i.e.\n                with personal access settings (when set to `True`) or without\n            :param public_settings: :any:`PublicSettings` or `None`, public access settings for the resource\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/publish>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/PublishResource>`__\n\n            :returns: :any:`AsyncResourceLinkObject`, link to the resource\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await PublishRequest(self.session, path, **kwargs).asend(yadisk=self)\n\n    async def unpublish(self, path: str, /, **kwargs) -> AsyncResourceLinkObject:\n        \"\"\"\n            Make a public resource private.\n\n            :param path: path to the resource to be unpublished\n            :param allow_address_access: `bool`, specifies the request format, i.e.\n                with personal access settings (when set to `True`) or without\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/publish#unpublish-q>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/UnpublishResource>`__\n\n            :returns: :any:`AsyncResourceLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await UnpublishRequest(self.session, path, **kwargs).asend(yadisk=self)\n\n    async def get_public_settings(self, path: str, /, **kwargs) -> PublicSettingsObject:\n        \"\"\"\n            Get public settings of a resource.\n\n            :param path: path to the resource\n            :param allow_address_access: `bool`, specifies the request format, i.e.\n                with personal access settings (when set to `True`) or without\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.ru/dev/disk-api/doc/ru/reference/public-settings-get>`__\n\n            :returns: :any:`PublicSettingsObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await GetPublicSettingsRequest(self.session, path, **kwargs).asend(yadisk=self)\n\n    async def get_public_available_settings(self, path: str, /, **kwargs) -> PublicAvailableSettingsObject:\n        \"\"\"\n            Get public settings of a shared resource for the current OAuth token owner.\n\n            :param path: path to the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.ru/dev/disk-api/doc/ru/reference/public-settings-get-available>`__\n\n            :returns: :any:`PublicAvailableSettingsObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await GetPublicAvailableSettingsRequest(self.session, path, **kwargs).asend(yadisk=self)\n\n    async def update_public_settings(self, path: str, public_settings: PublicSettings, /, **kwargs) -> None:\n        \"\"\"\n            Update public settings of a shared resource.\n\n            :param path: path to the resource\n            :param public_settings: :any:`PublicSettings`, public access settings for the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.ru/dev/disk-api/doc/ru/reference/public-settings-change>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/UpdatePublicSettings>`__\n\n            :returns: `None`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await UpdatePublicSettingsRequest(self.session, path, public_settings, **kwargs).asend(yadisk=self)\n\n    async def save_to_disk(\n        self,\n        public_key: str,\n        /,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, \"AsyncOperationLinkObject\"]:\n        \"\"\"\n            Saves a public resource to the disk.\n            Returns the link to the operation if it's performed asynchronously,\n            or a link to the resource otherwise.\n\n            :param public_key: public key or public URL of the resource\n            :param name: filename of the saved resource\n            :param path: path to the copied resource in the public folder\n            :param save_path: path to the destination directory (downloads directory by default)\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/public#save>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/SaveToDiskPublicResource>`__\n\n            :returns: :any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await self._maybe_wait(SaveToDiskRequest, public_key, **kwargs)\n\n    async def get_public_meta(self, public_key: str, /, **kwargs) -> \"AsyncPublicResourceObject\":\n        \"\"\"\n            Get meta-information about a public resource.\n\n            :param public_key: public key or public URL of the resource\n            :param path: relative path to a resource in a public folder.\n                         By specifying the key of the published folder in `public_key`,\n                         you can request metainformation for any resource in the folder.\n            :param offset: offset from the beginning of the list of nested resources\n            :param limit: maximum number of nested elements to be included in the list\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param preview_size: file preview size\n            :param preview_crop: `bool`, allow preview crop\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/public>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/GetPublicResource>`__\n\n            :returns: :any:`AsyncPublicResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is for internal error handling\n        _then = kwargs.pop(\"_then\", None)\n\n        return await GetPublicMetaRequest(\n            self.session, public_key, **kwargs\n        ).asend(yadisk=self, then=_then)\n\n    async def public_exists(self, public_key: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the public resource exists.\n\n            :param public_key: public key or public URL of the resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        return await _exists(self.get_public_meta, public_key, **kwargs)\n\n    async def public_listdir(\n        self,\n        public_key: str,\n        /,\n        **kwargs\n    ) -> AsyncGenerator[\"AsyncPublicResourceObject\", None]:\n        \"\"\"\n            Get contents of a public directory.\n\n            :param public_key: public key or public URL of the resource\n            :param path: relative path to the resource in the public folder.\n                         By specifying the key of the published folder in `public_key`,\n                         you can request contents of any nested folder.\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: async generator of :any:`AsyncPublicResourceObject`\n        \"\"\"\n\n        async for file in _listdir(self.get_public_meta, public_key, **kwargs):\n            yield file\n\n    async def get_public_type(self, public_key: str, /, **kwargs) -> str:\n        \"\"\"\n            Get public resource type.\n\n            :param public_key: public key or public URL of the resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        return await _get_type(self.get_public_meta, public_key, **kwargs)\n\n    async def is_public_dir(self, public_key: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `public_key` is a public directory.\n\n            :param public_key: public key or public URL of the resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `public_key` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return (await self.get_public_type(public_key, **kwargs)) == \"dir\"\n        except PathNotFoundError:\n            return False\n\n    async def is_public_file(self, public_key: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `public_key` is a public file.\n\n            :param public_key: public key or public URL of the resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `public_key` is a file, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return (await self.get_public_type(public_key, **kwargs)) == \"file\"\n        except PathNotFoundError:\n            return False\n\n    async def trash_listdir(\n        self,\n        path: str,\n        /,\n        **kwargs\n    ) -> AsyncGenerator[\"AsyncTrashResourceObject\", None]:\n        \"\"\"\n            Get contents of a trash resource.\n\n            :param path: path to the directory in the trash bin\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: async generator of :any:`AsyncTrashResourceObject`\n        \"\"\"\n\n        async for file in _listdir(self.get_trash_meta, path, **kwargs):\n            yield file\n\n    async def get_trash_type(self, path: str, /, **kwargs) -> str:\n        \"\"\"\n            Get trash resource type.\n\n            :param path: path to the trash resource\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        return await _get_type(self.get_trash_meta, path, **kwargs)\n\n    async def is_trash_dir(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` is a trash directory.\n\n            :param path: path to the trash resource\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return (await self.get_trash_type(path, **kwargs)) == \"dir\"\n        except PathNotFoundError:\n            return False\n\n    async def is_trash_file(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` is a trash file.\n\n            :param path: path to the trash resource\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return (await self.get_trash_type(path, **kwargs)) == \"file\"\n        except PathNotFoundError:\n            return False\n\n    async def get_public_resources(self, **kwargs) -> \"AsyncPublicResourcesListObject\":\n        \"\"\"\n            Get a list of public resources.\n\n            :param offset: offset from the beginning of the list\n            :param limit: maximum number of elements in the list\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param type: filter based on type of resources (\"file\" or \"dir\")\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/recent-public>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/ListPublicResources>`__\n\n            :returns: :any:`AsyncPublicResourcesListObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await GetPublicResourcesRequest(self.session, **kwargs).asend(yadisk=self)\n\n    async def get_all_public_resources(\n        self,\n        *,\n        max_items: Optional[int] = None,\n        **kwargs\n    ) -> AsyncGenerator[AsyncPublicResourceObject, None]:\n        \"\"\"\n            Get a list of all public resources.\n\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param offset: offset from the beginning of the list\n            :param limit: maximum number of elements in the list\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param type: filter based on type of resources (\"file\" or \"dir\")\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/recent-public>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/ListPublicResources>`__\n\n            :returns: async generator of :any:`AsyncPublicResourceObject`\n        \"\"\"\n\n        if kwargs.get(\"offset\") is None:\n            kwargs[\"offset\"] = 0\n\n        if kwargs.get(\"limit\") is None:\n            kwargs[\"limit\"] = 100\n\n        remaining_items = max_items\n\n        while True:\n            # Do not query more items than necessary\n            if remaining_items is not None:\n                kwargs[\"limit\"] = min(remaining_items, kwargs[\"limit\"])\n\n            files = (await self.get_public_resources(**kwargs)).items or []\n            file_count = len(files)\n\n            for i in files[:remaining_items]:\n                yield i\n\n            if remaining_items is not None:\n                remaining_items -= file_count\n\n                if remaining_items <= 0:\n                    break\n\n            if file_count < kwargs[\"limit\"]:\n                break\n\n            kwargs[\"offset\"] += kwargs[\"limit\"]\n\n    async def patch(self, path: str, properties: dict, /, **kwargs) -> \"AsyncResourceObject\":\n        \"\"\"\n            Update custom properties of a resource.\n\n            :param path: path to the resource\n            :param properties: `dict`, custom properties to update\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/meta-add>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/UpdateResource>`__\n\n            :returns: :any:`AsyncResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await PatchRequest(self.session, path, properties, **kwargs).asend(yadisk=self)\n\n    async def _get_files_some(self, **kwargs) -> List[\"AsyncResourceObject\"]:\n        def validate_response(response: \"AsyncFilesResourceListObject\") -> \"AsyncFilesResourceListObject\":\n            if response.items is None:\n                raise InvalidResponseError(\"Response did not contain key field\")\n\n            return response\n\n        items: List[\"AsyncResourceObject\"] = (\n            await FilesRequest(\n                self.session, **kwargs\n            ).asend(yadisk=self, then=validate_response)\n        ).items\n\n        return items\n\n    async def get_files(\n        self,\n        *,\n        max_items: Optional[int] = None,\n        **kwargs\n    ) -> AsyncGenerator[\"AsyncResourceObject\", None]:\n        \"\"\"\n            Get a flat list of all files (that doesn't include directories).\n\n            :param offset: offset from the beginning of the list\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of list elements to be included in each response\n            :param media_type: type of files to include in the list\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/all-files>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetFlatFilesList>`__\n\n            :returns: async generator of :any:`AsyncResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        if kwargs.get(\"offset\") is None:\n            kwargs[\"offset\"] = 0\n\n        if kwargs.get(\"limit\") is None:\n            kwargs[\"limit\"] = 200\n\n        remaining_items = max_items\n\n        while True:\n            # Do not query more items than necessary\n            if remaining_items is not None:\n                kwargs[\"limit\"] = min(remaining_items, kwargs[\"limit\"])\n\n            files = await self._get_files_some(**kwargs)\n            file_count = len(files)\n\n            for file in files[:remaining_items]:\n                yield file\n\n            if remaining_items is not None:\n                remaining_items -= file_count\n\n                if remaining_items <= 0:\n                    break\n\n            if file_count < kwargs[\"limit\"]:\n                break\n\n            kwargs[\"offset\"] += kwargs[\"limit\"]\n\n    async def get_last_uploaded(self, **kwargs) -> List[\"AsyncResourceObject\"]:\n        \"\"\"\n            Get the list of latest uploaded files sorted by upload date.\n\n            :param limit: maximum number of elements in the list\n            :param media_type: type of files to include in the list\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/recent-upload>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetLastUploadedFilesList>`__\n\n            :returns: async generator of :any:`AsyncResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        def validate_response(\n            response: \"AsyncLastUploadedResourceListObject\"\n        ) -> \"AsyncLastUploadedResourceListObject\":\n            if response.items is None:\n                raise InvalidResponseError(\"Response did not contain key field\")\n\n            return response\n\n        items: List[\"AsyncResourceObject\"] = (\n            await LastUploadedRequest(\n                self.session, **kwargs\n            ).asend(yadisk=self, then=validate_response)\n        ).items\n\n        return items\n\n    async def upload_url(\n        self,\n        url: str,\n        path: str,\n        /,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        \"\"\"\n            Upload a file from URL.\n\n            :param url: source URL\n            :param path: destination path\n            :param disable_redirects: `bool`, forbid redirects\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/upload-ext>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/UploadExternalResource>`__\n\n            :returns: :any:`AsyncOperationLinkObject`, link to the asynchronous operation\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return await self._maybe_wait(UploadURLRequest, url, path, **kwargs)\n\n    async def get_public_download_link(self, public_key: str, /, **kwargs) -> str:\n        \"\"\"\n            Get a download link for a public resource.\n\n            :param public_key: public key or public URL of the resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/public#download-request>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/GetPublicResourceDownloadLink>`__\n\n            :returns: `str`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return (\n            await GetPublicDownloadLinkRequest(\n                self.session, public_key, fields=[\"href\"], **kwargs\n            ).asend(yadisk=self, then=_validate_link_response)\n        ).href\n\n    async def download_public(\n        self,\n        public_key: str,\n        file_or_path: AsyncFileOrPathDestination,\n        /,\n        **kwargs\n    ) -> AsyncPublicResourceLinkObject:\n        \"\"\"\n            Download the public resource.\n\n            :param public_key: public key or public URL of the resource\n            :param file_or_path: destination path or file-like object\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`AsyncPublicResourceLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n\n        await self._download(\n            lambda public_key, **kwargs: self.get_public_download_link(public_key, **kwargs),\n            public_key, file_or_path, **kwargs)\n        return AsyncPublicResourceLinkObject.from_public_key(public_key, yadisk=self)\n\n    async def get_operation_status(self, operation_id: str, /, **kwargs) -> OperationStatus:\n        \"\"\"\n            Get operation status.\n\n            :param operation_id: ID of the operation or a link\n            :param timeout: `float`, `tuple` or `None`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises OperationNotFoundError: requested operation was not found\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/operations>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47operations47123operation95id125/GetOperationStatus/>`__\n\n            :returns: `str`, :code:`\"in-progress\"` indicates that the operation\n                      is currently running, :code:`\"success\"` indicates that\n                      the operation was successful, :code:`\"failed\"` means that\n                      the operation failed\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return (\n            await GetOperationStatusRequest(\n                self.session, operation_id, fields=[\"status\"], **kwargs\n            ).asend(yadisk=self)\n        ).status\n\n    async def wait_for_operation(\n        self,\n        operation_id: str,\n        /,\n        *,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        **kwargs\n    ) -> None:\n        \"\"\"\n            Wait until an operation is completed. If the operation fails, an\n            exception is raised. Waiting is performed by calling :any:`asyncio.sleep`.\n\n            :param operation_id: ID of the operation or a link\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n        \"\"\"\n\n        async def poll() -> None:\n            while (status := await self.get_operation_status(operation_id, **kwargs)) == \"in-progress\":\n                await asyncio.sleep(poll_interval)\n\n            if status != \"success\":\n                raise AsyncOperationFailedError(\"Asynchronous operation failed\")\n\n        try:\n            await asyncio.wait_for(poll(), timeout=poll_timeout)\n        except asyncio.exceptions.TimeoutError as e:\n            raise AsyncOperationPollingTimeoutError(\"Asynchronous operation did not complete in specified time\") from e\n"
  },
  {
    "path": "src/yadisk/_async_client.pyi",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import Optional, Any, Union, Literal, overload\nfrom ._typing_compat import Dict, AsyncGenerator, Iterable, List, Tuple, Type\n\nfrom .objects import (\n    DeviceCodeObject, TokenObject, TokenRevokeStatusObject,\n    DiskInfoObject, AsyncResourceObject, AsyncResourceLinkObject,\n    AsyncOperationLinkObject, AsyncTrashResourceObject, AsyncPublicResourceObject,\n    AsyncPublicResourcesListObject, AsyncPublicResourceLinkObject,\n    ResourceUploadLinkObject, PublicAvailableSettingsObject, PublicSettingsObject\n)\n\nfrom .types import (\n    AsyncFileOrPath, AsyncFileOrPathDestination, Headers, OperationStatus, AsyncSession,\n    AsyncSessionName, AsyncSessionFactory, AsyncOpenFileCallback, TimeoutParameter,\n    PublicSettings\n)\n\n__all__ = [\"AsyncClient\"]\n\n\nclass AsyncClient:\n    id: str\n    secret: str\n    token: str\n    default_args: Dict[str, Any]\n    session: AsyncSession\n    open_file: AsyncOpenFileCallback\n\n    synchronous = False\n\n    def __init__(\n        self,\n        id:     str = \"\",\n        secret: str = \"\",\n        token:  str = \"\",\n        *,\n        default_args:    Optional[Dict[str, Any]] = None,\n        session:         Optional[Union[AsyncSession, AsyncSessionName]] = None,\n        open_file:       Optional[AsyncOpenFileCallback] = None,\n        session_factory: Optional[AsyncSessionFactory] = None\n    ) -> None:\n        ...\n\n    async def __aenter__(self): ...\n    async def __aexit__(self, *args, **kwargs) -> None: ...\n    async def close(self) -> None: ...\n\n    def get_auth_url(\n        self,\n        type:                  Union[Literal[\"code\"], Literal[\"token\"]],\n        device_id:             Optional[str] = None,\n        device_name:           Optional[str] = None,\n        redirect_uri:          Optional[str] = None,\n        login_hint:            Optional[str] = None,\n        scope:                 Optional[str] = None,\n        optional_scope:        Optional[str] = None,\n        force_confirm:         bool = True,\n        state:                 Optional[str] = None,\n        code_challenge:        Optional[str] = None,\n        code_challenge_method: Optional[Union[Literal[\"plain\"], Literal[\"S256\"]]] = None,\n        display:               None = None\n    ) -> str:\n        ...\n\n    def get_code_url(\n        self,\n        device_id:             Optional[str] = None,\n        device_name:           Optional[str] = None,\n        redirect_uri:          Optional[str] = None,\n        login_hint:            Optional[str] = None,\n        scope:                 Optional[str] = None,\n        optional_scope:        Optional[str] = None,\n        force_confirm:         bool = True,\n        state:                 Optional[str] = None,\n        code_challenge:        Optional[str] = None,\n        code_challenge_method: Optional[Union[Literal[\"plain\"], Literal[\"S256\"]]] = None,\n        display:               None = None\n    ) -> str: ...\n\n    async def get_device_code(\n        self,\n        *,\n        device_id: Optional[str] = None,\n        device_name: Optional[str] = None,\n        scope: Optional[str] = None,\n        optional_scope: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> DeviceCodeObject: ...\n\n    async def get_token(\n        self,\n        code: str,\n        /,\n        *,\n        device_id: Optional[str] = None,\n        device_name: Optional[str] = None,\n        code_verifier: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> TokenObject:\n        ...\n\n    async def get_token_from_device_code(\n        self,\n        device_code: str,\n        /,\n        *,\n        device_id: Optional[str] = None,\n        device_name: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> TokenObject:\n        ...\n\n    async def refresh_token(\n        self,\n        refresh_token: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> TokenObject:\n        ...\n\n    async def revoke_token(\n        self,\n        token: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> TokenRevokeStatusObject:\n        ...\n\n    async def check_token(\n        self,\n        token: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def get_disk_info(\n        self,\n        *,\n        extra_fields: Optional[Iterable[str]] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> DiskInfoObject:\n        ...\n\n    async def get_meta(\n        self,\n        path: str,\n        /,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncResourceObject:\n        ...\n\n    async def exists(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def get_type(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    async def is_file(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def is_dir(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def listdir(\n        self,\n        path: str,\n        /,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncGenerator[AsyncResourceObject, None]:\n        # This line here is needed so that the type checker knows that this is\n        # an async generator, rather than a simple async function\n        yield AsyncResourceObject()\n\n    async def get_upload_link(\n        self,\n        path: str,\n        /,\n        *,\n        overwrite: bool = False,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    async def get_upload_link_object(\n        self,\n        path: str,\n        /,\n        *,\n        overwrite: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> ResourceUploadLinkObject:\n        ...\n\n    async def upload(\n        self,\n        file_or_path: AsyncFileOrPath,\n        dst_path: str,\n        /,\n        *,\n        overwrite: bool = False,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncResourceLinkObject:\n        ...\n\n    async def upload_by_link(\n        self,\n        file_or_path: AsyncFileOrPath,\n        link: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n\n    async def get_download_link(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    async def download(\n        self,\n        src_path: str,\n        file_or_path: AsyncFileOrPathDestination,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncResourceLinkObject:\n        ...\n\n    async def download_by_link(\n        self,\n        link: str,\n        file_or_path: AsyncFileOrPathDestination,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n\n    @overload\n    async def remove(\n        self,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        md5: Optional[str] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def remove(\n        self,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        md5: Optional[str] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Optional[AsyncOperationLinkObject]:\n        ...\n\n    async def mkdir(\n        self,\n        path: str,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncResourceLinkObject:\n        ...\n\n    async def makedirs(\n        self,\n        path: str,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncResourceLinkObject:\n        ...\n\n    async def get_trash_meta(\n        self,\n        path: str,\n        /,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncTrashResourceObject:\n        ...\n\n    async def trash_exists(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    @overload\n    async def copy(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def copy(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def restore_trash(\n        self,\n        path: str,\n        /,\n        dst_path: Optional[str] = None,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def restore_trash(\n        self,\n        path: str,\n        /,\n        dst_path: Optional[str] = None,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def move(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def move(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def rename(\n        self,\n        src_path: str,\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def rename(\n        self,\n        src_path: str,\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def remove_trash(\n        self,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def remove_trash(\n        self,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Optional[AsyncOperationLinkObject]:\n        ...\n\n    async def publish(\n        self,\n        path: str,\n        /,\n        *,\n        allow_address_access: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncResourceLinkObject:\n        ...\n\n    async def unpublish(\n        self,\n        path: str,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncResourceLinkObject:\n        ...\n\n    async def get_public_settings(\n        self,\n        path: str,\n        /,\n        allow_address_access: bool = False,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> PublicSettingsObject:\n        ...\n\n    async def get_public_available_settings(\n        self,\n        path: str,\n        /,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> PublicAvailableSettingsObject:\n        ...\n\n    async def update_public_settings(\n        self,\n        path: str,\n        public_settings: PublicSettings,\n        /,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n\n    @overload\n    async def save_to_disk(\n        self,\n        public_key: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        name: Optional[str] = None,\n        path: Optional[str] = None,\n        save_path: Optional[str] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def save_to_disk(\n        self,\n        public_key: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        name: Optional[str] = None,\n        path: Optional[str] = None,\n        save_path: Optional[str] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    async def get_public_meta(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncPublicResourceObject:\n        ...\n\n    async def public_exists(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def public_listdir(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncGenerator[AsyncPublicResourceObject, None]:\n        # This line here is needed so that the type checker knows that this is\n        # an async generator, rather than a simple async function\n        yield AsyncPublicResourceObject()\n\n    async def get_public_type(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    async def is_public_dir(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def is_public_file(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def trash_listdir(\n        self,\n        path: str,\n        /,\n        *,\n        limit: Optional[int] = None,\n        max_items: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncGenerator[AsyncTrashResourceObject, None]:\n        # This line here is needed so that the type checker knows that this is\n        # an async generator, rather than a simple async function\n        yield AsyncTrashResourceObject()\n\n    async def get_trash_type(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    async def is_trash_dir(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def is_trash_file(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def get_public_resources(\n        self,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        type: Optional[Union[Literal[\"file\"], Literal[\"dir\"]]] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncPublicResourcesListObject:\n        ...\n\n    async def get_all_public_resources(\n        self,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        type: Optional[Union[Literal[\"file\"], Literal[\"dir\"]]] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncGenerator[AsyncPublicResourceObject, None]:\n        yield AsyncPublicResourceObject()\n\n    async def patch(\n        self,\n        path: str,\n        properties: dict,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncResourceObject:\n        ...\n\n    async def get_files(\n        self,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        media_type: Optional[Union[str, Iterable[str]]] = None,\n        sort: Optional[str] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncGenerator[AsyncResourceObject, None]:\n        # This line here is needed so that the type checker knows that this is\n        # an async generator, rather than a simple async function\n        yield AsyncResourceObject()\n\n    async def get_last_uploaded(\n        self,\n        *,\n        limit: Optional[int] = None,\n        media_type: Optional[Union[str, Iterable[str]]] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> List[AsyncResourceObject]: ...\n\n    async def upload_url(\n        self,\n        url: str,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        disable_redirects: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    async def get_public_download_link(\n        self,\n        public_key: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    async def download_public(\n        self,\n        public_key: str,\n        file_or_path: AsyncFileOrPathDestination,\n        /,\n        *,\n        path: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncPublicResourceLinkObject:\n        ...\n\n    async def get_operation_status(\n        self,\n        operation_id: str,\n        /,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> OperationStatus:\n        ...\n\n    async def wait_for_operation(\n        self,\n        operation_id: str,\n        /,\n        *,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n"
  },
  {
    "path": "src/yadisk/_async_session.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import TYPE_CHECKING, Any, Optional, TypeVar\nfrom ._typing_compat import Dict\nfrom .types import (\n    AsyncConsumeCallback, JSON, HTTPMethod, AsyncPayload, Headers, TimeoutParameter\n)\nfrom .objects import ErrorObject\nfrom .utils import get_exception\n\nif TYPE_CHECKING:  # pragma: no cover\n    from .exceptions import YaDiskError\n\n__all__ = [\"AsyncResponse\", \"AsyncSession\"]\n\n\nclass AsyncResponse:\n    \"\"\"\n        Represents an HTTP response.\n\n        In case an error occurs, methods of this class should throw one of exceptions\n        derived from :any:`YaDiskError`.\n\n        :ivar status: `int`, HTTP status code\n    \"\"\"\n\n    _Self = TypeVar(\"_Self\", bound=\"AsyncResponse\")\n\n    status: int\n\n    def __init__(self) -> None:\n        \"\"\"Constructs an :any:`AsyncResponse` object.\"\"\"\n\n        self.status = 0\n\n    async def json(self) -> JSON:\n        \"\"\"\n            Returns JSON-content of the response (parses JSON).\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n\n            :raises RequestError: could not receive the response's body\n            :raises ValueError: could not parse JSON\n\n            :returns: `dict`, `list`, `str`, `int`, `float` or `None`\n        \"\"\"\n        raise NotImplementedError\n\n    async def download(self, consume_callback: AsyncConsumeCallback) -> None:\n        \"\"\"\n            Downloads response's content.\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n\n            :param consume_callback: regular or async function, takes one\n                                     parameter - chunk of data (bytes),\n                                     consumes the chunk (e.g. by writing to a file)\n\n            :raises RequestError: could not receive the response's body\n        \"\"\"\n        raise NotImplementedError\n\n    async def get_exception(self) -> \"YaDiskError\":\n        \"\"\"\n            Convenience wrapper for :any:`yadisk.utils.get_exception`.\n\n            :returns: :any:`YaDiskError`\n        \"\"\"\n\n        try:\n            js = await self.json()\n        except ValueError:\n            js = None\n\n        error = ErrorObject(js)\n\n        return get_exception(self, error)\n\n    async def close(self) -> None:\n        \"\"\"\n            Closes the response and releases the underlying connection into the pool.\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n        \"\"\"\n        raise NotImplementedError\n\n    async def __aenter__(self: _Self) -> _Self:\n        return self\n\n    async def __aexit__(self, *args, **kwargs) -> None:\n        \"\"\"Closes the response and releases the underlying connection into the pool\"\"\"\n\n        await self.close()\n\n\nclass AsyncSession:\n    \"\"\"\n        HTTP session class. Maintains open connections, stores headers and\n        some other request parameters.\n\n        Must be explicitly closed (can be done using the `with` statement).\n    \"\"\"\n\n    _Self = TypeVar(\"_Self\", bound=\"AsyncSession\")\n\n    async def send_request(self,\n                           method: HTTPMethod,\n                           url: str,\n                           *,\n                           params:  Optional[Dict[str, Any]] = None,\n                           data:    Optional[AsyncPayload] = None,\n                           timeout: TimeoutParameter = ...,\n                           headers: Optional[Headers] = None,\n                           stream:  bool = False,\n                           **kwargs) -> AsyncResponse:\n        \"\"\"\n            Sends an HTTP request with given parameters.\n            In case an error occurs, the method should throw one of exceptions\n            derived from :any:`YaDiskError`.\n            Additional keyword arguments may be passed, they may be forwarded\n            to the underlying HTTP client without modification.\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n\n            :param method: `str`, HTTP method\n            :param url: `str`, URL\n            :param params: `dict`, GET parameters\n            :param data: `bytes`, iterator (possibly async) or a file-like object (possible async),\n                         data to be sent in the request body\n            :param headers: `dict`, additional headers to be set\n            :param timeout: request timeout, a `tuple` of `(read timeout, connect timeout)`,\n                            `float` or `None` (no timeout)\n            :param stream: `bool`, if `False`, the response content will be immediately downloaded\n\n            :returns: :any:`Response`, response object\n        \"\"\"\n        raise NotImplementedError\n\n    async def close(self) -> None:\n        \"\"\"\n            Closes the session.\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n        \"\"\"\n        raise NotImplementedError\n\n    async def __aenter__(self: _Self) -> _Self:\n        return self\n\n    async def __aexit__(self, *args, **kwargs) -> None:\n        \"\"\"Closes the session.\"\"\"\n        return await self.close()\n"
  },
  {
    "path": "src/yadisk/_client.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2025 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom pathlib import PurePosixPath\nimport posixpath\nimport time\nfrom urllib.parse import urlencode\n\nfrom ._api import *\n\nfrom .exceptions import (\n    AsyncOperationFailedError, AsyncOperationPollingTimeoutError, ParentNotFoundError,\n    PathNotFoundError, RetriableYaDiskError, UnauthorizedError,\n    OperationNotFoundError, InvalidResponseError, WrongResourceTypeError\n)\n\nfrom .utils import auto_retry, CaseInsensitiveDict\nfrom .objects import (\n    SyncResourceLinkObject, SyncPublicResourceLinkObject,\n    SyncTrashResourceObject, SyncFilesResourceListObject, SyncResourceObject,\n    SyncLastUploadedResourceListObject, SyncOperationLinkObject,\n    SyncPublicResourceObject, SyncPublicResourcesListObject, DiskInfoObject,\n    TokenObject, TokenRevokeStatusObject, DeviceCodeObject, ResourceUploadLinkObject,\n    PublicSettingsObject, PublicAvailableSettingsObject\n)\n\nfrom ._session import Session\nfrom ._import_session import import_session\n\nfrom . import settings\n\nfrom typing import Any, Optional, Union, Literal\nfrom ._typing_compat import Callable, Generator, Dict, List, Type\nfrom .types import (\n    OpenFileCallback, FileOrPath, FileOrPathDestination, OperationStatus, PublicSettings,\n    SessionFactory, SessionName\n)\n\nfrom ._client_common import (\n    _add_spoof_user_agent_header, _apply_default_args, _filter_request_kwargs,\n    _read_file_as_generator, _set_authorization_header,\n    _add_authorization_header, _validate_listdir_response,\n    _validate_link_response, _validate_get_type_response\n)\n\nfrom ._common import remove_path_scheme\n\n__all__ = [\"Client\"]\n\nResourceType = Union[\n    \"SyncResourceObject\",\n    \"SyncPublicResourceObject\",\n    \"SyncTrashResourceObject\"\n]\n\n\ndef _exists(\n    get_meta_function: Callable[..., ResourceType],\n    /,\n    *args,\n    **kwargs\n) -> bool:\n    try:\n        # We want to query the bare minimum number of fields, that's what\n        # the fields parameter is for\n        get_meta_function(*args, fields=[\"type\"], **kwargs)\n\n        return True\n    except PathNotFoundError:\n        return False\n\n\ndef _get_type(\n    get_meta_function: Callable[..., ResourceType],\n    /,\n    *args,\n    **kwargs\n) -> str:\n    return get_meta_function(\n        *args,\n        _then=_validate_get_type_response,\n        fields=[\"type\"],\n        **kwargs\n    ).type  # type: ignore[return-value]\n\n\ndef _listdir(\n    get_meta_function: Callable[..., ResourceType],\n    path: str,\n    /,\n    *,\n    max_items: Optional[int] = None,\n    **kwargs\n) -> Generator[Any, None, None]:\n    if kwargs.get(\"limit\") is None:\n        kwargs[\"limit\"] = 500\n\n    if kwargs.get(\"fields\") is None:\n        kwargs[\"fields\"] = []\n\n    kwargs[\"fields\"] = [\"embedded.items.%s\" % (k,) for k in kwargs[\"fields\"]]\n\n    # Fields that are absolutely necessary\n    NECESSARY_FIELDS = [\"type\",\n                        \"embedded\",\n                        \"embedded.offset\",\n                        \"embedded.limit\",\n                        \"embedded.total\",\n                        \"embedded.items\"]\n\n    kwargs[\"fields\"].extend(NECESSARY_FIELDS)\n\n    remaining_items = max_items\n\n    if remaining_items is not None:\n        # Do not query more items than necessary\n        kwargs[\"limit\"] = min(remaining_items, kwargs[\"limit\"])\n\n    result = get_meta_function(path, _then=_validate_listdir_response, **kwargs)\n\n    if result.type == \"file\":\n        raise WrongResourceTypeError(\"%r is a file\" % (path,))\n\n    yield from result.embedded.items[:remaining_items]  # type: ignore[union-attr,index]\n\n    limit: int = result.embedded.limit  # type: ignore[assignment,union-attr]\n    offset: int = result.embedded.offset  # type: ignore[assignment,union-attr]\n    total: int = result.embedded.total  # type: ignore[assignment,union-attr]\n\n    while offset + limit < total:\n        if remaining_items is not None:\n            remaining_items -= len(result.embedded.items)  # type: ignore[union-attr,arg-type]\n\n            if remaining_items <= 0:\n                break\n\n            # Do not query more items than necessary\n            kwargs[\"limit\"] = min(remaining_items, kwargs[\"limit\"])\n        else:\n            remaining_items = None\n\n        offset += limit\n        kwargs[\"offset\"] = offset\n        result = get_meta_function(path, _then=_validate_listdir_response, **kwargs)\n\n        if result.type == \"file\":\n            raise WrongResourceTypeError(\"%r is a file\" % (path,))\n\n        yield from result.embedded.items[:remaining_items]  # type: ignore[union-attr,index]\n\n        limit = result.embedded.limit  # type: ignore[assignment,union-attr]\n        total = result.embedded.total  # type: ignore[assignment,union-attr]\n\n\nclass Client:\n    \"\"\"\n        Implements access to Yandex.Disk REST API (provides synchronous API).\n\n        HTTP client implementation can be specified using the :code:`session`\n        parameter. :any:`RequestsSession` is used by default. For other options,\n        see :doc:`/api_reference/sessions`.\n\n        Almost all methods of :any:`Client` (the ones that accept `**kwargs`)\n        accept some additional arguments:\n\n        * **n_retries** - `int`, maximum number of retries for a request\n        * **retry_interval** - `float`, delay between retries (in seconds)\n        * **headers** - `dict` or `None`, additional request headers\n        * **timeout** - `tuple` (:code:`(<connect timeout>, <read timeout>)`) or\n          `float` (specifies both connect and read timeout), request timeout\n          (in seconds)\n\n        Additional parameters, specific to a given HTTP client library can also\n        be passed, see documentation for specific :any:`Session` subclasses\n        (:doc:`/api_reference/sessions`).\n\n        :param id: application ID\n        :param secret: application secret password\n        :param token: application token\n        :param default_args: `dict` or `None`, default arguments for methods.\n                             Can be used to set the default timeout, headers, etc.\n        :param session: `None`, `str` or an instance of :any:`Session`.\n                        If :code:`session` is a string, the appropriate session\n                        class will be imported, it must be one of the\n                        following values:\n\n                          * :code:`\"httpx\"` - :any:`HTTPXSession`\n                          * :code:`\"pycurl\"` - :any:`PycURLSession`\n                          * :code:`\"requests\"` - :any:`RequestsSession`\n\n        :param open_file: `None` or a function that opens a file for reading or\n                          writing (:code:`open()` by default)\n        :param session_factory: kept for compatibility, callable that returns an\n                                instance of :any:`Session`\n\n        :ivar id: `str`, application ID\n        :ivar secret: `str`, application secret password\n        :ivar token: `str`, application token\n        :ivar default_args: `dict`, default arguments for methods. Can be used to\n                            set the default timeout, headers, etc.\n        :ivar session: current session (:any:`Session` instance)\n        :ivar open_file: function that opens a file for reading or writing\n                         (:code:`open()` by default)\n\n        The following exceptions may be raised by most API requests:\n\n        :raises RequestError: HTTP client raised an exception while making a request\n        :raises BadRequestError: server returned HTTP code 400\n        :raises FieldValidationError: request contains fields with invalid data\n        :raises UnauthorizedError: server returned HTTP code 401\n        :raises ForbiddenError: server returned HTTP code 403\n        :raises NotAcceptableError: server returned HTTP code 406\n        :raises ConflictError: server returned HTTP code 409\n        :raises PayloadTooLargeError: server returned code 413\n        :raises UnsupportedMediaError: server returned HTTP code 415\n        :raises LockedError: server returned HTTP code 423\n        :raises TooManyRequestsError: server returned HTTP code 429\n        :raises InternalServerError: server returned HTTP code 500\n        :raises BadGatewayError: server returned HTTP code 502\n        :raises UnavailableError: server returned HTTP code 503\n        :raises GatewayTimeoutError: server returned HTTP code 504\n        :raises InsufficientStorageError: server returned HTTP code 509\n        :raises UnknownYaDiskError: other unknown error\n    \"\"\"\n\n    id: str\n    secret: str\n    token: str\n    default_args: Dict[str, Any]\n    session: Session\n    open_file: OpenFileCallback\n\n    synchronous = True\n\n    def __init__(self,\n                 id:     str = \"\",\n                 secret: str = \"\",\n                 token:  str = \"\",\n                 *,\n                 default_args:    Optional[Dict[str, Any]] = None,\n                 session:         Optional[Union[Session, SessionName]] = None,\n                 open_file:       Optional[OpenFileCallback] = None,\n                 session_factory: Optional[SessionFactory] = None) -> None:\n        self.id = id\n        self.secret = secret\n        self.token = \"\"\n\n        self.default_args = {} if default_args is None else default_args\n\n        if open_file is None:\n            open_file = open\n\n        self.open_file = open_file\n\n        if session is None:\n            if session_factory is not None:\n                session = session_factory()\n            else:\n                try:\n                    session = import_session(\"requests\")()\n                except ModuleNotFoundError as e:\n                    if e.name == \"requests\":\n                        raise ModuleNotFoundError(\n                            \"requests is not installed. Either install requests or provide a custom session\",\n                            name=e.name,\n                            path=e.path) from e\n                    else:\n                        raise\n        elif isinstance(session, str):\n            session = import_session(session)()\n\n        self.session = session\n        self.token = token\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, *args, **kwargs) -> None:\n        self.close()\n\n    def close(self) -> None:\n        \"\"\"\n            Closes the session.\n            Do not call this method while there are other active threads using this object.\n\n            This method can also be called implicitly by using the `with`\n            statement.\n        \"\"\"\n\n        self.session.close()\n\n    def _maybe_wait(\n        self,\n        request_class: Type[APIRequest],\n        /,\n        *args,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        **kwargs\n    ) -> Any:\n        request = request_class(self.session, *args, **kwargs)\n\n        if wait:\n            args_to_filter = (\n                \"permanently\", \"md5\", \"overwrite\", \"force_async\", \"fields\"\n            )\n\n            for arg in args_to_filter:\n                kwargs.pop(arg, None)\n\n            def then(response: Optional[SyncOperationLinkObject]) -> Optional[SyncOperationLinkObject]:\n                if not isinstance(response, SyncOperationLinkObject):\n                    return response\n\n                try:\n                    response.wait(\n                        poll_interval=poll_interval,\n                        poll_timeout=poll_timeout,\n                        **kwargs\n                    )\n                except RetriableYaDiskError as e:\n                    # We want to trigger a full retry (including the operation iteslf)\n                    # only if the asynchronous operation failed\n                    if not isinstance(e, AsyncOperationFailedError):\n                        e.disable_retry = True\n                    else:\n                        settings.logger.info(\"asynchronous operation failed, attempting to restart it\")\n\n                    raise e from None\n\n                return response\n\n            return request.send(yadisk=self, then=then)\n        else:\n            return request.send(yadisk=self)\n\n    def get_auth_url(\n        self,\n        type:                  Union[Literal[\"code\"], Literal[\"token\"]],\n        device_id:             Optional[str] = None,\n        device_name:           Optional[str] = None,\n        redirect_uri:          Optional[str] = None,\n        login_hint:            Optional[str] = None,\n        scope:                 Optional[str] = None,\n        optional_scope:        Optional[str] = None,\n        force_confirm:         bool = True,\n        state:                 Optional[str] = None,\n        code_challenge:        Optional[str] = None,\n        code_challenge_method: Optional[Union[Literal[\"plain\"], Literal[\"S256\"]]] = None,\n        display:               None = None\n    ) -> str:\n        \"\"\"\n            Get authentication URL for the user to go to.\n            This method doesn't send any HTTP requests and merely constructs the URL.\n\n            :param type: response type (\"code\" to get the confirmation code or \"token\" to get the token automatically)\n            :param device_id: unique device ID, must be between 6 and 50 characters\n            :param device_name: device name, should not be longer than 100 characters\n            :param redirect_uri: the URL to redirect the user to after they allow access to the app,\n                                 by default, the first redirect URI specified in the app settings\n                                 is used\n            :param display: doesn't do anything, kept for compatibility\n            :param login_hint: username or email for the account the token is being requested for\n            :param scope: `str`, list of permissions for the application\n            :param optional_scope: `str`, list of optional permissions for the application\n            :param force_confirm: if True, user will be required to confirm access to the account\n                                  even if the user has already granted access for the application\n            :param state: The state string, which Yandex.OAuth returns without any changes (<= 1024 characters)\n            :param code_challenge: string derived from the generated :code:`code_verifier` value\n                                   using one of the two possible transformations (plain or S256)\n            :param code_challenge_method: specifies what function was used to transform\n                                          the :code:`code_verifier` value to :code:`code_challenge`,\n                                          allowed values are :code:`\"plain\"` and :code:`\"S256\"` (recommended).\n                                          If :code:`\"S256\"` is used, :code:`code_challenge` must be produced\n                                          by hashing the :code:`code_verifier` value and encoding it to base64\n\n            :raises ValueError: invalid arguments were passed\n\n            :returns: authentication URL\n        \"\"\"\n\n        if type not in (\"code\", \"token\"):\n            raise ValueError(\"type must be either 'code' or 'token'\")\n\n        if code_challenge_method not in (None, \"plain\", \"S256\"):\n            raise ValueError(\"code_challenge_method must be either 'plain' or 'S256'\")\n\n        params = {\"response_type\": type,\n                  \"client_id\":     self.id,\n                  \"force_confirm\": \"yes\" if force_confirm else \"no\"}\n\n        if device_id is not None:\n            params[\"device_id\"] = device_id\n\n        if device_name is not None:\n            params[\"device_name\"] = device_name\n\n        if redirect_uri is not None:\n            params[\"redirect_uri\"] = redirect_uri\n\n        if login_hint is not None:\n            params[\"login_hint\"] = login_hint\n\n        if scope is not None:\n            params[\"scope\"] = \" \".join(scope)\n\n        if optional_scope is not None:\n            params[\"optional_scope\"] = \" \".join(optional_scope)\n\n        if state is not None:\n            params[\"state\"] = state\n\n        if code_challenge is not None:\n            params[\"code_challenge\"] = code_challenge\n\n        if code_challenge_method is not None:\n            params[\"code_challenge_method\"] = code_challenge_method\n\n        return \"https://oauth.yandex.ru/authorize?\" + urlencode(params)\n\n    def get_code_url(\n        self,\n        device_id:             Optional[str] = None,\n        device_name:           Optional[str] = None,\n        redirect_uri:          Optional[str] = None,\n        login_hint:            Optional[str] = None,\n        scope:                 Optional[str] = None,\n        optional_scope:        Optional[str] = None,\n        force_confirm:         bool = True,\n        state:                 Optional[str] = None,\n        code_challenge:        Optional[str] = None,\n        code_challenge_method: Optional[Union[Literal[\"plain\"], Literal[\"S256\"]]] = None,\n        display:               None = None\n    ) -> str:\n        \"\"\"\n            Get the URL for the user to get the confirmation code.\n            The confirmation code can later be used to get the token.\n            This method doesn't send any HTTP requests and merely constructs the URL.\n\n            :param device_id: unique device ID, must be between 6 and 50 characters\n            :param device_name: device name, should not be longer than 100 characters\n            :param redirect_uri: the URL to redirect the user to after they allow access to the app,\n                                 by default, the first redirect URI specified in the app settings\n                                 is used\n            :param display: doesn't do anything, kept for compatibility\n            :param login_hint: username or email for the account the token is being requested for\n            :param scope: `str`, list of permissions for the application\n            :param optional_scope: `str`, list of optional permissions for the application\n            :param force_confirm: if True, user will be required to confirm access to the account\n                                  even if the user has already granted access for the application\n            :param state: The state string, which Yandex.OAuth returns without any changes (<= 1024 characters)\n            :param code_challenge: string derived from the generated :code:`code_verifier` value\n                                   using one of the two possible transformations (plain or S256)\n            :param code_challenge_method: specifies what function was used to transform\n                                          the :code:`code_verifier` value to :code:`code_challenge`,\n                                          allowed values are :code:`\"plain\"` and :code:`\"S256\"` (recommended).\n                                          If :code:`\"S256\"` is used, :code:`code_challenge` must be produced\n                                          by hashing the :code:`code_verifier` value and encoding it to base64\n\n            :raises ValueError: invalid arguments were passed\n\n            :returns: authentication URL\n        \"\"\"\n\n        return self.get_auth_url(\n            \"code\",\n            device_id=device_id,\n            device_name=device_name,\n            redirect_uri=redirect_uri,\n            display=display,\n            login_hint=login_hint,\n            scope=scope,\n            optional_scope=optional_scope,\n            force_confirm=force_confirm,\n            state=state,\n            code_challenge=code_challenge,\n            code_challenge_method=code_challenge_method\n        )\n\n    def get_device_code(self, **kwargs) -> \"DeviceCodeObject\":\n        \"\"\"\n            This request is used for authorization using the Yandex OAuth page.\n            In this case the user must enter the verification code (:code:`user_code`)\n            in the browser on the Yandex OAuth page.\n            After the user has entered the code on the OAuth page, the application\n            can exchange the :code:`device_code` for the token using the :any:`Client.get_token_from_device_code()`.\n\n            :param device_id: unique device ID (between 6 and 50 characters)\n            :param device_name: device name, should not be longer than 100 characters\n            :param scope: `str`, list of permissions for the application\n            :param optional_scope: `str`, list of optional permissions for the application\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises InvalidClientError: invalid client ID\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`DeviceCodeObject` containing :code:`user_code` and :code:`device_code`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        return GetDeviceCodeRequest(self.session, self.id, **kwargs).send(yadisk=self)\n\n    def get_token(self, code: str, /, **kwargs) -> \"TokenObject\":\n        \"\"\"\n            Get a new token.\n\n            :param code: confirmation code\n            :param device_id: unique device ID (between 6 and 50 characters)\n            :param device_name: device name, should not be longer than 100 characters\n            :param code_verifier: `str`, verifier code, used with the PKCE authorization flow\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises BadVerificationCodeError: confirmation code has invalid format\n            :raises InvalidGrantError: invalid or expired confirmation code\n            :raises InvalidClientError: invalid client ID or client secret\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`TokenObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        return GetTokenRequest(\n            self.session,\n            \"authorization_code\",\n            client_id=self.id,\n            code=code,\n            client_secret=self.secret,\n            **kwargs\n        ).send(yadisk=self)\n\n    def get_token_from_device_code(self, device_code: str, /, **kwargs) -> \"TokenObject\":\n        \"\"\"\n            Get a new token from a device code, previously obtained with :any:`Client.get_device_code()`.\n\n            :param device_code: device code, obtained from :any:`Client.get_device_code()`\n            :param device_id: unique device ID (between 6 and 50 characters)\n            :param device_name: device name, should not be longer than 100 characters\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises AuthorizationPendingError: user has not authorized the application yet\n            :raises BadVerificationCodeError: :code:`device_code` has invalid format\n            :raises InvalidGrantError: invalid or expired :code:`device_code`\n            :raises InvalidClientError: invalid client ID or client secret\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`TokenObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        return GetTokenRequest(\n            self.session,\n            \"device_code\",\n            client_id=self.id,\n            code=device_code,\n            client_secret=self.secret,\n            **kwargs\n        ).send(yadisk=self)\n\n    def refresh_token(self, refresh_token: str, /, **kwargs) -> \"TokenObject\":\n        \"\"\"\n            Refresh an existing token.\n\n            :param refresh_token: the refresh token that was received with the token\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises InvalidGrantError: invalid or expired refresh token or it\n                                       doesn't belong to this application\n            :raises InvalidClientError: invalid client ID or client secret\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`TokenObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        return RefreshTokenRequest(\n            self.session,\n            refresh_token,\n            self.id,\n            self.secret,\n            **kwargs\n        ).send(yadisk=self)\n\n    def revoke_token(\n        self,\n        token: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"TokenRevokeStatusObject\":\n        \"\"\"\n            Revoke the token.\n\n            :param token: token to revoke\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises InvalidGrantError: specified token doesn't belong to this application\n            :raises InvalidClientError: invalid client ID or client secret\n            :raises UnsupportedTokenTypeError: token could not be revoked because\n                                               it doesn't have a :code:`device_id`\n            :raises BadRequestError: invalid request parameters\n\n            :returns: :any:`TokenRevokeStatusObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _set_authorization_header(kwargs, \"\")\n\n        if token is None:\n            token = self.token\n\n        return RevokeTokenRequest(\n            self.session, token, self.id, self.secret, **kwargs\n        ).send(yadisk=self)\n\n    def check_token(self, token: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the token is valid.\n\n            :param token: token to check, equivalent to `self.token` if `None`\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :returns: `bool`\n        \"\"\"\n\n        # Any ID will do, doesn't matter whether it exists or not\n        fake_operation_id = \"0000\"\n\n        if token is None:\n            token = self.token\n\n        if not token:\n            return False\n\n        _set_authorization_header(kwargs, token)\n\n        try:\n            # get_operation_status() doesn't require any permissions, unlike most other requests\n            self.get_operation_status(fake_operation_id, **kwargs)\n            return True\n        except OperationNotFoundError:\n            return True\n        except UnauthorizedError:\n            return False\n\n    def get_disk_info(self, **kwargs) -> \"DiskInfoObject\":\n        \"\"\"\n            Get disk information.\n\n            :param extra_fields: list of additional keys to be included in the response\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/capacity>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk/GetDisk>`__\n\n            :returns: :any:`DiskInfoObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return DiskInfoRequest(self.session, **kwargs).send(yadisk=self)\n\n    def get_meta(self, path: str, /, **kwargs) -> \"SyncResourceObject\":\n        \"\"\"\n            Get meta information about a file/directory.\n\n            :param path: path to the resource\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/meta>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetResource>`__\n\n            :returns: :any:`SyncResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is for internal error handling\n        _then = kwargs.pop(\"_then\", None)\n\n        return GetMetaRequest(self.session, path, **kwargs).send(yadisk=self, then=_then)\n\n    def exists(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` exists.\n\n            :param path: path to the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        return _exists(self.get_meta, path, **kwargs)\n\n    def get_type(self, path: str, /, **kwargs) -> str:\n        \"\"\"\n            Get resource type.\n\n            :param path: path to the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        return _get_type(self.get_meta, path, **kwargs)\n\n    def is_file(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` is a file.\n\n            :param path: path to the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a file, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return self.get_type(path, **kwargs) == \"file\"\n        except PathNotFoundError:\n            return False\n\n    def is_dir(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` is a directory.\n\n            :param path: path to the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return self.get_type(path, **kwargs) == \"dir\"\n        except PathNotFoundError:\n            return False\n\n    def listdir(self, path: str, /, **kwargs) -> Generator[\"SyncResourceObject\", None, None]:\n        \"\"\"\n            Get contents of `path`.\n\n            :param path: path to the directory\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: generator of :any:`ResourceObject`\n        \"\"\"\n\n        return _listdir(self.get_meta, path, **kwargs)\n\n    def get_upload_link(\n        self,\n        path: str,\n        /,\n        spoof_user_agent: bool = True,\n        **kwargs\n    ) -> str:\n        \"\"\"\n            Get a link to upload the file using the PUT request.\n\n            :param path: destination path\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/upload>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetResourceUploadLink>`__\n\n            :returns: `str`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is used to bypass Yandex.Disk's upload speed limit for some file types\n        if spoof_user_agent:\n            _add_spoof_user_agent_header(kwargs)\n\n        return GetUploadLinkRequest(\n            self.session, path, fields=[\"href\"], **kwargs\n        ).send(yadisk=self, then=_validate_link_response).href\n\n    def get_upload_link_object(\n        self,\n        path: str,\n        /,\n        spoof_user_agent: bool = True,\n        **kwargs\n    ) -> ResourceUploadLinkObject:\n        \"\"\"\n            Get a link to upload the file using the PUT request.\n            This is similar to :any:`Client.get_upload_link()`, except it returns\n            an instance of :any:`ResourceUploadLinkObject` which also contains\n            an asynchronous operation ID.\n\n            :param path: destination path\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param fields: list of keys to be included in the response\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: :any:`ResourceUploadLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is used to bypass Yandex.Disk's upload speed limit for some file types\n        if spoof_user_agent:\n            _add_spoof_user_agent_header(kwargs)\n\n        return GetUploadLinkRequest(\n            self.session, path, **kwargs\n        ).send(yadisk=self)\n\n    def _upload(self,\n                get_upload_link_function: Callable,\n                file_or_path: FileOrPath,\n                dst_path: str, /, **kwargs) -> None:\n        timeout = kwargs.get(\"timeout\", ...)\n\n        if timeout is ...:\n            timeout = settings.DEFAULT_UPLOAD_TIMEOUT\n\n        retry_interval = kwargs.get(\"retry_interval\")\n\n        if retry_interval is None:\n            retry_interval = settings.DEFAULT_UPLOAD_RETRY_INTERVAL\n\n        n_retries = kwargs.get(\"n_retries\")\n\n        if n_retries is None:\n            n_retries = settings.DEFAULT_N_RETRIES\n\n        # Number of retries for getting the upload link.\n        # It is set to 0, unless the file is not seekable, in which case\n        # we have to use a different retry scheme\n        n_retries_for_upload_link = 0\n\n        kwargs[\"timeout\"] = timeout\n\n        # Make sure we don't get any inconsistent behavior with header names\n        kwargs[\"headers\"] = CaseInsensitiveDict(kwargs.get(\"headers\") or {})\n\n        file: Any = None\n        close_file = False\n        file_position = 0\n        iterator_factory = None\n\n        session = self.session\n\n        try:\n            if isinstance(file_or_path, (str, bytes)):\n                close_file = True\n                file = self.open_file(file_or_path, \"rb\")\n            elif callable(file_or_path):\n                close_file = False\n                iterator_factory = file_or_path\n            else:\n                close_file = False\n                file = file_or_path\n\n            if file is not None and file.seekable():\n                file_position = file.tell()\n            elif iterator_factory is None:\n                n_retries, n_retries_for_upload_link = 0, n_retries\n\n            def attempt() -> None:\n                temp_kwargs = dict(kwargs)\n                temp_kwargs[\"n_retries\"] = n_retries_for_upload_link\n                temp_kwargs[\"retry_interval\"] = 0.0\n\n                link = get_upload_link_function(dst_path, **temp_kwargs)\n\n                # session.put() doesn't accept some of the passed parameters\n                _filter_request_kwargs(temp_kwargs)\n\n                temp_kwargs.setdefault(\"stream\", True)\n\n                # Disable keep-alive by default, since the upload server is random\n                temp_kwargs[\"headers\"].setdefault(\"Connection\", \"close\")\n\n                # This is generally not necessary, libraries like aiohttp\n                # will generally always set this header while others might not\n                # We're setting content-type here just to fix this inconsistency,\n                # this makes testing easier\n                temp_kwargs[\"headers\"].setdefault(\"Content-Type\", \"application/octet-stream\")\n\n                if iterator_factory is not None:\n                    payload = iterator_factory()\n                elif file.seekable():\n                    file.seek(file_position)\n                    payload = file\n                else:\n                    # requests will try to seek the file to determine the payload size\n                    # regardless of whether it is seekable() or not.\n                    # To bypass this problem we pass the file as a generator instead.\n                    payload = _read_file_as_generator(file)\n\n                settings.logger.info(f\"uploading file to {dst_path} at {link}\")\n\n                with session.send_request(\"PUT\", link, data=payload, **temp_kwargs) as response:\n                    if response.status != 201:\n                        raise response.get_exception()\n\n            auto_retry(attempt, n_retries, retry_interval)\n        finally:\n            if close_file and file is not None:\n                file.close()\n\n    def upload(\n        self,\n        file_or_path: FileOrPath,\n        dst_path: str,\n        /,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        \"\"\"\n            Upload a file to disk.\n\n            :param file_or_path: path, file-like object to be uploaded or\n                                 a function that returns an iterator (or generator)\n            :param dst_path: destination path\n            :param overwrite: if `True`, the resource will be overwritten if it already exists,\n                              an error will be raised otherwise\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: :any:`SyncResourceLinkObject`, link to the destination resource\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n\n        self._upload(self.get_upload_link, file_or_path, dst_path, **kwargs)\n\n        return SyncResourceLinkObject.from_path(dst_path, yadisk=self)\n\n    def upload_by_link(self,\n                       file_or_path: FileOrPath,\n                       link: str, /, **kwargs) -> None:\n        \"\"\"\n            Upload a file to disk using an upload link.\n\n            :param file_or_path: path, file-like object to be uploaded or\n                                 a function that returns an iterator (or generator)\n            :param link: upload link\n            :param overwrite: if `True`, the resource will be overwritten if it already exists,\n                              an error will be raised otherwise\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n\n        self._upload(lambda *args, **kwargs: link, file_or_path, \"\", **kwargs)\n\n    def get_download_link(self, path: str, /, **kwargs) -> str:\n        \"\"\"\n            Get a download link for a file (or a directory).\n\n            :param path: path to the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/content>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetResourceDownloadLink>`__\n\n            :returns: `str`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return GetDownloadLinkRequest(\n            self.session, path, fields=[\"href\"], **kwargs\n        ).send(yadisk=self, then=_validate_link_response).href\n\n    def _download(\n        self,\n        get_download_link_function: Callable,\n        src_path: str,\n        file_or_path: FileOrPathDestination,\n        /,\n        **kwargs\n    ) -> None:\n        n_retries = kwargs.get(\"n_retries\")\n\n        if n_retries is None:\n            n_retries = settings.DEFAULT_N_RETRIES\n\n        # Number of retries for getting the download link.\n        # It is set to 0, unless the file is not seekable, in which case\n        # we have to use a different retry scheme\n        n_retries_for_download_link = 0\n\n        retry_interval = kwargs.get(\"retry_interval\")\n\n        if retry_interval is None:\n            retry_interval = settings.DEFAULT_RETRY_INTERVAL\n\n        timeout = kwargs.get(\"timeout\", ...)\n\n        if timeout is ...:\n            timeout = settings.DEFAULT_TIMEOUT\n\n        kwargs[\"timeout\"] = timeout\n\n        file: Any = None\n        close_file = False\n        file_position = 0\n\n        session = self.session\n\n        try:\n            if isinstance(file_or_path, (str, bytes)):\n                close_file = True\n                file = self.open_file(file_or_path, \"wb\")\n            else:\n                close_file = False\n                file = file_or_path\n\n            if file.seekable():\n                file_position = file.tell()\n            else:\n                n_retries, n_retries_for_download_link = 0, n_retries\n\n            def attempt() -> None:\n                temp_kwargs = dict(kwargs)\n                temp_kwargs[\"n_retries\"] = n_retries_for_download_link\n                temp_kwargs[\"retry_interval\"] = 0.0\n                link = get_download_link_function(src_path, **temp_kwargs)\n\n                # session.get() doesn't accept some of the passed parameters\n                _filter_request_kwargs(temp_kwargs)\n\n                temp_kwargs.setdefault(\"stream\", True)\n\n                if file.seekable():\n                    file.seek(file_position)\n\n                settings.logger.info(f\"downloading file {src_path} from {link}\")\n\n                with session.send_request(\"GET\", link, **temp_kwargs) as response:\n                    # pycurl can't get status until the response is actually read\n                    # in that case, status will be set to 0\n                    if response.status == 0:\n                        def consume(chunk: bytes) -> None:\n                            if response.status not in (0, 200):\n                                return\n\n                            file.write(chunk)\n\n                        response.download(consume)\n\n                        if response.status != 200:\n                            raise response.get_exception()\n                    else:\n                        if response.status != 200:\n                            raise response.get_exception()\n\n                        response.download(file.write)\n\n            auto_retry(attempt, n_retries, retry_interval)\n        finally:\n            if close_file and file is not None:\n                file.close()\n\n    def download(\n        self,\n        src_path: str,\n        file_or_path: FileOrPathDestination,\n        /,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        \"\"\"\n            Download the file.\n\n            :param src_path: source path\n            :param file_or_path: destination path or file-like object\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`SyncResourceLinkObject`, link to the source resource\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        self._download(self.get_download_link, src_path, file_or_path, **kwargs)\n\n        return SyncResourceLinkObject.from_path(src_path, yadisk=self)\n\n    def download_by_link(\n        self,\n        link: str,\n        file_or_path: FileOrPathDestination,\n        /,\n        **kwargs\n    ) -> None:\n        \"\"\"\n            Download the file from the link.\n\n            :param link: download link\n            :param file_or_path: destination path or file-like object\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n\n        self._download(lambda *args, **kwargs: link, \"\", file_or_path, **kwargs)\n\n    def remove(self, path: str, /, **kwargs) -> Optional[\"SyncOperationLinkObject\"]:\n        \"\"\"\n            Remove the resource.\n\n            :param path: path to the resource to be removed\n            :param permanently: if `True`, the resource will be removed permanently,\n                                otherwise, it will be just moved to the trash\n            :param md5: `str`, MD5 hash of the file to remove\n            :param force_async: forces the operation to be executed asynchronously\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises BadRequestError: MD5 check is only available for files\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/delete>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/DeleteResource>`__\n\n            :returns: :any:`SyncOperationLinkObject` if the operation is performed asynchronously, `None` otherwise\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return self._maybe_wait(DeleteRequest, path, **kwargs)\n\n    def mkdir(self, path: str, /, **kwargs) -> SyncResourceLinkObject:\n        \"\"\"\n            Create a new directory.\n\n            :param path: path to the directory to be created\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises DirectoryExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot create directory due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/create-folder>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/CreateResource>`__\n\n            :returns: :any:`SyncResourceLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return MkdirRequest(self.session, path, **kwargs).send(yadisk=self)\n\n    def makedirs(self, path: str, /, **kwargs) -> SyncResourceLinkObject:\n        \"\"\"\n            Create a new directory at `path`. If its parent directory doesn't\n            exist it will also be created recursively.\n\n            :param path: path to the directory to be created\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises DirectoryExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot create directory due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`SyncResourceLinkObject`\n        \"\"\"\n\n        while True:\n            try:\n                return self.mkdir(path, **kwargs)\n            except ParentNotFoundError as e:\n                # We first have to remove the scheme, otherwise posixpath.split()\n                # may treat it as part of the path\n                scheme, path_without_scheme = remove_path_scheme(path)\n\n                # Extract the parent directory\n                head, _tail = posixpath.split(path_without_scheme)\n                head = head.strip(\"/\")\n\n                if head == \"\":\n                    # We should never find ourselves in this situation\n                    raise e from None\n\n                # Restore the scheme\n                if scheme:\n                    head = f\"{scheme}:/{head}\"\n\n                self.makedirs(head, **kwargs)\n\n    def get_trash_meta(self, path: str, /, **kwargs) -> \"SyncTrashResourceObject\":\n        \"\"\"\n            Get meta information about a trash resource.\n\n            :param path: path to the trash resource\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/meta>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47trash47resources/GetTrashResource>`__\n\n            :returns: :any:`SyncTrashResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is for internal error handling\n        _then = kwargs.pop(\"_then\", None)\n\n        return GetTrashRequest(self.session, path, **kwargs).send(yadisk=self, then=_then)\n\n    def trash_exists(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the trash resource at `path` exists.\n\n            :param path: path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        return _exists(self.get_trash_meta, path, **kwargs)\n\n    def copy(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, \"SyncOperationLinkObject\"]:\n        \"\"\"\n            Copy `src_path` to `dst_path`.\n            If the operation is performed asynchronously, returns the link to the operation,\n            otherwise, returns the link to the newly created resource.\n\n            :param src_path: source path\n            :param dst_path: destination path\n            :param overwrite: if `True` the destination path can be overwritten,\n                              otherwise, an error will be raised\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises InsufficientStorageError: cannot complete request due to lack of storage space\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/copy>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/CopyResource>`__\n\n            :returns: :any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return self._maybe_wait(CopyRequest, src_path, dst_path, **kwargs)\n\n    def restore_trash(\n        self,\n        path: str,\n        /,\n        dst_path: Optional[str] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, \"SyncOperationLinkObject\"]:\n        \"\"\"\n            Restore a trash resource.\n            Returns a link to the newly created resource or a link to the asynchronous operation.\n\n            :param path: path to the trash resource to be restored\n            :param dst_path: destination path\n            :param overwrite: `bool`, determines whether the destination can be overwritten\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/trash-restore>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47trash47resources/RestoreFromTrash>`__\n\n            :returns: :any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return self._maybe_wait(RestoreTrashRequest, path, dst_path=dst_path, **kwargs)\n\n    def move(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, \"SyncOperationLinkObject\"]:\n        \"\"\"\n            Move `src_path` to `dst_path`.\n\n            :param src_path: source path to be moved\n            :param dst_path: destination path\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/move>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/MoveResource>`__\n\n            :returns: :any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return self._maybe_wait(MoveRequest, src_path, dst_path, **kwargs)\n\n    def rename(\n        self,\n        src_path: str,\n        new_name: str,\n        /,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, \"SyncOperationLinkObject\"]:\n        \"\"\"\n            Rename `src_path` to have filename `new_name`.\n            Does the same as `move()` but changes only the filename.\n\n            :param src_path: source path to be moved\n            :param new_name: target filename to rename to\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises ValueError: `new_name` is not a valid filename or `src_path` is root\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\n        \"\"\"\n\n        new_name = new_name.rstrip(\"/\")\n\n        if \"/\" in new_name or new_name in (\".\", \"..\", \"\"):\n            raise ValueError(f\"Invalid filename: {new_name}\")\n\n        # Remove scheme first, otherwise PurePosixPath will treat it as part of the path\n        scheme, src_path_without_scheme = remove_path_scheme(src_path)\n        sanitized_src_path = PurePosixPath(src_path_without_scheme.strip(\"/\"))\n\n        if len(sanitized_src_path.parts) == 0:\n            raise ValueError(\"Cannot rename root\")\n\n        dst_path = str(sanitized_src_path.parent / new_name)\n\n        # Restore scheme back\n        if scheme:\n            dst_path = f\"{scheme}:/{dst_path}\"\n\n        return self.move(src_path, dst_path, **kwargs)\n\n    def remove_trash(\n        self,\n        path: str,\n        /,\n        **kwargs\n    ) -> Optional[\"SyncOperationLinkObject\"]:\n        \"\"\"\n            Remove a trash resource.\n\n            :param path: path to the trash resource to be deleted\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/trash-delete>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47trash47resources/ClearTrash>`__\n\n            :returns: :any:`SyncOperationLinkObject` if the operation is performed asynchronously, `None` otherwise\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return self._maybe_wait(DeleteTrashRequest, path, **kwargs)\n\n    def publish(self, path: str, /, **kwargs) -> SyncResourceLinkObject:\n        \"\"\"\n            Make a resource public.\n\n            :param path: path to the resource to be published\n            :param allow_address_access: `bool`, specifies the request format, i.e.\n                with personal access settings (when set to `True`) or without\n            :param public_settings: :any:`PublicSettings` or `None`, public access settings for the resource\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/publish>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/PublishResource>`__\n\n            :returns: :any:`SyncResourceLinkObject`, link to the resource\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return PublishRequest(self.session, path, **kwargs).send(yadisk=self)\n\n    def unpublish(self, path: str, /, **kwargs) -> SyncResourceLinkObject:\n        \"\"\"\n            Make a public resource private.\n\n            :param path: path to the resource to be unpublished\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/publish#unpublish-q>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/UnpublishResource>`__\n\n            :returns: :any:`SyncResourceLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return UnpublishRequest(self.session, path, **kwargs).send(yadisk=self)\n\n    def get_public_settings(self, path: str, /, **kwargs) -> PublicSettingsObject:\n        \"\"\"\n            Get public settings of a resource.\n\n            :param path: path to the resource\n            :param allow_address_access: `bool`, specifies the request format, i.e.\n                with personal access settings (when set to `True`) or without\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.ru/dev/disk-api/doc/ru/reference/public-settings-get>`__\n\n            :returns: :any:`PublicSettingsObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return GetPublicSettingsRequest(self.session, path, **kwargs).send(yadisk=self)\n\n    def get_public_available_settings(self, path: str, /, **kwargs) -> PublicAvailableSettingsObject:\n        \"\"\"\n            Get public settings of a shared resource for the current OAuth token owner.\n\n            :param path: path to the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.ru/dev/disk-api/doc/ru/reference/public-settings-get-available>`__\n\n            :returns: :any:`PublicAvailableSettingsObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return GetPublicAvailableSettingsRequest(self.session, path, **kwargs).send(yadisk=self)\n\n    def update_public_settings(self, path: str, public_settings: PublicSettings, /, **kwargs) -> None:\n        \"\"\"\n            Update public settings of a shared resource.\n\n            :param path: path to the resource\n            :param public_settings: :any:`PublicSettings`, public access settings for the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.ru/dev/disk-api/doc/ru/reference/public-settings-change>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/UpdatePublicSettings>`__\n\n            :returns: `None`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return UpdatePublicSettingsRequest(self.session, path, public_settings, **kwargs).send(yadisk=self)\n\n    def save_to_disk(\n        self,\n        public_key: str,\n        /,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, \"SyncOperationLinkObject\"]:\n        \"\"\"\n            Saves a public resource to the disk.\n            Returns the link to the operation if it's performed asynchronously,\n            or a link to the resource otherwise.\n\n            :param public_key: public key or public URL of the public resource\n            :param name: filename of the saved resource\n            :param path: path to the copied resource in the public folder\n            :param save_path: path to the destination directory (downloads directory by default)\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/public#save>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/SaveToDiskPublicResource>`__\n\n            :returns: :any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return self._maybe_wait(SaveToDiskRequest, public_key, **kwargs)\n\n    def get_public_meta(\n        self,\n        public_key: str,\n        /,\n        **kwargs\n    ) -> \"SyncPublicResourceObject\":\n        \"\"\"\n            Get meta-information about a public resource.\n\n            :param public_key: public key or public URL of the public resource\n            :param path: relative path to a resource in a public folder.\n                         By specifying the key of the published folder in `public_key`,\n                         you can request metainformation for any resource in the folder.\n            :param offset: offset from the beginning of the list of nested resources\n            :param limit: maximum number of nested elements to be included in the list\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param preview_size: file preview size\n            :param preview_crop: `bool`, allow preview crop\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/public>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/GetPublicResource>`__\n\n            :returns: :any:`SyncPublicResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        # This is for internal error handling\n        _then = kwargs.pop(\"_then\", None)\n\n        return GetPublicMetaRequest(self.session, public_key, **kwargs).send(yadisk=self, then=_then)\n\n    def public_exists(self, public_key: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the public resource exists.\n\n            :param public_key: public key or public URL of the public resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        return _exists(self.get_public_meta, public_key, **kwargs)\n\n    def public_listdir(\n        self,\n        public_key: str,\n        /,\n        **kwargs\n    ) -> Generator[\"SyncPublicResourceObject\", None, None]:\n        \"\"\"\n            Get contents of a public directory.\n\n            :param public_key: public key or public URL of the public resource\n            :param path: relative path to the resource in the public folder.\n                         By specifying the key of the published folder in `public_key`,\n                         you can request contents of any nested folder.\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: generator of :any:`SyncPublicResourceObject`\n        \"\"\"\n\n        return _listdir(self.get_public_meta, public_key, **kwargs)\n\n    def get_public_type(self, public_key: str, /, **kwargs) -> str:\n        \"\"\"\n            Get public resource type.\n\n            :param public_key: public key or public URL of the public resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        return _get_type(self.get_public_meta, public_key, **kwargs)\n\n    def is_public_dir(self, public_key: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the public resource is a public directory.\n\n            :param public_key: public key or public URL of the public resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `public_key` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return self.get_public_type(public_key, **kwargs) == \"dir\"\n        except PathNotFoundError:\n            return False\n\n    def is_public_file(self, public_key: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the public resource is a public file.\n\n            :param public_key: public key or public URL of the public resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `public_key` is a file, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return self.get_public_type(public_key, **kwargs) == \"file\"\n        except PathNotFoundError:\n            return False\n\n    def trash_listdir(\n        self,\n        path: str,\n        /,\n        **kwargs\n    ) -> Generator[\"SyncTrashResourceObject\", None, None]:\n        \"\"\"\n            Get contents of a trash resource.\n\n            :param path: path to the directory in the trash bin\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: generator of :any:`SyncTrashResourceObject`\n        \"\"\"\n\n        return _listdir(self.get_trash_meta, path, **kwargs)\n\n    def get_trash_type(self, path: str, /, **kwargs) -> str:\n        \"\"\"\n            Get trash resource type.\n\n            :param path: path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        return _get_type(self.get_trash_meta, path, **kwargs)\n\n    def is_trash_dir(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` is a trash directory.\n\n            :param path: path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return self.get_trash_type(path, **kwargs) == \"dir\"\n        except PathNotFoundError:\n            return False\n\n    def is_trash_file(self, path: str, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether `path` is a trash file.\n\n            :param path: path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a file, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        try:\n            return self.get_trash_type(path, **kwargs) == \"file\"\n        except PathNotFoundError:\n            return False\n\n    def get_public_resources(self, **kwargs) -> \"SyncPublicResourcesListObject\":\n        \"\"\"\n            Get a list of public resources.\n\n            :param offset: offset from the beginning of the list\n            :param limit: maximum number of elements in the list\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param type: filter based on type of resources (\"file\" or \"dir\")\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/recent-public>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/ListPublicResources>`__\n\n            :returns: :any:`SyncPublicResourcesListObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return GetPublicResourcesRequest(self.session, **kwargs).send(yadisk=self)\n\n    def get_all_public_resources(\n        self,\n        *,\n        max_items: Optional[int] = None,\n        **kwargs\n    ) -> Generator[SyncPublicResourceObject, None, None]:\n        \"\"\"\n            Get a list of all public resources.\n\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param offset: offset from the beginning of the list\n            :param limit: maximum number of elements in the list\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param type: filter based on type of resources (\"file\" or \"dir\")\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/recent-public>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/ListPublicResources>`__\n\n            :returns: generator of :any:`SyncPublicResourceObject`\n        \"\"\"\n\n        if kwargs.get(\"offset\") is None:\n            kwargs[\"offset\"] = 0\n\n        if kwargs.get(\"limit\") is None:\n            kwargs[\"limit\"] = 100\n\n        remaining_items = max_items\n\n        while True:\n            # Do not query more items than necessary\n            if remaining_items is not None:\n                kwargs[\"limit\"] = min(remaining_items, kwargs[\"limit\"])\n\n            files = self.get_public_resources(**kwargs).items or []\n            file_count = len(files)\n\n            yield from files[:remaining_items]\n\n            if remaining_items is not None:\n                remaining_items -= file_count\n\n                if remaining_items <= 0:\n                    break\n\n            if file_count < kwargs[\"limit\"]:\n                break\n\n            kwargs[\"offset\"] += kwargs[\"limit\"]\n\n    def patch(self, path: str, properties: dict, /, **kwargs) -> \"SyncResourceObject\":\n        \"\"\"\n            Update custom properties of a resource.\n\n            :param path: path to the resource\n            :param properties: `dict`, custom properties to update\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/meta-add>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/UpdateResource>`__\n\n            :returns: :any:`ResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return PatchRequest(self.session, path, properties, **kwargs).send(yadisk=self)\n\n    def _get_files_some(self, **kwargs) -> List[\"SyncResourceObject\"]:\n        response: \"SyncFilesResourceListObject\" = FilesRequest(\n            self.session, **kwargs).send(yadisk=self)\n\n        if response.items is None:\n            raise InvalidResponseError(\"Response did not contain key field\")\n\n        return response.items\n\n    def get_files(\n        self,\n        *,\n        max_items: Optional[int] = None,\n        **kwargs\n    ) -> Generator[\"SyncResourceObject\", None, None]:\n        \"\"\"\n            Get a flat list of all files (that doesn't include directories).\n\n            :param offset: offset from the beginning of the list\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of list elements to be included in each response\n            :param media_type: type of files to include in the list\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/all-files>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetFlatFilesList>`__\n\n            :returns: generator of :any:`ResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        if kwargs.get(\"offset\") is None:\n            kwargs[\"offset\"] = 0\n\n        if kwargs.get(\"limit\") is None:\n            kwargs[\"limit\"] = 200\n\n        remaining_items = max_items\n\n        while True:\n            # Do not query more items than necessary\n            if remaining_items is not None:\n                kwargs[\"limit\"] = min(remaining_items, kwargs[\"limit\"])\n\n            files = self._get_files_some(**kwargs)\n            file_count = len(files)\n\n            yield from files[:remaining_items]\n\n            if remaining_items is not None:\n                remaining_items -= file_count\n\n                if remaining_items <= 0:\n                    break\n\n            if file_count < kwargs[\"limit\"]:\n                break\n\n            kwargs[\"offset\"] += kwargs[\"limit\"]\n\n    def get_last_uploaded(self, **kwargs) -> List[\"SyncResourceObject\"]:\n        \"\"\"\n            Get the list of latest uploaded files sorted by upload date.\n\n            :param limit: maximum number of elements in the list\n            :param media_type: type of files to include in the list\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/recent-upload>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/GetLastUploadedFilesList>`__\n\n            :returns: generator of :any:`ResourceObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        response: \"SyncLastUploadedResourceListObject\" = LastUploadedRequest(\n            self.session, **kwargs\n        ).send(yadisk=self)\n\n        if response.items is None:\n            raise InvalidResponseError(\"Response did not contain key field\")\n\n        return response.items\n\n    def upload_url(\n        self,\n        url: str,\n        path: str,\n        /,\n        **kwargs\n    ) -> \"SyncOperationLinkObject\":\n        \"\"\"\n            Upload a file from URL.\n\n            :param url: source URL\n            :param path: destination path\n            :param disable_redirects: `bool`, forbid redirects\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/upload-ext>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47resources/UploadExternalResource>`__\n\n            :returns: :any:`SyncOperationLinkObject`, link to the asynchronous operation\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return self._maybe_wait(UploadURLRequest, url, path, **kwargs)\n\n    def get_public_download_link(self, public_key: str, /, **kwargs) -> str:\n        \"\"\"\n            Get a download link for a public resource.\n\n            :param public_key: public key or public URL of the public resource\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/public#download-request>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47public47resources/GetPublicResourceDownloadLink>`__\n\n            :returns: `str`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return GetPublicDownloadLinkRequest(\n            self.session, public_key, fields=[\"href\"], **kwargs\n        ).send(yadisk=self, then=_validate_link_response).href\n\n    def download_public(\n        self,\n        public_key: str,\n        file_or_path: FileOrPathDestination,\n        /,\n        **kwargs\n    ) -> SyncPublicResourceLinkObject:\n        \"\"\"\n            Download the public resource.\n\n            :param public_key: public key or public URL of the public resource\n            :param file_or_path: destination path or file-like object\n            :param path: relative path to the resource within the public folder\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`SyncPublicResourceLinkObject`\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n\n        self._download(\n            lambda public_key, **kwargs: self.get_public_download_link(public_key, **kwargs),\n            public_key, file_or_path, **kwargs)\n\n        return SyncPublicResourceLinkObject.from_public_key(public_key, yadisk=self)\n\n    def get_operation_status(self, operation_id: str, /, **kwargs) -> OperationStatus:\n        \"\"\"\n            Get operation status.\n\n            :param operation_id: ID of the operation or a link\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises OperationNotFoundError: requested operation was not found\n\n            More info about this request:\n\n            * `Official docs <https://yandex.com/dev/disk-api/doc/en/reference/operations>`__\n            * `Polygon <https://yandex.com/dev/disk/poligon#!/v147disk47operations47123operation95id125/GetOperationStatus/>`__\n\n            :returns: `str`, :code:`\"in-progress\"` indicates that the operation\n                      is currently running, :code:`\"success\"` indicates that\n                      the operation was successful, :code:`\"failed\"` means that\n                      the operation failed\n        \"\"\"\n\n        _apply_default_args(kwargs, self.default_args)\n        _add_authorization_header(kwargs, self.token)\n\n        return GetOperationStatusRequest(\n            self.session, operation_id, fields=[\"status\"], **kwargs\n        ).send(yadisk=self).status\n\n    def wait_for_operation(\n        self,\n        operation_id: str,\n        /,\n        *,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        **kwargs\n    ) -> None:\n        \"\"\"\n            Wait until an operation is completed. If the operation fails, an\n            exception is raised. Waiting is performed by calling :any:`time.sleep`.\n\n            :param operation_id: ID of the operation or a link\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n        \"\"\"\n\n        poll_start_time = time.monotonic()\n\n        while (status := self.get_operation_status(operation_id, **kwargs)) == \"in-progress\":\n            if poll_timeout is not None:\n                total_poll_duration = time.monotonic() - poll_start_time\n\n                if total_poll_duration >= poll_timeout:\n                    raise AsyncOperationPollingTimeoutError(\"Asynchronous operation did not complete in specified time\")\n\n            time.sleep(poll_interval)\n\n        if status != \"success\":\n            raise AsyncOperationFailedError(\"Asynchronous operation failed\")\n"
  },
  {
    "path": "src/yadisk/_client.pyi",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import Optional, Any, Union, Literal, overload\nfrom ._typing_compat import Dict, Generator, Iterable, List, Tuple, Type\n\nfrom .objects import (\n    DeviceCodeObject, TokenObject, TokenRevokeStatusObject,\n    DiskInfoObject, SyncResourceObject, SyncResourceLinkObject,\n    SyncOperationLinkObject, SyncTrashResourceObject, SyncPublicResourceObject,\n    SyncPublicResourcesListObject, SyncPublicResourceLinkObject,\n    ResourceUploadLinkObject, PublicSettingsObject, PublicAvailableSettingsObject\n)\n\nfrom .types import (\n    FileOrPath, FileOrPathDestination, Headers, OperationStatus,\n    PublicSettings, Session, SessionName, SessionFactory, OpenFileCallback,\n    TimeoutParameter\n)\n\n__all__ = [\"Client\"]\n\nclass Client:\n    id: str\n    secret: str\n    token: str\n    default_args: Dict[str, Any]\n    session: Session\n    open_file: OpenFileCallback\n\n    synchronous = True\n\n    def __init__(\n        self,\n        id:     str = \"\",\n        secret: str = \"\",\n        token:  str = \"\",\n        *,\n        default_args:    Optional[Dict[str, Any]] = None,\n        session:         Optional[Union[Session, SessionName]] = None,\n        open_file:       Optional[OpenFileCallback] = None,\n        session_factory: Optional[SessionFactory] = None\n    ) -> None:\n        ...\n\n    def __enter__(self): ...\n    def __exit__(self, *args, **kwargs) -> None: ...\n    def close(self) -> None: ...\n\n    def get_auth_url(\n        self,\n        type:                  Union[Literal[\"code\"], Literal[\"token\"]],\n        device_id:             Optional[str] = None,\n        device_name:           Optional[str] = None,\n        redirect_uri:          Optional[str] = None,\n        login_hint:            Optional[str] = None,\n        scope:                 Optional[str] = None,\n        optional_scope:        Optional[str] = None,\n        force_confirm:         bool = True,\n        state:                 Optional[str] = None,\n        code_challenge:        Optional[str] = None,\n        code_challenge_method: Optional[Union[Literal[\"plain\"], Literal[\"S256\"]]] = None,\n        display:               None = None\n    ) -> str:\n        ...\n\n    def get_code_url(\n        self,\n        device_id:             Optional[str] = None,\n        device_name:           Optional[str] = None,\n        redirect_uri:          Optional[str] = None,\n        login_hint:            Optional[str] = None,\n        scope:                 Optional[str] = None,\n        optional_scope:        Optional[str] = None,\n        force_confirm:         bool = True,\n        state:                 Optional[str] = None,\n        code_challenge:        Optional[str] = None,\n        code_challenge_method: Optional[Union[Literal[\"plain\"], Literal[\"S256\"]]] = None,\n        display:               None = None\n    ) -> str: ...\n\n    def get_device_code(\n        self,\n        *,\n        device_id: Optional[str] = None,\n        device_name: Optional[str] = None,\n        scope: Optional[str] = None,\n        optional_scope: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> DeviceCodeObject: ...\n\n    def get_token(\n        self,\n        code: str,\n        /,\n        *,\n        device_id: Optional[str] = None,\n        device_name: Optional[str] = None,\n        code_verifier: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> TokenObject:\n        ...\n\n    def get_token_from_device_code(\n        self,\n        device_code: str,\n        /,\n        *,\n        device_id: Optional[str] = None,\n        device_name: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> TokenObject:\n        ...\n\n    def refresh_token(\n        self,\n        refresh_token: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> TokenObject:\n        ...\n\n    def revoke_token(\n        self,\n        token: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> TokenRevokeStatusObject:\n        ...\n\n    def check_token(\n        self,\n        token: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def get_disk_info(\n        self,\n        *,\n        extra_fields: Optional[Iterable[str]] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> DiskInfoObject:\n        ...\n\n    def get_meta(\n        self,\n        path: str,\n        /,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceObject:\n        ...\n\n    def exists(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def get_type(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    def is_file(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def is_dir(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def listdir(\n        self,\n        path: str,\n        /,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Generator[SyncResourceObject, None, None]:\n        ...\n\n    def get_upload_link(\n        self,\n        path: str,\n        /,\n        *,\n        overwrite: bool = False,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    def get_upload_link_object(\n        self,\n        path: str,\n        /,\n        *,\n        overwrite: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> ResourceUploadLinkObject:\n        ...\n\n    def upload(\n        self,\n        file_or_path: FileOrPath,\n        dst_path: str,\n        /,\n        *,\n        overwrite: bool = False,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        ...\n\n    def upload_by_link(\n        self,\n        file_or_path: FileOrPath,\n        link: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n\n    def get_download_link(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    def download(\n        self,\n        src_path: str,\n        file_or_path: FileOrPathDestination,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        ...\n\n    def download_by_link(\n        self,\n        link: str,\n        file_or_path: FileOrPathDestination,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n\n    @overload\n    def remove(\n        self,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        md5: Optional[str] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def remove(\n        self,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        md5: Optional[str] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Optional[SyncOperationLinkObject]:\n        ...\n\n    def mkdir(\n        self,\n        path: str,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        ...\n\n    def makedirs(\n        self,\n        path: str,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        ...\n\n    def get_trash_meta(\n        self,\n        path: str,\n        /,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncTrashResourceObject:\n        ...\n\n    def trash_exists(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    @overload\n    def copy(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def copy(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def restore_trash(\n        self,\n        path: str,\n        /,\n        dst_path: Optional[str] = None,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def restore_trash(\n        self,\n        path: str,\n        /,\n        dst_path: Optional[str] = None,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def move(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def move(\n        self,\n        src_path: str,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def rename(\n        self,\n        src_path: str,\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def rename(\n        self,\n        src_path: str,\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def remove_trash(\n        self,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def remove_trash(\n        self,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Optional[SyncOperationLinkObject]:\n        ...\n\n    def publish(\n        self,\n        path: str,\n        /,\n        *,\n        allow_address_access: bool = False,\n        public_settings: Optional[PublicSettings] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        ...\n\n    def unpublish(\n        self,\n        path: str,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        ...\n\n    def get_public_settings(\n        self,\n        path: str,\n        /,\n        allow_address_access: bool = False,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> PublicSettingsObject:\n        ...\n\n    def get_public_available_settings(\n        self,\n        path: str,\n        /,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> PublicAvailableSettingsObject:\n        ...\n\n    def update_public_settings(\n        self,\n        path: str,\n        public_settings: PublicSettings,\n        /,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n\n    @overload\n    def save_to_disk(\n        self,\n        public_key: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        name: Optional[str] = None,\n        path: Optional[str] = None,\n        save_path: Optional[str] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def save_to_disk(\n        self,\n        public_key: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        name: Optional[str] = None,\n        path: Optional[str] = None,\n        save_path: Optional[str] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    def get_public_meta(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncPublicResourceObject:\n        ...\n\n    def public_exists(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def public_listdir(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Generator[SyncPublicResourceObject, None, None]:\n        ...\n\n    def get_public_type(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    def is_public_dir(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def is_public_file(\n        self,\n        public_key: str,\n        /,\n        *,\n        path: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def trash_listdir(\n        self,\n        path: str,\n        /,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Generator[SyncTrashResourceObject, None, None]:\n        ...\n\n    def get_trash_type(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    def is_trash_dir(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def is_trash_file(\n        self,\n        path: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def get_public_resources(\n        self,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        type: Optional[Union[Literal[\"file\"], Literal[\"dir\"]]] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncPublicResourcesListObject:\n        ...\n\n    def get_all_public_resources(\n        self,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        type: Optional[Union[Literal[\"file\"], Literal[\"dir\"]]] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Generator[SyncPublicResourceObject, None, None]:\n        ...\n\n    def patch(\n        self,\n        path: str,\n        properties: dict,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceObject:\n        ...\n\n    def get_files(\n        self,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        media_type: Optional[Union[str, Iterable[str]]] = None,\n        sort: Optional[str] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Generator[SyncResourceObject, None, None]:\n        ...\n\n    def get_last_uploaded(\n        self,\n        *,\n        limit: Optional[int] = None,\n        media_type: Optional[Union[str, Iterable[str]]] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> List[SyncResourceObject]:\n        ...\n\n    def upload_url(\n        self,\n        url: str,\n        path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        disable_redirects: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    def get_public_download_link(\n        self,\n        public_key: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    def download_public(\n        self,\n        public_key: str,\n        file_or_path: FileOrPathDestination,\n        /,\n        *,\n        path: Optional[str] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncPublicResourceLinkObject:\n        ...\n\n    def get_operation_status(\n        self,\n        operation_id: str,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> OperationStatus:\n        ...\n\n    def wait_for_operation(\n        self,\n        operation_id: str,\n        /,\n        *,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n"
  },
  {
    "path": "src/yadisk/_client_common.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom .utils import CaseInsensitiveDict\n\nfrom ._typing_compat import Dict, Generator\nfrom .exceptions import InvalidResponseError\nfrom .objects import ResourceObject, LinkObject\n\nfrom typing import Any, AnyStr, IO, Optional\n\n__all__ = [\n    \"_add_authorization_header\",\n    \"_add_spoof_user_agent_header\",\n    \"_apply_default_args\",\n    \"_filter_request_kwargs\",\n    \"_read_file_as_generator\",\n    \"_set_authorization_header\",\n    \"_validate_get_type_response\",\n    \"_validate_link_response\",\n    \"_validate_listdir_response\"\n]\n\n\ndef _apply_default_args(args: Dict[str, Any], default_args: Dict[str, Any]) -> None:\n    new_args = dict(default_args)\n    new_args.update(args)\n    args.clear()\n    args.update(new_args)\n\n\ndef _filter_request_kwargs(kwargs: Dict[str, Any]) -> None:\n    # Remove some of the yadisk-specific arguments from kwargs\n    keys_to_remove = (\"n_retries\", \"retry_interval\", \"retry_on\", \"fields\", \"overwrite\", \"path\")\n\n    for key in keys_to_remove:\n        kwargs.pop(key, None)\n\n\ndef _read_file_as_generator(input_file: IO[AnyStr]) -> Generator[AnyStr, None, None]:\n    chunk_size = 8192\n\n    while chunk := input_file.read(chunk_size):\n        yield chunk\n\n\ndef _set_authorization_header(\n    kwargs: Dict[str, Any],\n    new_token: Optional[str] = None\n) -> None:\n    headers = CaseInsensitiveDict(kwargs.get(\"headers\") or {})\n\n    if new_token:\n        headers[\"Authorization\"] = f\"OAuth {new_token}\"\n    else:\n        headers.pop(\"Authorization\", None)\n\n    kwargs[\"headers\"] = headers\n\n\ndef _add_authorization_header(\n    kwargs: Dict[str, Any],\n    new_token: Optional[str] = None\n) -> None:\n    headers = CaseInsensitiveDict(kwargs.get(\"headers\") or {})\n\n    if \"Authorization\" in headers:\n        return\n\n    if new_token:\n        headers[\"Authorization\"] = f\"OAuth {new_token}\"\n    else:\n        headers[\"Authorization\"] = \"\"\n\n    kwargs[\"headers\"] = headers\n\n\ndef _add_spoof_user_agent_header(kwargs: Dict[str, Any]) -> None:\n    headers = kwargs.setdefault(\"headers\", {})\n    headers[\"User-Agent\"] = 'Yandex.Disk {\"os\":\"windows\"}'\n\n\ndef _validate_listdir_response(response: ResourceObject) -> ResourceObject:\n    if response.type == \"file\":\n        return response\n\n    if response.embedded is None:\n        raise InvalidResponseError(\"Response did not contain _embedded field\")\n\n    if (response.type is None or response.embedded.items is None or\n            response.embedded.offset is None or response.embedded.limit is None or\n            response.embedded.total is None):\n        raise InvalidResponseError(\"Response did not contain key field\")\n\n    return response\n\ndef _validate_link_response(response: LinkObject) -> LinkObject:\n    if not response.href:\n        raise InvalidResponseError(\"Response did not contain the link\")\n\n    return response\n\n\ndef _validate_get_type_response(response: ResourceObject) -> ResourceObject:\n    if response.type is None:\n        raise InvalidResponseError(\"Response did not contain the type field\")\n\n    return response\n"
  },
  {
    "path": "src/yadisk/_common.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nimport datetime\nimport inspect\n\nfrom ._typing_compat import Callable, List\nfrom . import settings\n\nfrom typing import Optional, TypeVar, Any, Union\n\nfrom .types import TimeoutParameter, Tuple\n\n__all__ = [\n    \"bool_or_error\",\n    \"dict_or_error\",\n    \"ensure_path_has_scheme\",\n    \"float_or_error\",\n    \"int_or_error\",\n    \"is_default_timeout\",\n    \"is_operation_link\",\n    \"is_public_resource_link\",\n    \"is_resource_link\",\n    \"remove_path_scheme\",\n    \"str_or_dict_or_error\",\n    \"str_or_error\",\n    \"typed_list\",\n    \"yandex_date\"\n]\n\nT = TypeVar(\"T\", bound=Callable)\n\n\ndef typed_list(datatype: T) -> Callable[[Optional[List]], List[T]]:\n    def list_factory(iterable: Optional[List] = None) -> List[T]:\n        if iterable is None:\n            return []\n\n        if not isinstance(iterable, list):\n            raise ValueError(f\"Expected a list, got {type(iterable)}\")\n\n        return [datatype(i) for i in iterable]\n\n    return list_factory\n\n\ndef int_or_error(x: Any) -> int:\n    if not isinstance(x, int):\n        raise ValueError(f\"{repr(x)} is not an integer\")\n\n    return x\n\n\ndef float_or_error(x: Any) -> float:\n    if not isinstance(x, (float, int)):\n        raise ValueError(f\"{repr(x)} is not a float\")\n\n    return x\n\n\ndef str_or_error(x: Any) -> str:\n    if not isinstance(x, str):\n        raise ValueError(f\"{repr(x)} is not a string\")\n\n    return x\n\n\ndef bool_or_error(x: Any) -> bool:\n    if not isinstance(x, bool):\n        raise ValueError(f\"{repr(x)} is not a boolean value\")\n\n    return x\n\n\ndef dict_or_error(x: Any) -> dict:\n    if not isinstance(x, dict):\n        raise ValueError(f\"{repr(x)} is not a dict\")\n\n    return x\n\n\ndef str_or_dict_or_error(x: Any) -> Union[str, dict]:\n    if not isinstance(x, (str, dict)):\n        raise ValueError(f\"{repr(x)} is not a string nor a dict\")\n\n    return x\n\n\ndef yandex_date(string: str) -> datetime.datetime:\n    return datetime.datetime.strptime(string[:-3] + string[-2:], \"%Y-%m-%dT%H:%M:%S%z\")\n\n\ndef _is_endpoint_link(link: str, base_endpoint_url: str) -> bool:\n    link_scheme, _, link = link.partition(\"://\")\n    endpoint_scheme, _, base_endpoint_url = base_endpoint_url.partition(\"://\")\n\n    if link_scheme not in (\"http\", \"https\") or endpoint_scheme not in (\"http\", \"https\"):\n        return False\n\n    if not base_endpoint_url.endswith(\"/\") and not base_endpoint_url.endswith(\"?\"):\n        base_endpoint_url += \"/\"\n\n    return link.startswith(base_endpoint_url)\n\n\ndef is_operation_link(link: str) -> bool:\n    return _is_endpoint_link(link, f\"{settings.BASE_API_URL}/v1/disk/operations/\")\n\n\ndef is_resource_link(url: str) -> bool:\n    return _is_endpoint_link(url, f\"{settings.BASE_API_URL}/v1/disk/resources?\")\n\n\ndef is_public_resource_link(url: str) -> bool:\n    return _is_endpoint_link(url, f\"{settings.BASE_API_URL}/v1/disk/public/resources?\")\n\n\nKNOWN_SCHEMAS = (\"disk:\", \"trash:\", \"app:\", \"photounlim:\")\n\n\ndef ensure_path_has_scheme(path: str, default_scheme: str = \"disk\") -> str:\n    # Modifies path to always have a scheme (disk:/, trash:/ or app:/).\n    # Without the scheme Yandex.Disk won't let you upload filenames with the ':' character.\n    # See https://github.com/ivknv/yadisk/issues/26 for more details\n\n    if path in KNOWN_SCHEMAS:\n        return default_scheme + \":/\" + path\n\n    if path.startswith(\"/\"):\n        return default_scheme + \":\" + path\n\n    if any(path.startswith(scheme + \"/\") for scheme in KNOWN_SCHEMAS):\n        return path\n\n    return default_scheme + \":/\" + path\n\n\ndef remove_path_scheme(path: str) -> Tuple[str, str]:\n    \"\"\"\n        Remove scheme from path.\n\n        :param path: `str`, path to remove the scheme from\n\n        :returns: `tuple[str, str]`, removed scheme (without `:/`) and the path without it\n    \"\"\"\n\n    if path.startswith(\"/\") or path in KNOWN_SCHEMAS:\n        return \"\", path\n\n    if any(path.startswith(scheme + \"/\") for scheme in KNOWN_SCHEMAS):\n        scheme, _sep, path = path.partition(\":/\")\n\n        return scheme, path\n\n    return \"\", path\n\n\ndef is_async_func(func: Any) -> bool:\n    return inspect.isgeneratorfunction(func) or inspect.iscoroutinefunction(func)\n\n\ndef is_default_timeout(timeout: TimeoutParameter) -> bool:\n    return timeout is ...\n"
  },
  {
    "path": "src/yadisk/_import_session.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import TYPE_CHECKING\nfrom ._typing_compat import Type\n\nif TYPE_CHECKING:  # pragma: no cover\n    from ._session import Session\n    from ._async_session import AsyncSession\n    from .types import AsyncSessionName, SessionName\n\n__all__ = [\"import_async_session\", \"import_session\"]\n\nsessions = {\n    \"httpx\":    (\"sessions.httpx_session\",    \"HTTPXSession\"),\n    \"pycurl\":   (\"sessions.pycurl_session\",   \"PycURLSession\"),\n    \"requests\": (\"sessions.requests_session\", \"RequestsSession\")\n}\n\nasync_sessions = {\n    \"aiohttp\": (\"sessions.aiohttp_session\",     \"AIOHTTPSession\"),\n    \"httpx\":   (\"sessions.async_httpx_session\", \"AsyncHTTPXSession\")\n}\n\n\ndef import_session(name: \"SessionName\") -> Type[\"Session\"]:\n    \"\"\"\n        Imports relevant session class based on provided name.\n\n        The following sessions are available:\n\n          * :code:`\"httpx\"` - :any:`HTTPXSession`\n          * :code:`\"pycurl\"` - :any:`PycURLSession`\n          * :code:`\"requests\"` - :any:`RequestsSession`\n\n        :param name: `str`, session name\n\n        :raises ImportError: could not import module\n        :raises ValueError: unknown name\n\n        :returns: subclass of :any:`Session`\n    \"\"\"\n\n    try:\n        module_path, class_name = sessions[name]\n    except KeyError:\n        raise ValueError(f\"unknown session name: {repr(name)}\") from None\n\n    return getattr(\n        __import__(module_path, globals(), locals(), level=1, fromlist=(class_name,)),\n        class_name\n    )\n\n\ndef import_async_session(name: \"AsyncSessionName\") -> Type[\"AsyncSession\"]:\n    \"\"\"\n        Imports relevant asynchronous session class based on provided name.\n\n        :param name: `str`, session name\n\n        The following sessions are available:\n\n          * :code:`\"aiohttp\"` - :any:`AIOHTTPSession`\n          * :code:`\"httpx\"` - :any:`AsyncHTTPXSession`\n\n        :raises ImportError: could not import module\n        :raises ValueError: unknown name\n\n        :returns: subclass of :any:`AsyncSession`\n    \"\"\"\n\n    try:\n        module_path, class_name = async_sessions[name]\n    except KeyError:\n        raise ValueError(f\"unknown asynchronous session name: {repr(name)}\") from None\n\n    return getattr(\n        __import__(module_path, globals(), locals(), level=1, fromlist=(class_name,)),\n        class_name\n    )\n"
  },
  {
    "path": "src/yadisk/_session.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import Optional, Any, TypeVar\nfrom .exceptions import YaDiskError\nfrom ._typing_compat import Dict\nfrom .utils import get_exception\nfrom .objects import ErrorObject\nfrom .types import (\n    ConsumeCallback, JSON, HTTPMethod, Headers, Payload, TimeoutParameter\n)\n\n__all__ = [\"Response\", \"Session\"]\n\n\nclass Response:\n    \"\"\"\n        Represents an HTTP response.\n\n        In case an error occurs, methods of this class should throw one of exceptions\n        derived from :any:`YaDiskError`.\n\n        :ivar status: `int`, HTTP status code\n    \"\"\"\n\n    _Self = TypeVar(\"_Self\", bound=\"Response\")\n\n    status: int\n\n    def __init__(self) -> None:\n        \"\"\"Constructs a :any:`Response` object.\"\"\"\n\n        self.status = 0\n\n    def json(self) -> JSON:\n        \"\"\"\n            Returns JSON-content of the response (parses JSON).\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n\n            :raises RequestError: could not receive the response's body\n            :raises ValueError: could not parse JSON\n\n            :returns: `dict`, `list`, `str`, `int`, `float` or `None`\n        \"\"\"\n        raise NotImplementedError\n\n    def download(self, consume_callback: ConsumeCallback) -> None:\n        \"\"\"\n            Downloads response's content.\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n\n            :param consume_callback: function, takes one parameter - chunk of data (bytes),\n                                     consumes the chunk (e.g. by writing to a file)\n\n            :raises RequestError: could not receive the response's body\n        \"\"\"\n        raise NotImplementedError\n\n    def get_exception(self) -> YaDiskError:\n        \"\"\"\n            Convenience wrapper for :any:`yadisk.utils.get_exception`.\n\n            :returns: :any:`YaDiskError`\n        \"\"\"\n\n        try:\n            js = self.json()\n        except ValueError:\n            js = None\n\n        error = ErrorObject(js)\n\n        return get_exception(self, error)\n\n    def close(self) -> None:\n        \"\"\"\n            Closes the response and releases the underlying connection into the pool\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n        \"\"\"\n        raise NotImplementedError\n\n    def __enter__(self: _Self) -> _Self:\n        return self\n\n    def __exit__(self, *args, **kwargs) -> None:\n        \"\"\"Closes the response and releases the underlying connection into the pool\"\"\"\n        self.close()\n\n\nclass Session:\n    \"\"\"\n        HTTP session class. Maintains open connections, stores headers and\n        some other request parameters.\n\n        Must be explicitly closed (can be done using the `with` statement).\n    \"\"\"\n\n    _Self = TypeVar(\"_Self\", bound=\"Session\")\n\n    def send_request(self,\n                     method: HTTPMethod,\n                     url: str,\n                     *,\n                     params:  Optional[Dict[str, Any]] = None,\n                     data:    Optional[Payload] = None,\n                     timeout: TimeoutParameter = ...,\n                     headers: Optional[Headers] = None,\n                     stream:  bool = False,\n                     **kwargs) -> Response:\n        \"\"\"\n            Sends an HTTP request with given parameters.\n            In case an error occurs, the method should throw one of exceptions\n            derived from :any:`YaDiskError`.\n            Additional keyword arguments may be passed, they may be forwarded\n            to the underlying HTTP client without modification.\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n\n            :param method: `str`, HTTP method\n            :param url: `str`, URL\n            :param params: `dict`, GET parameters\n            :param data: `bytes`, an iterator or a file-like object, data to be sent in the request body\n            :param headers: `dict`, additional headers to be set\n            :param timeout: request timeout, a `tuple` of `(read timeout, connect timeout)`,\n                            `float` or `None` (no timeout)\n            :param stream: `bool`, if `False`, the response content will be immediately downloaded\n\n            :returns: :any:`Response`, response object\n        \"\"\"\n        raise NotImplementedError\n\n    def close(self) -> None:\n        \"\"\"\n            Closes the session.\n\n            .. note::\n               This is an abstract method that needs to be implemented.\n        \"\"\"\n        raise NotImplementedError\n\n    def __enter__(self: _Self) -> _Self:\n        return self\n\n    def __exit__(self, *args, **kwargs) -> None:\n        \"\"\"Closes the session.\"\"\"\n        return self.close()\n"
  },
  {
    "path": "src/yadisk/_typing_compat.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\n__all__ = [\n    \"AsyncGenerator\",\n    \"AsyncIterable\",\n    \"AsyncIterator\",\n    \"Awaitable\",\n    \"Callable\",\n    \"Coroutine\",\n    \"Dict\",\n    \"Generator\",\n    \"Iterable\",\n    \"Iterator\",\n    \"List\",\n    \"Mapping\",\n    \"Set\",\n    \"Tuple\",\n    \"Type\",\n    \"TypeAlias\"\n]\n\nimport sys\n\nif sys.version_info >= (3, 10):\n    from typing import TypeAlias\nelse:\n    from typing_extensions import TypeAlias\n\nfrom typing import TYPE_CHECKING\n\nif sys.version_info < (3, 10):\n    from typing import (\n        List, Dict, Set, Tuple, Callable, Iterable, Generator, AsyncGenerator,\n        Coroutine, Awaitable, AsyncIterable, Iterator, AsyncIterator, Mapping,\n        Type\n    )\nelse:\n    from collections.abc import (\n        Callable, Iterable, Generator, AsyncGenerator, Coroutine, Awaitable,\n        AsyncIterable, Iterator, AsyncIterator, Mapping\n    )\n\n    if TYPE_CHECKING:  # pragma: no cover\n        from typing import List, Dict, Set, Tuple, Type\n    else:\n        # mypy complains about this\n        List = list\n        Dict = dict\n        Set = set\n        Tuple = tuple\n        Type = type\n"
  },
  {
    "path": "src/yadisk/exceptions.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2025 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\n__all__ = [\n    \"AsyncOperationFailedError\",\n    \"AsyncOperationPollingTimeoutError\",\n    \"AuthorizationPendingError\",\n    \"BadGatewayError\",\n    \"BadRequestError\",\n    \"BadVerificationCodeError\",\n    \"ConflictError\",\n    \"DirectoryExistsError\",\n    \"FieldValidationError\",\n    \"ForbiddenError\",\n    \"GatewayTimeoutError\",\n    \"GoneError\",\n    \"InsufficientStorageError\",\n    \"InternalServerError\",\n    \"InvalidClientError\",\n    \"InvalidGrantError\",\n    \"InvalidResponseError\",\n    \"LockedError\",\n    \"MD5DifferError\",\n    \"NotAcceptableError\",\n    \"NotFoundError\",\n    \"OperationNotFoundError\",\n    \"ParentNotFoundError\",\n    \"PasswordRequiredError\",\n    \"PathExistsError\",\n    \"PathNotFoundError\",\n    \"PayloadTooLargeError\",\n    \"RequestError\",\n    \"RequestTimeoutError\",\n    \"ResourceDownloadLimitExceededError\",\n    \"ResourceIsLockedError\",\n    \"RetriableYaDiskError\",\n    \"TooManyRedirectsError\",\n    \"TooManyRequestsError\",\n    \"UnauthorizedError\",\n    \"UnavailableError\",\n    \"UnknownYaDiskError\",\n    \"UnsupportedMediaError\",\n    \"UnsupportedTokenTypeError\",\n    \"UploadTrafficLimitExceededError\",\n    \"WrongResourceTypeError\",\n    \"YaDiskConnectionError\",\n    \"YaDiskError\"\n]\n\nfrom .types import AnyResponse\nfrom typing import Optional\n\n\nclass YaDiskError(Exception):\n    \"\"\"\n        Base class for all exceptions in this library.\n\n        :ivar error_type: `str`, unique error code as returned by API\n        :ivar response: an instance of :any:`Response` or :any:`AsyncResponse`\n        :ivar disable_retry: `bool`, if set to :code:`True`, exception will not\n                             trigger a retry in :any:`utils.auto_retry()`\n\n        :param error_type: `str`, unique error code as returned by API\n        :param msg: `str`, exception message\n        :param response: an instance of :any:`Response` or :any:`AsyncResponse`\n        :param disable_retry: `bool`, if set to :code:`True`, exception will not\n                              trigger a retry in :any:`utils.auto_retry()`\n    \"\"\"\n\n    error_type: Optional[str]\n    response: Optional[AnyResponse]\n    disable_retry: bool\n\n    def __init__(\n        self,\n        error_type: Optional[str] = None,\n        msg: str = \"\",\n        response: Optional[AnyResponse] = None,\n        disable_retry: bool = False\n    ) -> None:\n        Exception.__init__(self, msg)\n\n        self.error_type = error_type\n        self.response = response\n        self.disable_retry = disable_retry\n\n\nclass RequestError(YaDiskError):\n    \"\"\"\n        Generic exception class for cases when a request could not be sent or\n        response could not be received.\n    \"\"\"\n\n    def __init__(self, msg: str = \"\", disable_retry: bool = False):\n        YaDiskError.__init__(self, None, msg, disable_retry=disable_retry)\n\n\nclass YaDiskConnectionError(RequestError):\n    \"\"\"Thrown when a connection error occured.\"\"\"\n    pass\n\n\nclass TooManyRedirectsError(RequestError):\n    \"\"\"Thrown when there were too many redirects.\"\"\"\n    pass\n\n\nclass RequestTimeoutError(RequestError):\n    \"\"\"Thrown when a request timed out.\"\"\"\n    pass\n\n\nclass WrongResourceTypeError(YaDiskError):\n    \"\"\"Thrown when the resource was expected to be of different type (e.g., file instead of directory).\"\"\"\n\n    def __init__(self, msg: str = \"\") -> None:\n        YaDiskError.__init__(self, None, msg, None)\n\n\nclass RetriableYaDiskError(YaDiskError):\n    \"\"\"Thrown when there was an error but it would make sense to retry the request.\"\"\"\n    pass\n\n\nclass AsyncOperationFailedError(RetriableYaDiskError):\n    \"\"\"Raised when an asynchronous operation fails\"\"\"\n\n    def __init__(self, msg: str = \"\") -> None:\n        YaDiskError.__init__(self, None, msg, None)\n\n\nclass AsyncOperationPollingTimeoutError(YaDiskError):\n    \"\"\"Raised when a polling timeout occured while waiting for an asynchronous operation\"\"\"\n\n    def __init__(self, msg: str = \"\") -> None:\n        YaDiskError.__init__(self, None, msg, None)\n\n\nclass UnknownYaDiskError(RetriableYaDiskError):\n    \"\"\"Thrown when the request failed but the response does not contain any error info.\"\"\"\n\n    def __init__(\n        self,\n        msg: str= \"\",\n        response: Optional[AnyResponse] = None,\n        disable_retry: bool = False\n    ) -> None:\n        RetriableYaDiskError.__init__(self, None, msg, response, disable_retry=disable_retry)\n\n\nclass BadRequestError(YaDiskError):\n    \"\"\"Thrown when the server returns code 400.\"\"\"\n    pass\n\n\nclass UnauthorizedError(YaDiskError):\n    \"\"\"Thrown when the server returns code 401.\"\"\"\n    pass\n\n\nclass ForbiddenError(YaDiskError):\n    \"\"\"Thrown when the server returns code 403.\"\"\"\n    pass\n\n\nclass NotFoundError(YaDiskError):\n    \"\"\"Thrown when the server returns code 404.\"\"\"\n    pass\n\n\nclass NotAcceptableError(YaDiskError):\n    \"\"\"Thrown when the server returns code 406.\"\"\"\n    pass\n\n\nclass ConflictError(YaDiskError):\n    \"\"\"Thrown when the server returns code 409.\"\"\"\n    pass\n\n\nclass GoneError(YaDiskError):\n    \"\"\"Raised when the server returns code 410.\"\"\"\n    pass\n\n\nclass PayloadTooLargeError(YaDiskError):\n    \"\"\"Thrown when the server returns code 413.\"\"\"\n    pass\n\n\nclass UnsupportedMediaError(YaDiskError):\n    \"\"\"Thrown when the server returns code 415.\"\"\"\n    pass\n\n\nclass LockedError(YaDiskError):\n    \"\"\"Thrown when the server returns code 423.\"\"\"\n    pass\n\n\nclass UploadTrafficLimitExceededError(LockedError):\n    \"\"\"Thrown when upload limit has been exceeded.\"\"\"\n    pass\n\n\nclass TooManyRequestsError(YaDiskError):\n    \"\"\"Thrown when the server returns code 429.\"\"\"\n    pass\n\n\nclass ResourceDownloadLimitExceededError(TooManyRequestsError):\n    \"\"\"Raised when the download limit for a resource is exceeded.\"\"\"\n    pass\n\n\nclass InternalServerError(RetriableYaDiskError):\n    \"\"\"Thrown when the server returns code 500.\"\"\"\n    pass\n\n\nclass BadGatewayError(RetriableYaDiskError):\n    \"\"\"Thrown when the server returns code 502\"\"\"\n    pass\n\n\nclass UnavailableError(RetriableYaDiskError):\n    \"\"\"Thrown when the server returns code 503.\"\"\"\n    pass\n\n\nclass GatewayTimeoutError(RetriableYaDiskError):\n    \"\"\"Thrown when the server returns code 504\"\"\"\n    pass\n\n\nclass InsufficientStorageError(YaDiskError):\n    \"\"\"Thrown when the server returns code 507.\"\"\"\n    pass\n\n\nclass PathNotFoundError(NotFoundError):\n    \"\"\"Thrown when the requested path does not exist.\"\"\"\n    pass\n\n\nclass ParentNotFoundError(ConflictError):\n    \"\"\"Thrown by `mkdir`, `upload`, etc. when the parent directory doesn't exist.\"\"\"\n    pass\n\n\nclass PathExistsError(ConflictError):\n    \"\"\"Thrown when the requested path already exists.\"\"\"\n    pass\n\n\nclass DirectoryExistsError(PathExistsError):\n    \"\"\"Thrown when the directory already exists.\"\"\"\n    pass\n\n\nclass FieldValidationError(BadRequestError):\n    \"\"\"Thrown when the request contains fields with invalid data.\"\"\"\n    pass\n\n\nclass ResourceIsLockedError(LockedError):\n    \"\"\"Thrown when the resource is locked by another operation.\"\"\"\n    pass\n\n\nclass MD5DifferError(ConflictError):\n    \"\"\"Thrown when the MD5 hash of the file to be deleted doesn't match with the actual one.\"\"\"\n    pass\n\n\nclass OperationNotFoundError(NotFoundError):\n    \"\"\"Thrown by `get_operation_status()` when the operation doesn't exist.\"\"\"\n    pass\n\n\nclass InvalidResponseError(YaDiskError):\n    \"\"\"Thrown when Yandex.Disk did not return a JSON response or if it's invalid.\"\"\"\n    pass\n\n\nclass AuthorizationPendingError(BadRequestError):\n    \"\"\"Thrown when authorization is currently pending, the application has to wait.\"\"\"\n    pass\n\n\nclass InvalidClientError(BadRequestError):\n    \"\"\"Thrown when an invalid client ID or client secret was provided\"\"\"\n    pass\n\n\nclass InvalidGrantError(BadRequestError):\n    \"\"\"Thrown when a verification code is expired or invalid\"\"\"\n    pass\n\n\nclass BadVerificationCodeError(BadRequestError):\n    \"\"\"Thrown when a verification code has invalid format\"\"\"\n    pass\n\n\nclass UnsupportedTokenTypeError(BadRequestError):\n    \"\"\"Thrown when the specified token cannot be used in a request\"\"\"\n    pass\n\n\nclass PasswordRequiredError(ForbiddenError):\n    \"\"\"Thrown when a password is required to access the resource\"\"\"\n    pass\n"
  },
  {
    "path": "src/yadisk/objects/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom ._yadisk_object import *\nfrom ._error_object import *\nfrom ._link_object import *\nfrom ._disk import *\nfrom ._resources import *\nfrom ._operations import *\nfrom ._auth import *\n\n__all__ = [  # noqa: RUF022\n    # _yadisk_object\n    \"YaDiskObject\",\n\n    # _error_object\n    \"ErrorObject\",\n\n    # _link_object\n    \"LinkObject\",\n\n    # _disk\n    \"DiskInfoObject\",\n    \"SystemFoldersObject\",\n    \"UserObject\",\n    \"UserPublicInfoObject\",\n\n    # _resources\n    \"CommentIDsObject\",\n    \"EXIFObject\",\n    \"FilesResourceListObject\",\n    \"SyncFilesResourceListObject\",\n    \"AsyncFilesResourceListObject\",\n    \"LastUploadedResourceListObject\",\n    \"SyncLastUploadedResourceListObject\",\n    \"AsyncLastUploadedResourceListObject\",\n    \"PublicResourcesListObject\",\n    \"SyncPublicResourcesListObject\",\n    \"AsyncPublicResourcesListObject\",\n    \"ResourceListObject\",\n    \"SyncResourceListObject\",\n    \"AsyncResourceListObject\",\n    \"ResourceObject\",\n    \"SyncResourceObject\",\n    \"AsyncResourceObject\",\n    \"ResourceUploadLinkObject\",\n    \"ShareInfoObject\",\n    \"PublicResourceObject\",\n    \"SyncPublicResourceObject\",\n    \"AsyncPublicResourceObject\",\n    \"PublicResourceListObject\",\n    \"SyncPublicResourceListObject\",\n    \"AsyncPublicResourceListObject\",\n    \"TrashResourceObject\",\n    \"SyncTrashResourceObject\",\n    \"AsyncTrashResourceObject\",\n    \"TrashResourceListObject\",\n    \"SyncTrashResourceListObject\",\n    \"AsyncTrashResourceListObject\",\n    \"ResourceLinkObject\",\n    \"SyncResourceLinkObject\",\n    \"AsyncResourceLinkObject\",\n    \"PublicResourceLinkObject\",\n    \"SyncPublicResourceLinkObject\",\n    \"AsyncPublicResourceLinkObject\",\n    \"ResourceDownloadLinkObject\",\n    \"PublicSettingsObject\",\n    \"PublicAvailableSettingsObject\",\n    \"PublicAccessObject\",\n    \"PublicDefaultObject\",\n    \"ExternalOrganizationIdVerboseObject\",\n    \"PasswordVerboseObject\",\n    \"PublicAccessObject\",\n    \"ExternalOrganizationIdVerboseObject\",\n    \"AvailableUntilVerboseObject\",\n\n    # _operations\n    \"OperationStatusObject\",\n    \"OperationLinkObject\",\n    \"SyncOperationLinkObject\",\n    \"AsyncOperationLinkObject\",\n\n    # _auth\n    \"TokenObject\",\n    \"TokenRevokeStatusObject\",\n    \"DeviceCodeObject\"\n]\n"
  },
  {
    "path": "src/yadisk/objects/_auth.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom ._yadisk_object import YaDiskObject\nfrom .._common import str_or_error, int_or_error\n\nfrom typing import Any, Optional\n\n__all__ = [\"DeviceCodeObject\", \"TokenObject\", \"TokenRevokeStatusObject\"]\n\n\nclass TokenObject(YaDiskObject):\n    \"\"\"\n        Token object.\n\n        :param token: `dict` or `None`\n        :param yadisk: :any:`YaDisk` or `None`, `YaDisk` object\n\n        :ivar access_token: `str`, token string\n        :ivar refresh_token: `str`, the refresh-token\n        :ivar token_type: `str`, type of the token\n        :ivar expires_in: `int`, amount of time before the token expires\n        :ivar scope: `str`, list of rights requested by the application,\n                     returned only if the token has a smaller set of rights\n                     than requested\n    \"\"\"\n\n    access_token: Optional[str]\n    refresh_token: Optional[str]\n    token_type: Optional[str]\n    expires_in: Optional[int]\n    scope: Optional[str]\n\n    def __init__(self, token: Optional[dict] = None, yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"access_token\":  str_or_error,\n             \"refresh_token\": str_or_error,\n             \"token_type\":    str_or_error,\n             \"expires_in\":    int_or_error,\n             \"scope\":         str_or_error},\n            yadisk)\n\n        self.import_fields(token)\n\n\nclass TokenRevokeStatusObject(YaDiskObject):\n    \"\"\"\n        Result of token revocation request.\n\n        :param token_revoke_status: `dict` or `None`\n        :param yadisk: :any:`YaDisk` or `None`, `YaDisk` object\n\n        :ivar status: `str`, status of the operation\n    \"\"\"\n\n    status: Optional[str]\n\n    def __init__(self,\n                 token_revoke_status: Optional[dict] = None,\n                 yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(self, {\"status\": str_or_error}, yadisk)\n\n        self.import_fields(token_revoke_status)\n\n\nclass DeviceCodeObject(YaDiskObject):\n    \"\"\"\n        Result of :any:`Client.get_device_code()` / :any:`AsyncClient.get_device_code()`.\n\n        :param device_code_object: `dict` or `None`\n        :param yadisk: :any:`YaDisk` or `None`, `YaDisk` object\n\n        :ivar device_code: `str`, device code that can be used for obtaining the token\n        :ivar user_code: `str`, code that the user should enter on the OAuth page\n        :ivar verification_url: `str`, URL of the OAuth page where user is\n                                expected to enter the :code:`user_code`\n        :ivar interval: `int`, the minimum interval (in seconds) with which the\n                        app must request an OAuth token. If requests come more\n                        often, Yandex OAuth may respond with an error\n        :ivar expires_in: `int`, amount of time before the codes expire\n    \"\"\"\n\n    device_code:      Optional[str]\n    user_code:        Optional[str]\n    verification_url: Optional[str]\n    interval:         Optional[int]\n    expires_in:       Optional[int]\n\n    def __init__(self,\n                 device_code_object: Optional[dict] = None,\n                 yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\n                \"device_code\":      str_or_error,\n                \"user_code\":        str_or_error,\n                \"verification_url\": str_or_error,\n                \"interval\":         int_or_error,\n                \"expires_in\":       int_or_error\n            },\n            yadisk)\n\n        self.import_fields(device_code_object)\n"
  },
  {
    "path": "src/yadisk/objects/_disk.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom functools import partial\nfrom ._yadisk_object import YaDiskObject\nfrom .._typing_compat import Dict\nfrom .._common import str_or_error, bool_or_error, int_or_error, yandex_date\n\nfrom typing import Any, Optional, NoReturn, TYPE_CHECKING\n\nif TYPE_CHECKING:  # pragma: no cover\n    import datetime\n\n__all__ = [\"DiskInfoObject\", \"SystemFoldersObject\", \"UserObject\", \"UserPublicInfoObject\"]\n\n\nclass DiskInfoObject(YaDiskObject):\n    \"\"\"\n        Disk information object.\n\n        :param disk_info: `dict` or `None`\n        :param yadisk: :any:`YaDisk` or `None`, `YaDisk` object\n\n        :ivar deletion_restriction_days: `int`, number of days before file deletion after account lock\n        :ivar free_photounlim_end_date: `int`, timestamp in ms of expiration date\n            of unlimited photo upload\n        :ivar hide_screenshots_in_photoslice: `bool`, tells whether the\n            screenshots are hidden in photoslice\n        :ivar is_idm_managed_folder_address_access: `bool`, not clear what this is for\n        :ivar is_idm_managed_public_access: `bool`, not clear what this is for\n        :ivar is_legal_entity: `bool`, tells if the account belongs to a legal entity\n        :ivar is_paid: `bool`, tells if the account is paid or not\n        :ivar max_file_size: `int`, maximum supported file size (bytes)\n        :ivar paid_max_file_size: `int`, maximum supported file size for a paid account (bytes)\n        :ivar payment_flow: `bool`, tells if the user is involved in `payment_flow`\n        :ivar photounlim_size: `int`, total file size in unlimited photos\n        :ivar reg_time: :any:`datetime.datetime`, Disk registration date\n        :ivar revision: `int`, current revision of Yandex.Disk\n        :ivar system_folders: :any:`SystemFoldersObject`, paths to the system folders\n        :ivar total_space: `int`, total disk size (bytes)\n        :ivar trash_size: `int`, amount of space used by trash (bytes), part of `used_space`\n        :ivar unlimited_autoupload_enabled: `bool`, tells whether unlimited\n            autoupload from mobile devices is enabled\n        :ivar used_space: `int`, amount of space used (bytes)\n        :ivar user: :any:`UserObject`, owner of the disk\n        :ivar will_be_overdrawn: `bool`, tells if the user will be in overdraft\n            upon reaching `free_photounlim_end_date`\n    \"\"\"\n\n    deletion_restriction_days:            Optional[int]\n    free_photounlim_end_date:             Optional[int]\n    hide_screenshots_in_photoslice:       Optional[bool]\n    is_idm_managed_folder_address_access: Optional[bool]\n    is_idm_managed_public_access:         Optional[bool]\n    is_legal_entity:                      Optional[bool]\n    is_paid:                              Optional[bool]\n    max_file_size:                        Optional[int]\n    paid_max_file_size:                   Optional[int]\n    payment_flow:                         Optional[bool]\n    photounlim_size:                      Optional[int]\n    reg_time:                             Optional[\"datetime.datetime\"]\n    revision:                             Optional[int]\n    system_folders:                       \"SystemFoldersObject\"\n    total_space:                          Optional[int]\n    trash_size:                           Optional[int]\n    unlimited_autoupload_enabled:         Optional[bool]\n    used_space:                           Optional[int]\n    user:                                 \"UserObject\"\n    will_be_overdrawn:                    Optional[bool]\n\n    def __init__(self, disk_info: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"deletion_restriction_days\":            int_or_error,\n                \"free_photounlim_end_date\":             int_or_error,\n                \"hide_screenshots_in_photoslice\":       bool_or_error,\n                \"is_idm_managed_folder_address_access\": bool_or_error,\n                \"is_idm_managed_public_access\":         bool_or_error,\n                \"is_legal_entity\":                      bool_or_error,\n                \"is_paid\":                              bool_or_error,\n                \"max_file_size\":                        int_or_error,\n                \"paid_max_file_size\":                   int_or_error,\n                \"payment_flow\":                         bool_or_error,\n                \"photounlim_size\":                      int_or_error,\n                \"reg_time\":                             yandex_date,\n                \"revision\":                             int_or_error,\n                \"system_folders\":                       partial(SystemFoldersObject, yadisk=yadisk),\n                \"total_space\":                          int_or_error,\n                \"trash_size\":                           int_or_error,\n                \"unlimited_autoupload_enabled\":         bool_or_error,\n                \"used_space\":                           int_or_error,\n                \"user\":                                 partial(UserObject, yadisk=yadisk),\n                \"will_be_overdrawn\":                    bool_or_error\n            },\n            yadisk\n        )\n\n        self.import_fields(disk_info)\n\n\nclass SystemFoldersObject(YaDiskObject):\n    \"\"\"\n        Object, containing paths to system folders.\n\n        :param system_folders: `dict` or `None`\n        :param yadisk: :any:`YaDisk` or `None`, `YaDisk` object\n\n        :ivar odnoklassniki: `str`, path to the Odnoklassniki folder\n        :ivar google: `str`, path to the Google+ folder\n        :ivar instagram: `str`, path to the Instagram folder\n        :ivar vkontakte: `str`, path to the VKontakte folder\n        :ivar attach: `str`, path to the mail attachments folder\n        :ivar mailru: `str`, path to the My World folder\n        :ivar downloads: `str`, path to the Downloads folder\n        :ivar applications: `str` path to the Applications folder\n        :ivar facebook: `str`, path to the Facebook folder\n        :ivar social: `str`, path to the social networks folder\n        :ivar messenger: `str`, path to the Messenger Files folder\n        :ivar calendar: `str`, path to the Meeting Materials folder\n        :ivar photostream: `str`, path to the camera folder\n        :ivar screenshots: `str`, path to the screenshot folder\n        :ivar scans: `str`, path to the Scans folder\n    \"\"\"\n\n    odnoklassniki: Optional[str]\n    google:        Optional[str]\n    instagram:     Optional[str]\n    vkontakte:     Optional[str]\n    attach:        Optional[str]\n    mailru:        Optional[str]\n    downloads:     Optional[str]\n    applications:  Optional[str]\n    facebook:      Optional[str]\n    social:        Optional[str]\n    messenger:     Optional[str]\n    calendar:      Optional[str]\n    photostream:   Optional[str]\n    screenshots:   Optional[str]\n    scans:         Optional[str]\n\n    def __init__(\n        self,\n        system_folders: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\"odnoklassniki\": str_or_error,\n             \"google\":        str_or_error,\n             \"instagram\":     str_or_error,\n             \"vkontakte\":     str_or_error,\n             \"attach\":        str_or_error,\n             \"mailru\":        str_or_error,\n             \"downloads\":     str_or_error,\n             \"applications\":  str_or_error,\n             \"facebook\":      str_or_error,\n             \"social\":        str_or_error,\n             \"messenger\":     str_or_error,\n             \"calendar\":      str_or_error,\n             \"photostream\":   str_or_error,\n             \"screenshots\":   str_or_error,\n             \"scans\":         str_or_error},\n            yadisk)\n\n        self.import_fields(system_folders)\n\n\nclass UserObject(YaDiskObject):\n    \"\"\"\n        User object.\n\n        :param user: `dict` or `None`\n        :param yadisk: :any:`YaDisk` or `None`, `YaDisk` object\n\n        :ivar reg_time: :any:`datetime.datetime`, Disk registration date\n        :ivar display_name: `str`, user's display name\n        :ivar uid: `str`, user's UID\n        :ivar country: `str`, user's country\n        :ivar is_child: `bool`, tells whether it's a child account\n        :ivar login: `str`, user's login\n    \"\"\"\n\n    reg_time:     Optional[\"datetime.datetime\"]\n    display_name: Optional[str]\n    uid:          Optional[str]\n    country:      Optional[str]\n    is_child:     Optional[bool]\n    login:        Optional[str]\n\n    def __init__(\n        self,\n        user: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"reg_time\":     yandex_date,\n                \"display_name\": str_or_error,\n                \"uid\":          str_or_error,\n                \"country\":      str_or_error,\n                \"is_child\":     bool_or_error,\n                \"login\":        str_or_error\n            },\n            yadisk\n        )\n\n        self.import_fields(user)\n\n\nclass UserPublicInfoObject(UserObject):\n    \"\"\"\n        Public user information object.\n        Inherits from :any:`UserObject` for compatibility.\n\n        :param public_user_info: `dict` or `None`\n        :param yadisk: :any:`YaDisk` or `None`, `YaDisk` object\n\n        :ivar login: `str`, user's login\n        :ivar display_name: `str`, user's display name\n        :ivar uid: `str`, user's UID\n    \"\"\"\n\n    country: NoReturn  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(\n        self,\n        public_user_info: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        UserObject.__init__(self, None, yadisk)\n        self.remove_field(\"country\")\n        self.import_fields(public_user_info)\n"
  },
  {
    "path": "src/yadisk/objects/_error_object.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom ._yadisk_object import YaDiskObject\n\n__all__ = [\"ErrorObject\"]\n\n\nclass ErrorObject(YaDiskObject):\n    \"\"\"\n        Mirrors Yandex.Disk REST API error object.\n\n        :param error: `dict` or `None`\n        :param yadisk: `YaDisk` or `None`, `YaDisk` object\n\n        :ivar message: `str`, human-readable error message\n        :ivar description: `str`, technical error description\n        :ivar error: `str`, error code\n    \"\"\"\n\n    def __init__(self, error=None, yadisk=None):\n        YaDiskObject.__init__(\n            self,\n            {\"message\":     str,\n             \"description\": str,\n             \"error\":       str},\n            yadisk)\n        self.set_alias(\"error_description\", \"message\")\n        self.import_fields(error)\n"
  },
  {
    "path": "src/yadisk/objects/_link_object.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom ._yadisk_object import YaDiskObject\n\nfrom typing import Any, Optional\n\nfrom .._common import str_or_error, bool_or_error\n\n__all__ = [\"LinkObject\"]\n\n\nclass LinkObject(YaDiskObject):\n    \"\"\"\n        Link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n    \"\"\"\n\n    href: Optional[str]\n    method: Optional[str]\n    templated: Optional[bool]\n\n    def __init__(self,\n                 link: Optional[dict] = None,\n                 yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"href\":      str_or_error,\n             \"method\":    str_or_error,\n             \"templated\": bool_or_error},\n            yadisk)\n\n        self.import_fields(link)\n"
  },
  {
    "path": "src/yadisk/objects/_operations.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom ._yadisk_object import YaDiskObject\nfrom ._link_object import LinkObject\nfrom .._common import str_or_error\nfrom ..types import OperationStatus\n\nfrom typing import Any, Optional\n\n__all__ = [\n    \"AsyncOperationLinkObject\",\n    \"OperationLinkObject\",\n    \"OperationStatusObject\",\n    \"SyncOperationLinkObject\"\n]\n\n\nclass OperationStatusObject(YaDiskObject):\n    \"\"\"\n        Operation status object.\n\n        :param operation_status: `dict` or `None`\n        :param yadisk: :any:`YaDisk` or `None`, `YaDisk` object\n\n        :ivar status: `str`, status of the operation\n    \"\"\"\n\n    status: OperationStatus\n\n    def __init__(self,\n                 operation_status: Optional[dict] = None,\n                 yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"status\": str_or_error},\n            yadisk)\n\n        self.import_fields(operation_status)\n\n\nclass OperationLinkObject(LinkObject):\n    \"\"\"\n        Operation link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n    \"\"\"\n\n    pass\n\n\nclass SyncOperationLinkObject(OperationLinkObject):\n    \"\"\"\n        Operation link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n    \"\"\"\n\n    def get_status(self, **kwargs) -> OperationStatus:\n        \"\"\"\n            Get operation status.\n\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises OperationNotFoundError: requested operation was not found\n\n            :returns: `str`, :code:`\"in-progress\"` indicates that the operation\n                      is currently running, :code:`\"success\"` indicates that\n                      the operation was successful, :code:`\"failed\"` means that\n                      the operation failed\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.href is None:\n            raise ValueError(\"OperationLinkObject has no link\")\n\n        return self._yadisk.get_operation_status(self.href, **kwargs)\n\n    def wait(self, **kwargs) -> None:\n        \"\"\"\n            Wait until an operation is completed. If the operation fails, an\n            exception is raised. Waiting is performed by calling :any:`time.sleep`.\n\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.href is None:\n            raise ValueError(\"OperationLinkObject has no link\")\n\n        return self._yadisk.wait_for_operation(self.href, **kwargs)\n\n\nclass AsyncOperationLinkObject(OperationLinkObject):\n    \"\"\"\n        Operation link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n    \"\"\"\n\n    async def get_status(self, **kwargs) -> OperationStatus:\n        \"\"\"\n            Get operation status.\n\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises OperationNotFoundError: requested operation was not found\n\n            :returns: `str`, :code:`\"in-progress\"` indicates that the operation\n                      is currently running, :code:`\"success\"` indicates that\n                      the operation was successful, :code:`\"failed\"` means that\n                      the operation failed\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.href is None:\n            raise ValueError(\"OperationLinkObject has no link\")\n\n        return await self._yadisk.get_operation_status(self.href, **kwargs)\n\n    async def wait(self, **kwargs) -> None:\n        \"\"\"\n            Wait until an operation is completed. If the operation fails, an\n            exception is raised. Waiting is performed by calling :any:`asyncio.sleep`.\n\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.href is None:\n            raise ValueError(\"OperationLinkObject has no link\")\n\n        return await self._yadisk.wait_for_operation(self.href, **kwargs)\n"
  },
  {
    "path": "src/yadisk/objects/_operations.pyi",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import Optional, Any\nfrom .._typing_compat import Dict, Tuple, Type\n\nfrom ._yadisk_object import YaDiskObject\nfrom ._link_object import LinkObject\n\nfrom ..types import OperationStatus, TimeoutParameter, Headers\n\n__all__ = [\n    \"AsyncOperationLinkObject\",\n    \"OperationLinkObject\",\n    \"OperationStatusObject\",\n    \"SyncOperationLinkObject\"\n]\n\n\nclass OperationStatusObject(YaDiskObject):\n    status: OperationStatus\n\n    def __init__(self,\n                 operation_status: Optional[dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\nclass OperationLinkObject(LinkObject):\n    ...\n\nclass SyncOperationLinkObject(OperationLinkObject):\n    def get_status(\n        self,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> OperationStatus: ...\n\n    def wait(\n        self,\n        *,\n        poll_interval: float = ...,\n        poll_timeout: Optional[float] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n\n\nclass AsyncOperationLinkObject(OperationLinkObject):\n    async def get_status(\n        self,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> OperationStatus: ...\n\n    async def wait(\n        self,\n        *,\n        poll_interval: float = ...,\n        poll_timeout: Optional[float] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> None:\n        ...\n"
  },
  {
    "path": "src/yadisk/objects/_resources.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom functools import partial\nfrom pathlib import PurePosixPath\nfrom urllib.parse import urlencode, urlparse, parse_qs\n\nfrom ._yadisk_object import YaDiskObject\nfrom ._link_object import LinkObject\nfrom ._disk import UserPublicInfoObject\nfrom .._common import (\n    typed_list, yandex_date, is_resource_link, is_public_resource_link,\n    ensure_path_has_scheme, str_or_error, int_or_error, float_or_error,\n    bool_or_error, dict_or_error, str_or_dict_or_error\n)\nfrom ..types import (\n    JSON, AsyncFileOrPath, AsyncFileOrPathDestination, FileOrPath,\n    FileOrPathDestination\n)\n\nfrom .. import settings\n\nfrom typing import (\n    TYPE_CHECKING, Any, Literal, overload, Union, Protocol, Optional\n)\n\nfrom .._typing_compat import Generator, Dict, List, AsyncGenerator\n\nif TYPE_CHECKING:  # pragma: no cover\n    import datetime\n    from ._operations import (\n        OperationLinkObject, AsyncOperationLinkObject, SyncOperationLinkObject\n    )\n\n__all__ = [\n    \"AsyncFilesResourceListObject\",\n    \"AsyncLastUploadedResourceListObject\",\n    \"AsyncPublicResourceLinkObject\",\n    \"AsyncPublicResourceListObject\",\n    \"AsyncPublicResourceObject\",\n    \"AsyncPublicResourcesListObject\",\n    \"AsyncResourceLinkObject\",\n    \"AsyncResourceListObject\",\n    \"AsyncResourceObject\",\n    \"AsyncTrashResourceListObject\",\n    \"AsyncTrashResourceObject\",\n    \"AvailableUntilVerboseObject\",\n    \"CommentIDsObject\",\n    \"EXIFObject\",\n    \"ExternalOrganizationIdVerboseObject\",\n    \"FilesResourceListObject\",\n    \"LastUploadedResourceListObject\",\n    \"PasswordVerboseObject\",\n    \"PublicAccessObject\",\n    \"PublicAvailableSettingsObject\",\n    \"PublicDefaultObject\",\n    \"PublicResourceLinkObject\",\n    \"PublicResourceListObject\",\n    \"PublicResourceObject\",\n    \"PublicResourcesListObject\",\n    \"PublicSettingsObject\",\n    \"ResourceDownloadLinkObject\",\n    \"ResourceLinkObject\",\n    \"ResourceListObject\",\n    \"ResourceObject\",\n    \"ResourceUploadLinkObject\",\n    \"ShareInfoObject\",\n    \"SyncFilesResourceListObject\",\n    \"SyncLastUploadedResourceListObject\",\n    \"SyncPublicResourceLinkObject\",\n    \"SyncPublicResourceListObject\",\n    \"SyncPublicResourceObject\",\n    \"SyncPublicResourcesListObject\",\n    \"SyncResourceLinkObject\",\n    \"SyncResourceListObject\",\n    \"SyncResourceObject\",\n    \"SyncTrashResourceListObject\",\n    \"SyncTrashResourceObject\",\n    \"TrashResourceListObject\",\n    \"TrashResourceObject\",\n]\n\n\nclass CommentIDsObject(YaDiskObject):\n    \"\"\"\n        Comment IDs object.\n\n        :param comment_ids: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar private_resource: `str`, comment ID for private resources\n        :ivar public_resource: `str`, comment ID for public resources\n    \"\"\"\n\n    private_resource: Optional[str]\n    public_resource: Optional[str]\n\n    def __init__(self,\n                 comment_ids: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"private_resource\": str_or_error,\n             \"public_resource\":  str_or_error},\n            yadisk)\n\n        self.import_fields(comment_ids)\n\n\nclass EXIFObject(YaDiskObject):\n    \"\"\"\n        EXIF metadata object.\n\n        :param exif: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar date_time: :any:`datetime.datetime`, capture date\n        :ivar gps_longitude: `float`, longitude of the photo's location\n        :ivar gps_latitude: `float`, latitude of the photo's location\n    \"\"\"\n\n    date_time:     Optional[\"datetime.datetime\"]\n    gps_longitude: Optional[float]\n    gps_latitude:  Optional[float]\n\n    def __init__(\n        self,\n        exif: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"date_time\": yandex_date,\n                \"gps_longitude\": float_or_error,\n                \"gps_latitude\": float_or_error\n            },\n            yadisk\n        )\n\n        self.import_fields(exif)\n\n\nclass FilesResourceListObject(YaDiskObject):\n    \"\"\"\n        Flat list of files.\n\n        :param files_resource_list: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar items: `list`, flat list of files (:any:`ResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n    \"\"\"\n\n    items: Optional[List[\"ResourceObject\"]]\n    limit: Optional[int]\n    offset: Optional[int]\n\n    def __init__(self,\n                 files_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"items\":  typed_list(partial(ResourceObject, yadisk=yadisk)),\n             \"limit\":  int_or_error,\n             \"offset\": int_or_error},\n            yadisk)\n\n        self.import_fields(files_resource_list)\n\n\nclass SyncFilesResourceListObject(FilesResourceListObject):\n    \"\"\"\n        Flat list of files.\n\n        :param files_resource_list: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar items: `list`, flat list of files (:any:`SyncResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n    \"\"\"\n\n    items: Optional[List[\"SyncResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 files_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        FilesResourceListObject.__init__(self, None, yadisk)\n\n        self.set_field_type(\"items\", typed_list(partial(SyncResourceObject, yadisk=yadisk)))\n        self.import_fields(files_resource_list)\n\n\nclass AsyncFilesResourceListObject(FilesResourceListObject):\n    \"\"\"\n        Flat list of files.\n\n        :param files_resource_list: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar items: `list`, flat list of files (:any:`AsyncResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n    \"\"\"\n\n    items: Optional[List[\"AsyncResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 files_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        FilesResourceListObject.__init__(self, None, yadisk)\n\n        self.set_field_type(\"items\", typed_list(partial(AsyncResourceObject, yadisk=yadisk)))\n        self.import_fields(files_resource_list)\n\n\nclass LastUploadedResourceListObject(YaDiskObject):\n    \"\"\"\n        List of last uploaded resources.\n\n        :param last_uploaded_resources_list: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar items: `list`, list of resources (:any:`ResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n    \"\"\"\n\n    items: Optional[List[\"ResourceObject\"]]\n    limit: Optional[int]\n\n    def __init__(self,\n                 last_uploaded_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"items\": typed_list(partial(ResourceObject, yadisk=yadisk)),\n             \"limit\": int_or_error},\n            yadisk)\n        self.import_fields(last_uploaded_resources_list)\n\n\nclass SyncLastUploadedResourceListObject(LastUploadedResourceListObject):\n    \"\"\"\n        List of last uploaded resources.\n\n        :param last_uploaded_resources_list: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar items: `list`, list of resources (:any:`SyncResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n    \"\"\"\n\n    items: Optional[List[\"SyncResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 last_uploaded_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        LastUploadedResourceListObject.__init__(self, None, yadisk)\n\n        self.set_field_type(\"items\", typed_list(partial(SyncResourceObject, yadisk=yadisk)))\n        self.import_fields(last_uploaded_resources_list)\n\n\nclass AsyncLastUploadedResourceListObject(LastUploadedResourceListObject):\n    \"\"\"\n        List of last uploaded resources.\n\n        :param last_uploaded_resources_list: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar items: `list`, list of resources (:any:`AsyncResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n    \"\"\"\n\n    items: Optional[List[\"AsyncResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 last_uploaded_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        LastUploadedResourceListObject.__init__(self, None, yadisk)\n\n        self.set_field_type(\"items\", typed_list(partial(AsyncResourceObject, yadisk=yadisk)))\n        self.import_fields(last_uploaded_resources_list)\n\n\nclass PublicResourcesListObject(YaDiskObject):\n    \"\"\"\n        List of public resources.\n\n        :param public_resources_list: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar items: `list`, list of public resources (:any:`PublicResourceObject`)\n        :ivar type: `str`, resource type to filter by\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n    \"\"\"\n\n    items: Optional[List[\"PublicResourceObject\"]]\n    type: Optional[str]\n    limit: Optional[int]\n    offset: Optional[int]\n\n    def __init__(self,\n                 public_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"items\":  typed_list(partial(PublicResourceObject, yadisk=yadisk)),\n             \"type\":   str_or_error,\n             \"limit\":  int_or_error,\n             \"offset\": int_or_error},\n            yadisk)\n\n        self.import_fields(public_resources_list)\n\n\nclass SyncPublicResourcesListObject(PublicResourcesListObject):\n    \"\"\"\n        List of public resources.\n\n        :param public_resources_list: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar items: `list`, list of public resources (:any:`SyncPublicResourceObject`)\n        :ivar type: `str`, resource type to filter by\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n    \"\"\"\n\n    items: Optional[List[\"SyncPublicResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 public_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        PublicResourcesListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"items\", typed_list(partial(SyncPublicResourceObject, yadisk=yadisk)))\n\n        self.import_fields(public_resources_list)\n\n\nclass AsyncPublicResourcesListObject(PublicResourcesListObject):\n    \"\"\"\n        List of public resources.\n\n        :param public_resources_list: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar items: `list`, list of public resources (:any:`AsyncPublicResourceObject`)\n        :ivar type: `str`, resource type to filter by\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n    \"\"\"\n\n    items: Optional[List[\"AsyncPublicResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 public_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        PublicResourcesListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"items\", typed_list(partial(AsyncPublicResourceObject, yadisk=yadisk)))\n\n        self.import_fields(public_resources_list)\n\n\nclass ResourceProtocol(Protocol):\n    @property\n    def type(self) -> Optional[str]: ...\n\n    @property\n    def path(self) -> Optional[str]: ...\n\n    @property\n    def public_key(self) -> Optional[str]: ...\n\n    @property\n    def public_url(self) -> Optional[str]: ...\n\n    @property\n    def file(self) -> Optional[str]: ...\n\n    @property\n    def _yadisk(self) -> Optional[Any]: ...\n\n\nclass ResourceObjectMethodsMixin:\n    def get_meta(self: ResourceProtocol,\n                 relative_path: Optional[str] = None, /, **kwargs) -> \"SyncResourceObject\":\n        \"\"\"\n            Get meta information about a file/directory.\n\n            :param relative_path: `str` or `None`, relative path from resource\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: :any:`SyncResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.get_meta(str(path), **kwargs)\n\n    def get_public_meta(self: ResourceProtocol, **kwargs) -> \"SyncPublicResourceObject\":\n        \"\"\"\n            Get meta-information about a public resource.\n\n            :param path: relative path to a resource in a public folder.\n            :param offset: offset from the beginning of the list of nested resources\n            :param limit: maximum number of nested elements to be included in the list\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param preview_size: file preview size\n            :param preview_crop: `bool`, allow preview crop\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: :any:`SyncPublicResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        public_key_or_url = self.public_key or self.public_url\n\n        if public_key_or_url is None:\n            raise ValueError(\"ResourceObject doesn't have a public_key/public_url\")\n\n        return self._yadisk.get_public_meta(public_key_or_url, **kwargs)\n\n    def exists(self: ResourceProtocol,\n               relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource exists.\n\n            :param relative_path: `str` or `None`, relative path from the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.exists(str(path), **kwargs)\n\n    def get_type(self: ResourceProtocol,\n                 relative_path: Optional[str] = None, /, **kwargs) -> str:\n        \"\"\"\n            Get resource type.\n\n            :param relative_path: relative path from the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.get_type(str(path), **kwargs)\n\n    def is_dir(self: ResourceProtocol,\n               relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource is a directory.\n\n            :param relative_path: relative path from the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.is_dir(str(path), **kwargs)\n\n    def is_file(self: ResourceProtocol,\n                relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource is a file.\n\n            :param relative_path: relative path from the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a file, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.is_file(str(path), **kwargs)\n\n    def listdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> Generator[\"SyncResourceObject\", None, None]:\n        \"\"\"\n            Get contents of the resource.\n\n            :param relative_path: relative path from resource\n            :param limit: number of children resources to be included in the response\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: generator of :any:`SyncResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.listdir(str(path), **kwargs)\n\n    def public_listdir(\n        self: ResourceProtocol,\n        **kwargs\n    ) -> Generator[\"SyncPublicResourceObject\", None, None]:\n        \"\"\"\n            Get contents of a public directory.\n\n            :param path: relative path to the resource in the public folder.\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: generator of :any:`SyncPublicResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        public_key_or_url = self.public_key or self.public_url\n\n        if public_key_or_url is None:\n            raise ValueError(\"ResourceObject doesn't have a public_key/public_url\")\n\n        return self._yadisk.public_listdir(public_key_or_url, **kwargs)\n\n    def get_upload_link(self: ResourceProtocol,\n                        relative_path: Optional[str] = None, /, **kwargs) -> str:\n        \"\"\"\n            Get a link to upload the file using the PUT request.\n\n            :param relative_path: `str` or `None`, relative path to the resource\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: `str`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.get_upload_link(str(path), **kwargs)\n\n    def get_upload_link_object(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"ResourceUploadLinkObject\":\n        \"\"\"\n            Get a link to upload the file using the PUT request.\n            This is similar to :any:`Client.get_upload_link()`, except it returns\n            an instance of :any:`ResourceUploadLinkObject` which also contains\n            an asynchronous operation ID.\n\n            :param relative_path: `str` or `None`, relative path to the resource\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param fields: list of keys to be included in the response\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: :any:`ResourceUploadLinkObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.get_upload_link_object(str(path), **kwargs)\n\n    def upload(self: ResourceProtocol,\n               path_or_file: FileOrPath,\n               relative_path: Optional[str] = None, /, **kwargs) -> \"SyncResourceLinkObject\":\n        \"\"\"\n            Upload a file to disk.\n\n            :param path_or_file: path or file-like object to be uploaded\n            :param relative_path: `str` or `None`, destination path relative to the resource\n            :param overwrite: if `True`, the resource will be overwritten if it already exists,\n                              an error will be raised otherwise\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: :any:`SyncResourceLinkObject`, link to the destination resource\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        dst_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.upload(path_or_file, str(dst_path), **kwargs)\n\n    def upload_url(self: ResourceProtocol,\n                   url: str,\n                   relative_path: Optional[str] = None, /, **kwargs) -> \"OperationLinkObject\":\n        \"\"\"\n            Upload a file from URL.\n\n            :param url: source URL\n            :param relative_path: `str` or `None`, destination path relative to the resource\n            :param disable_redirects: `bool`, forbid redirects\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`SyncOperationLinkObject`, link to the asynchronous operation\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        dst_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.upload_url(url, str(dst_path), **kwargs)\n\n    def get_download_link(self: ResourceProtocol,\n                          relative_path: Optional[str] = None, /, **kwargs) -> str:\n        \"\"\"\n            Get a download link for a file (or a directory).\n\n            :param relative_path: `str` or `None`, path relative to the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: `str`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.get_download_link(str(path), **kwargs)\n\n    @overload\n    def download(self: ResourceProtocol,\n                 dst_path_or_file: FileOrPathDestination, /, **kwargs) -> \"SyncResourceLinkObject\":\n        pass\n\n    @overload\n    def download(self: ResourceProtocol,\n                 relative_path: Optional[str],\n                 dst_path_or_file: FileOrPathDestination, /, **kwargs) -> \"SyncResourceLinkObject\":\n        pass\n\n    def download(self: ResourceProtocol, /, *args, **kwargs) -> \"SyncResourceLinkObject\":\n        \"\"\"\n            Download the file. This method takes 1 or 2 positional arguments:\n\n            1. :code:`download(dst_path_or_file, /, **kwargs)`\n            2. :code:`download(relative_path, dst_path_or_file, /, **kwargs)`\n\n            If `relative_path` is empty or None (or not specified) this method\n            will try to use the `file` attribute as a download link.\n\n            :param relative_path: `str` or `None`, source path relative to the resource\n            :param dst_path_or_file: destination path or file-like object\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`SyncResourceLinkObject`, link to the source resource\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, dst_path_or_file = None, args[0]\n        elif len(args) == 2:\n            relative_path, dst_path_or_file = args\n        else:\n            raise TypeError(\"download() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if not relative_path and hasattr(self, \"file\") and self.file is not None:\n            self._yadisk.download_by_link(self.file, dst_path_or_file, **kwargs)\n\n            return SyncResourceLinkObject.from_path(self.path, yadisk=self._yadisk)\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        src_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.download(str(src_path), dst_path_or_file, **kwargs)\n\n    @overload\n    def patch(self: ResourceProtocol, properties: Dict, **kwargs) -> \"SyncResourceObject\":\n        pass\n\n    @overload\n    def patch(self: ResourceProtocol,\n              relative_path: Union[str, None],\n              properties: Dict, **kwargs) -> \"SyncResourceObject\":\n        pass\n\n    def patch(self: ResourceProtocol, *args, **kwargs) -> \"SyncResourceObject\":\n        \"\"\"\n            Update custom properties of a resource.\n            This method takes 1 or 2 positional arguments:\n\n            1. :code:`patch(properties, /, **kwargs)`\n            2. :code:`patch(relative_path, properties, /, **kwargs)`\n\n            :param relative_path: `str` or `None`, path relative to the resource\n            :param properties: `dict`, custom properties to update\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`SyncResourceObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, properties = None, args[0]\n        elif len(args) == 2:\n            relative_path, properties = args\n        else:\n            raise TypeError(\"patch() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.patch(str(path), properties, **kwargs)\n\n    def publish(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"SyncResourceLinkObject\":\n        \"\"\"\n            Make a resource public.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be published\n            :param allow_address_access: `bool`, specifies the request format, i.e.\n                with personal access settings (when set to `True`) or without\n            :param public_settings: :any:`PublicSettings` or `None`, public access settings for the resource\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`SyncResourceLinkObject`, link to the resource\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.publish(str(path), **kwargs)\n\n    def unpublish(self: ResourceProtocol,\n                  relative_path: Optional[str] = None, /, **kwargs) -> \"SyncResourceLinkObject\":\n        \"\"\"\n            Make a public resource private.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be unpublished\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`SyncResourceLinkObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.unpublish(str(path), **kwargs)\n\n    def get_public_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        \"\"\"\n            Get public settings of a resource.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be published\n            :param allow_address_access: `bool`, specifies the request format, i.e.\n                with personal access settings (when set to `True`) or without\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`PublicSettingsObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.get_public_settings(str(path), **kwargs)\n\n    def get_public_available_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        \"\"\"\n            Get public settings of a shared resource for the current OAuth token owner.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be published\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`PublicAvailableSettingsObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.get_public_available_settings(str(path), **kwargs)\n\n    def update_public_settings(\n        self: ResourceProtocol,\n        *args,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        \"\"\"\n            Get public settings of a shared resource for the current OAuth token owner.\n            This method takes 1 or 2 positional arguments:\n            1. :code:`update_public_settings(public_settings, /, **kwargs)`\n            2. :code:`update_public_settings(relative_path, public_settings, /, **kwargs)`\n\n            :param relative_path: `str` or `None`, relative path to the resource to be published\n            :param public_settings: :any:`PublicSettings`, public access settings for the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`PublicAvailableSettingsObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, public_settings = None, args[0]\n        elif len(args) == 2:\n            relative_path, public_settings = args\n        else:\n            raise TypeError(\"update_public_settings() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.update_public_settings(str(path), public_settings, **kwargs)\n\n    def mkdir(self: ResourceProtocol,\n              relative_path: Optional[str] = None, /, **kwargs) -> \"SyncResourceLinkObject\":\n        \"\"\"\n            Create a new directory.\n\n            :param relative_path: `str` or `None`, relative path to the directory to be created\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises DirectoryExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot create directory due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`SyncResourceLinkObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.mkdir(str(path), **kwargs)\n\n    def makedirs(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"SyncResourceLinkObject\":\n        \"\"\"\n            Create a new directory at `path`. If its parent directory doesn't\n            exist it will also be created recursively.\n\n            :param relative_path: `str` or `None`, relative path to the directory to be created\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises DirectoryExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot create directory due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`SyncResourceLinkObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.makedirs(str(path), **kwargs)\n\n    def remove(self: ResourceProtocol,\n               relative_path: Optional[str] = None, /, **kwargs) -> Optional[\"SyncOperationLinkObject\"]:\n        \"\"\"\n            Remove the resource.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be removed\n            :param permanently: if `True`, the resource will be removed permanently,\n                                otherwise, it will be just moved to the trash\n            :param md5: `str`, MD5 hash of the file to remove\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises BadRequestError: MD5 check is only available for files\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`SyncOperationLinkObject` if the operation is performed asynchronously, `None` otherwise\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.remove(str(path), **kwargs)\n\n    @overload\n    def move(self: ResourceProtocol,\n             dst_path: str, /, **kwargs) -> Union[\"SyncResourceLinkObject\", \"SyncOperationLinkObject\"]:\n        pass\n\n    @overload\n    def move(self: ResourceProtocol,\n             relative_path: Optional[str],\n             dst_path: str, /, **kwargs) -> Union[\"SyncResourceLinkObject\", \"SyncOperationLinkObject\"]:\n        pass\n\n    def move(self: ResourceProtocol, /, *args, **kwargs) -> Union[\"SyncResourceLinkObject\", \"SyncOperationLinkObject\"]:\n        \"\"\"\n            Move resource to `dst_path`.\n            This method takes 1 or 2 positional arguments:\n\n            1. :code:`move(dst_path, /, **kwargs)`\n            2. :code:`move(relative_path, dst_path, /, **kwargs)`\n\n            :param relative_path: `str` or `None`, source path to be moved relative to the resource\n            :param dst_path: destination path\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, dst_path = None, args[0]\n        elif len(args) == 2:\n            relative_path, dst_path = args\n        else:\n            raise TypeError(\"move() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        src_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.move(str(src_path), dst_path, **kwargs)\n\n    @overload\n    def rename(self: ResourceProtocol,\n               new_name: str, /, **kwargs) -> Union[\"SyncResourceLinkObject\", \"SyncOperationLinkObject\"]:\n        pass\n\n    @overload\n    def rename(self: ResourceProtocol,\n               relative_path: Optional[str],\n               new_name: str, /, **kwargs) -> Union[\"SyncResourceLinkObject\", \"SyncOperationLinkObject\"]:\n        pass\n\n    def rename(\n        self: ResourceProtocol,\n        /,\n        *args,\n        **kwargs\n    ) -> Union[\"SyncResourceLinkObject\", \"SyncOperationLinkObject\"]:\n        \"\"\"\n            Rename `src_path` to have filename `new_name`.\n            Does the same as `move()` but changes only the filename.\n\n            :param relative_path: `str` or `None`, source path to be renamed relative to the resource\n            :param new_name: target filename to rename to\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises ValueError: `new_name` is not a valid filename\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, new_name = None, args[0]\n        elif len(args) == 2:\n            relative_path, new_name = args\n        else:\n            raise TypeError(\"rename() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.rename(str(path), new_name, **kwargs)\n\n    @overload\n    def copy(self: ResourceProtocol,\n             dst_path: str, /, **kwargs) -> Union[\"SyncResourceLinkObject\", \"SyncOperationLinkObject\"]:\n        pass\n\n    @overload\n    def copy(self: ResourceProtocol,\n             relative_path: Optional[str],\n             dst_path: str, /, **kwargs) -> Union[\"SyncResourceLinkObject\", \"SyncOperationLinkObject\"]:\n        pass\n\n    def copy(self: ResourceProtocol, /, *args, **kwargs) -> Union[\"SyncResourceLinkObject\", \"SyncOperationLinkObject\"]:\n        \"\"\"\n            Copy resource to `dst_path`.\n            If the operation is performed asynchronously, returns the link to the operation,\n            otherwise, returns the link to the newly created resource.\n\n            This method takes 1 or 2 positional arguments:\n\n            1. :code:`copy(dst_path, /, **kwargs)`\n            2. :code:`copy(relative_src_path, dst_path, /, **kwargs)`\n\n            :param relative_src_path: `str` or `None`, source path relative to the resource\n            :param dst_path: destination path\n            :param overwrite: if `True` the destination path can be overwritten,\n                              otherwise, an error will be raised\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises InsufficientStorageError: cannot complete request due to lack of storage space\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, dst_path = None, args[0]\n        elif len(args) == 2:\n            relative_path, dst_path = args\n        else:\n            raise TypeError(\"copy() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        src_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.copy(str(src_path), dst_path, **kwargs)\n\n\nclass AsyncResourceObjectMethodsMixin:\n    async def get_meta(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None, /, **kwargs\n    ) -> \"AsyncResourceObject\":\n        \"\"\"\n            Get meta information about a file/directory.\n\n            :param relative_path: `str` or `None`, relative path from resource\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: :any:`AsyncResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.get_meta(str(path), **kwargs)\n\n    async def get_public_meta(self: ResourceProtocol, **kwargs) -> \"AsyncPublicResourceObject\":\n        \"\"\"\n            Get meta-information about a public resource.\n\n            :param path: relative path to a resource in a public folder.\n            :param offset: offset from the beginning of the list of nested resources\n            :param limit: maximum number of nested elements to be included in the list\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param preview_size: file preview size\n            :param preview_crop: `bool`, allow preview crop\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: :any:`AsyncPublicResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        public_key_or_url = self.public_key or self.public_url\n\n        if public_key_or_url is None:\n            raise ValueError(\"ResourceObject doesn't have a public_key/public_url\")\n\n        return await self._yadisk.get_public_meta(public_key_or_url, **kwargs)\n\n    async def exists(self: ResourceProtocol,\n                     relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource exists.\n\n            :param relative_path: `str` or `None`, relative path from the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.exists(str(path), **kwargs)\n\n    async def get_type(self: ResourceProtocol,\n                       relative_path: Optional[str] = None, /, **kwargs) -> str:\n        \"\"\"\n            Get resource type.\n\n            :param relative_path: relative path from the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.get_type(str(path), **kwargs)\n\n    async def is_dir(self: ResourceProtocol,\n                     relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource is a directory.\n\n            :param relative_path: relative path from the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.is_dir(str(path), **kwargs)\n\n    async def is_file(self: ResourceProtocol,\n                      relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource is a file.\n\n            :param relative_path: relative path from the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a file, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.is_file(str(path), **kwargs)\n\n    async def listdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> AsyncGenerator[\"AsyncResourceObject\", None]:\n        \"\"\"\n            Get contents of the resource.\n\n            :param relative_path: relative path from resource\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: generator of :any:`AsyncResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        async for i in self._yadisk.listdir(str(path), **kwargs):\n            yield i\n\n    async def public_listdir(\n        self: ResourceProtocol,\n        **kwargs\n    ) -> AsyncGenerator[\"AsyncPublicResourceObject\", None]:\n        \"\"\"\n            Get contents of a public directory.\n\n            :param path: relative path to the resource in the public folder.\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: generator of :any:`AsyncPublicResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        public_key_or_url = self.public_key or self.public_url\n\n        if public_key_or_url is None:\n            raise ValueError(\"ResourceObject doesn't have a public_key/public_url\")\n\n        async for i in self._yadisk.public_listdir(public_key_or_url, **kwargs):\n            yield i\n\n    async def get_upload_link(self: ResourceProtocol,\n                              relative_path: Optional[str] = None, /, **kwargs) -> str:\n        \"\"\"\n            Get a link to upload the file using the PUT request.\n\n            :param relative_path: `str` or `None`, relative path to the resource\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: `str`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.get_upload_link(str(path), **kwargs)\n\n    async def get_upload_link_object(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"ResourceUploadLinkObject\":\n        \"\"\"\n            Get a link to upload the file using the PUT request.\n            This is similar to :any:`AsyncClient.get_upload_link()`, except it returns\n            an instance of :any:`ResourceUploadLinkObject` which also contains\n            an asynchronous operation ID.\n\n            :param relative_path: `str` or `None`, relative path to the resource\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param fields: list of keys to be included in the response\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: :any:`ResourceUploadLinkObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.get_upload_link_object(str(path), **kwargs)\n\n    async def upload(\n        self: ResourceProtocol,\n        path_or_file: AsyncFileOrPath,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        \"\"\"\n            Upload a file to disk.\n\n            :param path_or_file: path or file-like object to be uploaded\n            :param relative_path: `str` or `None`, destination path relative to the resource\n            :param overwrite: if `True`, the resource will be overwritten if it already exists,\n                              an error will be raised otherwise\n            :param spoof_user_agent: `bool`, if `True` (default), the `User-Agent` header\n                will be set to a special value, which should allow bypassing of\n                Yandex.Disk's upload speed limit\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n\n            :returns: :any:`AsyncResourceLinkObject`, link to the destination resource\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        dst_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.upload(path_or_file, str(dst_path), **kwargs)\n\n    async def upload_url(self: ResourceProtocol,\n                         url: str,\n                         relative_path: Optional[str] = None, /, **kwargs) -> \"AsyncOperationLinkObject\":\n        \"\"\"\n            Upload a file from URL.\n\n            :param url: source URL\n            :param relative_path: `str` or `None`, destination path relative to the resource\n            :param disable_redirects: `bool`, forbid redirects\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises PathExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot upload file due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`AsyncOperationLinkObject`, link to the asynchronous operation\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        dst_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.upload_url(url, str(dst_path), **kwargs)\n\n    async def get_download_link(self: ResourceProtocol,\n                                relative_path: Optional[str] = None, /, **kwargs) -> str:\n        \"\"\"\n            Get a download link for a file (or a directory).\n\n            :param relative_path: `str` or `None`, path relative to the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: `str`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.get_download_link(str(path), **kwargs)\n\n    @overload\n    async def download(\n        self: ResourceProtocol,\n        dst_path_or_file: AsyncFileOrPathDestination,\n        /,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        pass\n\n    @overload\n    async def download(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path_or_file: AsyncFileOrPathDestination,\n        /,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        pass\n\n    async def download(self: ResourceProtocol, /, *args, **kwargs) -> \"AsyncResourceLinkObject\":\n        \"\"\"\n            Download the file. This method takes 1 or 2 positional arguments:\n\n            1. :code:`download(dst_path_or_file, /, **kwargs)`\n            2. :code:`download(relative_path, dst_path_or_file, /, **kwargs)`\n\n            If `relative_path` is empty or None (or not specified) this method\n            will try to use the `file` attribute as a download link.\n\n            :param relative_path: `str` or `None`, source path relative to the resource\n            :param dst_path_or_file: destination path or file-like object\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`AsyncResourceLinkObject`, link to the source resource\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, dst_path_or_file = None, args[0]\n        elif len(args) == 2:\n            relative_path, dst_path_or_file = args\n        else:\n            raise TypeError(\"download() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if not relative_path and hasattr(self, \"file\") and self.file is not None:\n            await self._yadisk.download_by_link(self.file, dst_path_or_file, **kwargs)\n\n            return AsyncResourceLinkObject.from_path(self.path, yadisk=self._yadisk)\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        src_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.download(str(src_path), dst_path_or_file, **kwargs)\n\n    @overload\n    async def patch(self: ResourceProtocol, properties: Dict, **kwargs) -> \"AsyncResourceObject\":\n        pass\n\n    @overload\n    async def patch(\n        self: ResourceProtocol,\n        relative_path: Union[str, None],\n        properties: Dict, **kwargs\n    ) -> \"AsyncResourceObject\":\n        pass\n\n    async def patch(self: ResourceProtocol, *args, **kwargs) -> \"AsyncResourceObject\":\n        \"\"\"\n            Update custom properties of a resource.\n            This method takes 1 or 2 positional arguments:\n\n            1. :code:`patch(properties, /, **kwargs)`\n            2. :code:`patch(relative_path, properties, /, **kwargs)`\n\n            :param relative_path: `str` or `None`, path relative to the resource\n            :param properties: `dict`, custom properties to update\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`AsyncResourceObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, properties = None, args[0]\n        elif len(args) == 2:\n            relative_path, properties = args\n        else:\n            raise TypeError(\"patch() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.patch(str(path), properties, **kwargs)\n\n    async def publish(self: ResourceProtocol,\n                      relative_path: Optional[str] = None, /, **kwargs) -> \"AsyncResourceLinkObject\":\n        \"\"\"\n            Make a resource public.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be published\n            :param allow_address_access: `bool`, specifies the request format, i.e.\n                with personal access settings (when set to `True`) or without\n            :param public_settings: :any:`PublicSettings`, public access settings for the resource\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`AsyncResourceLinkObject`, link to the resource\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.publish(str(path), **kwargs)\n\n    async def unpublish(self: ResourceProtocol,\n                        relative_path: Optional[str] = None, /, **kwargs) -> \"AsyncResourceLinkObject\":\n        \"\"\"\n            Make a public resource private.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be unpublished\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`ResourceLinkObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.unpublish(str(path), **kwargs)\n\n    async def get_public_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        \"\"\"\n            Get public settings of a resource.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be published\n            :param allow_address_access: `bool`, specifies the request format, i.e.\n                with personal access settings (when set to `True`) or without\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`PublicSettingsObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.get_public_settings(str(path), **kwargs)\n\n    async def get_public_available_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        \"\"\"\n            Get public settings of a shared resource for the current OAuth token owner.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be published\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`PublicAvailableSettingsObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.get_public_available_settings(str(path), **kwargs)\n\n    async def update_public_settings(\n        self: ResourceProtocol,\n        *args,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        \"\"\"\n            Get public settings of a shared resource for the current OAuth token owner.\n            This method takes 1 or 2 positional arguments:\n            1. :code:`update_public_settings(public_settings, /, **kwargs)`\n            2. :code:`update_public_settings(relative_path, public_settings, /, **kwargs)`\n\n            :param relative_path: `str` or `None`, relative path to the resource to be published\n            :param public_settings: :any:`PublicSettings`, public access settings for the resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`PublicAvailableSettingsObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, public_settings = None, args[0]\n        elif len(args) == 2:\n            relative_path, public_settings = args\n        else:\n            raise TypeError(\"update_public_settings() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.update_public_settings(str(path), public_settings, **kwargs)\n\n    async def mkdir(self: ResourceProtocol,\n                    relative_path: Optional[str] = None, /, **kwargs) -> \"AsyncResourceLinkObject\":\n        \"\"\"\n            Create a new directory.\n\n            :param relative_path: `str` or `None`, relative path to the directory to be created\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ParentNotFoundError: parent directory doesn't exist\n            :raises DirectoryExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot create directory due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`AsyncResourceLinkObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.mkdir(str(path), **kwargs)\n\n    async def makedirs(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        \"\"\"\n            Create a new directory at `path`. If its parent directory doesn't\n            exist it will also be created recursively.\n\n            :param relative_path: `str` or `None`, relative path to the directory to be created\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises DirectoryExistsError: destination path already exists\n            :raises InsufficientStorageError: cannot create directory due to lack of storage space\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n\n            :returns: :any:`AsyncSyncResourceLinkObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.makedirs(str(path), **kwargs)\n\n    async def remove(self: ResourceProtocol,\n                     relative_path: Optional[str] = None, /, **kwargs) -> Optional[\"AsyncOperationLinkObject\"]:\n        \"\"\"\n            Remove the resource.\n\n            :param relative_path: `str` or `None`, relative path to the resource to be removed\n            :param permanently: if `True`, the resource will be removed permanently,\n                                otherwise, it will be just moved to the trash\n            :param md5: `str`, MD5 hash of the file to remove\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises BadRequestError: MD5 check is only available for files\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`AsyncOperationLinkObject` if the operation is performed asynchronously, `None` otherwise\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.remove(str(path), **kwargs)\n\n    @overload\n    async def move(self: ResourceProtocol,\n                   dst_path: str, /, **kwargs) -> Union[\"AsyncResourceLinkObject\", \"AsyncOperationLinkObject\"]:\n        pass\n\n    @overload\n    async def move(self: ResourceProtocol,\n                   relative_path: Optional[str],\n                   dst_path: str, /, **kwargs) -> Union[\"AsyncResourceLinkObject\", \"AsyncOperationLinkObject\"]:\n        pass\n\n    async def move(\n        self: ResourceProtocol,\n        /,\n        *args,\n        **kwargs\n    ) -> Union[\"AsyncResourceLinkObject\", \"AsyncOperationLinkObject\"]:\n        \"\"\"\n            Move resource to `dst_path`.\n            This method takes 1 or 2 positional arguments:\n\n            1. :code:`move(dst_path, /, **kwargs)`\n            2. :code:`move(relative_path, dst_path, /, **kwargs)`\n\n            :param relative_path: `str` or `None`, source path to be moved relative to the resource\n            :param dst_path: destination path\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, dst_path = None, args[0]\n        elif len(args) == 2:\n            relative_path, dst_path = args\n        else:\n            raise TypeError(\"move() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        src_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.move(str(src_path), dst_path, **kwargs)\n\n    @overload\n    async def rename(self: ResourceProtocol,\n                     new_name: str, /, **kwargs) -> Union[\"AsyncResourceLinkObject\", \"AsyncOperationLinkObject\"]:\n        pass\n\n    @overload\n    async def rename(self: ResourceProtocol,\n                     relative_path: Optional[str],\n                     new_name: str, /, **kwargs) -> Union[\"AsyncResourceLinkObject\", \"AsyncOperationLinkObject\"]:\n        pass\n\n    async def rename(\n        self: ResourceProtocol,\n        /,\n        *args,\n        **kwargs\n    ) -> Union[\"AsyncResourceLinkObject\", \"AsyncOperationLinkObject\"]:\n        \"\"\"\n            Rename `src_path` to have filename `new_name`.\n            Does the same as `move()` but changes only the filename.\n\n            :param relative_path: `str` or `None`, source path to be renamed relative to the resource\n            :param new_name: target filename to rename to\n            :param overwrite: `bool`, determines whether to overwrite the destination\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises ValueError: `new_name` is not a valid filename\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, new_name = None, args[0]\n        elif len(args) == 2:\n            relative_path, new_name = args\n        else:\n            raise TypeError(\"rename() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.rename(str(path), new_name, **kwargs)\n\n    @overload\n    async def copy(self: ResourceProtocol,\n                   dst_path: str, /, **kwargs) -> Union[\"AsyncResourceLinkObject\", \"AsyncOperationLinkObject\"]:\n        pass\n\n    @overload\n    async def copy(self: ResourceProtocol,\n                   relative_path: Optional[str],\n                   dst_path: str, /, **kwargs) -> Union[\"AsyncResourceLinkObject\", \"AsyncOperationLinkObject\"]:\n        pass\n\n    async def copy(\n        self: ResourceProtocol,\n        /,\n        *args,\n        **kwargs\n    ) -> Union[\"AsyncResourceLinkObject\", \"AsyncOperationLinkObject\"]:\n        \"\"\"\n            Copy resource to `dst_path`.\n            If the operation is performed asynchronously, returns the link to the operation,\n            otherwise, returns the link to the newly created resource.\n\n            This method takes 1 or 2 positional arguments:\n\n            1. :code:`copy(dst_path, /, **kwargs)`\n            2. :code:`copy(relative_path, dst_path, /, **kwargs)`\n\n            :param relative_path: `str` or `None`, source path relative to the resource\n            :param dst_path: destination path\n            :param overwrite: if `True` the destination path can be overwritten,\n                              otherwise, an error will be raised\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises InsufficientStorageError: cannot complete request due to lack of storage space\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises UploadTrafficLimitExceededError: upload limit has been exceeded\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\n        \"\"\"\n\n        if len(args) == 1:\n            relative_path, dst_path = None, args[0]\n        elif len(args) == 2:\n            relative_path, dst_path = args\n        else:\n            raise TypeError(\"copy() takes 1 or 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        src_path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.copy(str(src_path), dst_path, **kwargs)\n\n\ndef _convert_list_of_previews(previews: JSON) -> Optional[Dict[str, str]]:\n    if previews is None:\n        return None\n\n    if not isinstance(previews, list):\n        raise ValueError(f\"Expected a list, got {type(previews)}\")\n\n    result = {}\n\n    for preview in previews:\n        if not isinstance(preview, dict):\n            raise ValueError(f\"Expected a dict, got {type(preview)}\")\n\n        try:\n            name = preview[\"name\"]\n            url = preview[\"url\"]\n        except KeyError:\n            continue\n\n        if not isinstance(name, str):\n            raise ValueError(f\"Expected a string, got {type(name)}\")\n\n        if not isinstance(url, str):\n            raise ValueError(f\"Expected a string, got {type(url)}\")\n\n        result[name] = url\n\n    return result\n\n\nclass ResourceObject(YaDiskObject):\n    \"\"\"\n        Resource object.\n\n        :param resource: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar antivirus_status: `str`, antivirus check status\n        :ivar file: `str`, download URL\n        :ivar size: `int`, file size\n        :ivar public_key: `str`, public resource key\n        :ivar sha256: `str`, SHA256 hash\n        :ivar md5: `str`, MD5 hash\n        :ivar embedded: :any:`ResourceListObject`, list of nested resources\n        :ivar name: `str`, filename\n        :ivar exif: :any:`EXIFObject`, EXIF metadata\n        :ivar resource_id: `str`, resource ID\n        :ivar custom_properties: `dict`, custom resource properties\n        :ivar public_url: `str`, public URL\n        :ivar share: :any:`ShareInfoObject`, shared folder information\n        :ivar modified: :any:`datetime.datetime`, date of last modification\n        :ivar created: :any:`datetime.datetime`, date of creation\n        :ivar photoslice_time: :any:`datetime.datetime`, photo/video creation date\n        :ivar mime_type: `str`, MIME type\n        :ivar path: `str`, path to the resource\n        :ivar preview: `str`, file preview URL\n        :ivar comment_ids: :any:`CommentIDsObject`, comment IDs\n        :ivar type: `str`, type (\"file\" or \"dir\")\n        :ivar media_type: `str`, file type as determined by Yandex.Disk\n        :ivar revision: `int`, Yandex.Disk revision at the time of last modification\n        :ivar sizes: `dict[str, str]`, mapping of all preview sizes,\n                     where keys are names and values are download links\n\n    \"\"\"\n\n    antivirus_status: Optional[str]\n    file: Optional[str]\n    size: Optional[int]\n    public_key: Optional[str]\n    sha256: Optional[str]\n    embedded: Optional[\"ResourceListObject\"]\n    _embedded: Optional[\"ResourceListObject\"]\n    name: Optional[str]\n    exif: Optional[EXIFObject]\n    resource_id: Optional[str]\n    custom_properties: Optional[Dict]\n    public_url: Optional[str]\n    share: Optional[\"ShareInfoObject\"]\n    modified: Optional[\"datetime.datetime\"]\n    created: Optional[\"datetime.datetime\"]\n    photoslice_time: Optional[\"datetime.datetime\"]\n    mime_type: Optional[str]\n    path: Optional[str]\n    preview: Optional[str]\n    comment_ids: Optional[CommentIDsObject]\n    type: Optional[str]\n    media_type: Optional[str]\n    md5: Optional[str]\n    revision: Optional[int]\n    sizes: Optional[Dict[str, str]]\n\n    def __init__(self, resource: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"antivirus_status\":  str_or_dict_or_error,\n             \"file\":              str_or_error,\n             \"size\":              int_or_error,\n             \"public_key\":        str_or_error,\n             \"sha256\":            str_or_error,\n             \"embedded\":          partial(ResourceListObject, yadisk=yadisk),\n             \"name\":              str_or_error,\n             \"exif\":              partial(EXIFObject, yadisk=yadisk),\n             \"resource_id\":       str_or_error,\n             \"custom_properties\": dict_or_error,\n             \"public_url\":        str_or_error,\n             \"share\":             partial(ShareInfoObject, yadisk=yadisk),\n             \"modified\":          yandex_date,\n             \"created\":           yandex_date,\n             \"photoslice_time\":   yandex_date,\n             \"mime_type\":         str_or_error,\n             \"path\":              str_or_error,\n             \"preview\":           str_or_error,\n             \"comment_ids\":       partial(CommentIDsObject, yadisk=yadisk),\n             \"type\":              str_or_error,\n             \"media_type\":        str_or_error,\n             \"md5\":               str_or_error,\n             \"revision\":          int_or_error,\n             \"sizes\":             _convert_list_of_previews\n            },\n            yadisk)\n        self.set_alias(\"_embedded\", \"embedded\")\n        self.import_fields(resource)\n\n\nclass SyncResourceObject(ResourceObject, ResourceObjectMethodsMixin):\n    \"\"\"\n        Resource object.\n\n        :param resource: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar antivirus_status: `str`, antivirus check status\n        :ivar file: `str`, download URL\n        :ivar size: `int`, file size\n        :ivar public_key: `str`, public resource key\n        :ivar sha256: `str`, SHA256 hash\n        :ivar md5: `str`, MD5 hash\n        :ivar embedded: :any:`SyncResourceListObject`, list of nested resources\n        :ivar name: `str`, filename\n        :ivar exif: :any:`EXIFObject`, EXIF metadata\n        :ivar resource_id: `str`, resource ID\n        :ivar custom_properties: `dict`, custom resource properties\n        :ivar public_url: `str`, public URL\n        :ivar share: :any:`ShareInfoObject`, shared folder information\n        :ivar modified: :any:`datetime.datetime`, date of last modification\n        :ivar created: :any:`datetime.datetime`, date of creation\n        :ivar photoslice_time: :any:`datetime.datetime`, photo/video creation date\n        :ivar mime_type: `str`, MIME type\n        :ivar path: `str`, path to the resource\n        :ivar preview: `str`, file preview URL\n        :ivar comment_ids: :any:`CommentIDsObject`, comment IDs\n        :ivar type: `str`, type (\"file\" or \"dir\")\n        :ivar media_type: `str`, file type as determined by Yandex.Disk\n        :ivar revision: `int`, Yandex.Disk revision at the time of last modification\n        :ivar sizes: `dict[str, str]`, mapping of all preview sizes,\n                     where keys are names and values are download links\n    \"\"\"\n\n    embedded: Optional[\"SyncResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"SyncResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self, resource: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        ResourceObject.__init__(self, None, yadisk)\n        self.set_field_type(\"embedded\", partial(SyncResourceListObject, yadisk=yadisk))\n        self.import_fields(resource)\n\n\nclass AsyncResourceObject(ResourceObject, AsyncResourceObjectMethodsMixin):\n    \"\"\"\n        Resource object.\n\n        :param resource: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar antivirus_status: `str`, antivirus check status\n        :ivar file: `str`, download URL\n        :ivar size: `int`, file size\n        :ivar public_key: `str`, public resource key\n        :ivar sha256: `str`, SHA256 hash\n        :ivar md5: `str`, MD5 hash\n        :ivar embedded: :any:`AsyncResourceListObject`, list of nested resources\n        :ivar name: `str`, filename\n        :ivar exif: :any:`EXIFObject`, EXIF metadata\n        :ivar resource_id: `str`, resource ID\n        :ivar custom_properties: `dict`, custom resource properties\n        :ivar public_url: `str`, public URL\n        :ivar share: :any:`ShareInfoObject`, shared folder information\n        :ivar modified: :any:`datetime.datetime`, date of last modification\n        :ivar created: :any:`datetime.datetime`, date of creation\n        :ivar photoslice_time: :any:`datetime.datetime`, photo/video creation date\n        :ivar mime_type: `str`, MIME type\n        :ivar path: `str`, path to the resource\n        :ivar preview: `str`, file preview URL\n        :ivar comment_ids: :any:`CommentIDsObject`, comment IDs\n        :ivar type: `str`, type (\"file\" or \"dir\")\n        :ivar media_type: `str`, file type as determined by Yandex.Disk\n        :ivar revision: `int`, Yandex.Disk revision at the time of last modification\n        :ivar sizes: `dict[str, str]`, mapping of all preview sizes,\n                     where keys are names and values are download links\n    \"\"\"\n\n    embedded: Optional[\"AsyncResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"AsyncResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self, resource: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        ResourceObject.__init__(self, None, yadisk)\n        self.set_field_type(\"embedded\", partial(AsyncResourceListObject, yadisk=yadisk))\n        self.import_fields(resource)\n\n\nclass ResourceLinkObject(LinkObject):\n    \"\"\"\n        Resource link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n        :ivar path: `str`, path to the resource\n    \"\"\"\n\n    type: Optional[str]\n    public_key: Optional[str]\n    public_url: Optional[str]\n    file: Optional[str]\n\n    path: Optional[str]\n\n    def __init__(self, link: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        LinkObject.__init__(self, None, yadisk)\n\n        self.set_field_type(\"path\", str_or_error)\n        self.set_field_type(\"public_key\", str_or_error)\n        self.set_field_type(\"public_url\", str_or_error)\n        self.set_field_type(\"type\", str_or_error)\n        self.set_field_type(\"file\", str_or_error)\n\n        self.import_fields(link)\n\n        if self.href is not None and is_resource_link(self.href):\n            try:\n                self.path = ensure_path_has_scheme(\n                    parse_qs(urlparse(self.href).query).get(\"path\", [])[0])\n            except IndexError:\n                pass\n\n    @classmethod\n    def from_path(cls, path: Optional[str], yadisk: Optional[Any] = None):\n        if path is None:\n            return cls(yadisk=yadisk)\n\n        path = ensure_path_has_scheme(path)\n\n        return cls(\n            {\"method\": \"GET\",\n             \"href\": f\"{settings.BASE_API_URL}/v1/disk/resources?{urlencode({'path': path})}\",\n             \"templated\": False},\n            yadisk=yadisk)\n\n\nclass SyncResourceLinkObject(ResourceLinkObject, ResourceObjectMethodsMixin):\n    \"\"\"\n        Resource link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n        :ivar path: `str`, path to the resource\n    \"\"\"\n\n    pass\n\n\nclass AsyncResourceLinkObject(ResourceLinkObject, AsyncResourceObjectMethodsMixin):\n    \"\"\"\n        Resource link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n        :ivar path: `str`, path to the resource\n    \"\"\"\n\n    pass\n\n\nclass PublicResourceLinkObject(LinkObject):\n    \"\"\"\n        Public resource link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n        :ivar public_key: `str`, public key of the resource\n        :ivar public_url: `str`, public URL of the resource\n    \"\"\"\n\n    type: Optional[str]\n    file: Optional[str]\n\n    path: Optional[str]\n    public_key: Optional[str]\n    public_url: Optional[str]\n\n    def __init__(self, link: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        LinkObject.__init__(self, None, yadisk)\n        self.set_field_type(\"public_key\", str_or_error)\n        self.set_field_type(\"public_url\", str_or_error)\n        self.set_field_type(\"path\", str_or_error)\n\n        self.import_fields(link)\n\n        if self.href is not None and is_public_resource_link(self.href):\n            try:\n                public_key_or_url = parse_qs(urlparse(self.href).query).get(\"public_key\", [])[0]\n            except IndexError:\n                public_key_or_url = \"\"\n\n            if public_key_or_url.startswith((\"http://\", \"https://\")):\n                self.public_url = public_key_or_url\n            else:\n                self.public_key = public_key_or_url\n\n    @classmethod\n    def from_public_key(cls, public_key: Optional[str], yadisk: Optional[Any] = None):\n        if public_key is None:\n            return cls(yadisk=yadisk)\n\n        return cls(\n            {\"method\": \"GET\",\n             \"href\": f\"{settings.BASE_API_URL}/v1/disk/public/resources?{urlencode({'public_key': public_key})}\",\n             \"templated\": False},\n            yadisk=yadisk)\n\n\nclass SyncPublicResourceLinkObject(PublicResourceLinkObject, ResourceObjectMethodsMixin):\n    \"\"\"\n        Public resource link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n        :ivar public_key: `str`, public key of the resource\n        :ivar public_url: `str`, public URL of the resource\n    \"\"\"\n\n    pass\n\n\nclass AsyncPublicResourceLinkObject(PublicResourceLinkObject, AsyncResourceObjectMethodsMixin):\n    \"\"\"\n        Public resource link object.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n        :ivar public_key: `str`, public key of the resource\n        :ivar public_url: `str`, public URL of the resource\n    \"\"\"\n\n    pass\n\n\nclass ResourceListObject(YaDiskObject):\n    \"\"\"\n        List of resources.\n\n        :param resource_list: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar sort: `str`, sort type\n        :ivar items: `list`, list of resources (:any:`ResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n        :ivar path: `str`, path to the directory that contains the elements of the list\n        :ivar total: `int`, number of elements in the list\n    \"\"\"\n\n    sort: Optional[str]\n    items: Optional[List[ResourceObject]]\n    limit: Optional[int]\n    offset: Optional[int]\n    path: Optional[str]\n    total: Optional[int]\n\n    def __init__(self, resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"sort\":   str_or_error,\n             \"items\":  typed_list(partial(ResourceObject, yadisk=yadisk)),\n             \"limit\":  int_or_error,\n             \"offset\": int_or_error,\n             \"path\":   str_or_error,\n             \"total\":  int_or_error},\n            yadisk)\n        self.import_fields(resource_list)\n\n\nclass SyncResourceListObject(ResourceListObject):\n    \"\"\"\n        List of resources.\n\n        :param resource_list: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar sort: `str`, sort type\n        :ivar items: `list`, list of resources (:any:`SyncResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n        :ivar path: `str`, path to the directory that contains the elements of the list\n        :ivar total: `int`, number of elements in the list\n    \"\"\"\n\n    items: Optional[List[SyncResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self, resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        ResourceListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"items\", typed_list(partial(SyncResourceObject, yadisk=yadisk)))\n        self.import_fields(resource_list)\n\n\nclass AsyncResourceListObject(ResourceListObject):\n    \"\"\"\n        List of resources.\n\n        :param resource_list: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar sort: `str`, sort type\n        :ivar items: `list`, list of resources (:any:`AsyncResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n        :ivar path: `str`, path to the directory that contains the elements of the list\n        :ivar total: `int`, number of elements in the list\n    \"\"\"\n\n    items: Optional[List[AsyncResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self, resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        ResourceListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"items\", typed_list(partial(AsyncResourceObject, yadisk=yadisk)))\n        self.import_fields(resource_list)\n\n\nclass ResourceUploadLinkObject(LinkObject):\n    \"\"\"\n        Resource upload link.\n\n        :param resource_upload_link: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar operation_id: `str`, ID of the upload operation\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n    \"\"\"\n\n    operation_id: Optional[str]\n\n    def __init__(self,\n                 resource_upload_link: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        LinkObject.__init__(self, None, yadisk)\n        self.set_field_type(\"operation_id\", str_or_error)\n        self.import_fields(resource_upload_link)\n\n\nclass ResourceDownloadLinkObject(LinkObject):\n    \"\"\"\n        Resource download link.\n\n        :param link: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar href: `str`, link URL\n        :ivar method: `str`, HTTP method\n        :ivar templated: `bool`, tells whether the URL is templated\n    \"\"\"\n\n    pass\n\n\nclass ShareInfoObject(YaDiskObject):\n    \"\"\"\n        Shared folder information object.\n\n        :param share_info: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar is_root: `bool`, tells whether the folder is root\n        :ivar is_owned: `bool`, tells whether the user is the owner of this directory\n        :ivar rights: `str`, access rights\n    \"\"\"\n\n    is_root: Optional[bool]\n    is_owned: Optional[bool]\n    rights: Optional[str]\n\n    def __init__(self, share_info: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        YaDiskObject.__init__(\n            self,\n            {\"is_root\":  bool_or_error,\n             \"is_owned\": bool_or_error,\n             \"rights\":   str_or_error},\n            yadisk)\n        self.import_fields(share_info)\n\n\nclass PublicResourceObject(ResourceObject):\n    \"\"\"\n        Public resource object.\n\n        :param resource: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar antivirus_status: `str`, antivirus check status\n        :ivar file: `str`, download URL\n        :ivar size: `int`, file size\n        :ivar public_key: `str`, public resource key\n        :ivar sha256: `str`, SHA256 hash\n        :ivar md5: `str`, MD5 hash\n        :ivar embedded: :any:`PublicResourceObject`, list of nested resources\n        :ivar name: `str`, filename\n        :ivar exif: :any:`EXIFObject`, EXIF metadata\n        :ivar resource_id: `str`, resource ID\n        :ivar custom_properties: `dict`, custom resource properties\n        :ivar public_url: `str`, public URL\n        :ivar share: :any:`ShareInfoObject`, shared folder information\n        :ivar modified: :any:`datetime.datetime`, date of last modification\n        :ivar created: :any:`datetime.datetime`, date of creation\n        :ivar photoslice_time: :any:`datetime.datetime`, photo/video creation date\n        :ivar mime_type: `str`, MIME type\n        :ivar path: `str`, path to the resource\n        :ivar preview: `str`, file preview URL\n        :ivar comment_ids: :any:`CommentIDsObject`, comment IDs\n        :ivar type: `str`, type (\"file\" or \"dir\")\n        :ivar media_type: `str`, file type as determined by Yandex.Disk\n        :ivar revision: `int`, Yandex.Disk revision at the time of last modification\n        :ivar view_count: `int`, number of times the public resource was viewed\n        :ivar owner: :any:`UserPublicInfoObject`, owner of the public resource\n    \"\"\"\n\n    views_count: Optional[int]\n    view_count: Optional[int]\n    embedded: Optional[\"PublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"PublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    owner: Optional[UserPublicInfoObject]\n\n    def __init__(self, public_resource=None, yadisk=None):\n        ResourceObject.__init__(self, None, yadisk)\n        self.set_field_type(\"views_count\", int_or_error)\n        self.set_alias(\"view_count\", \"views_count\")\n        self.set_field_type(\"embedded\", partial(PublicResourceListObject, yadisk=yadisk))\n        self.set_field_type(\"owner\", partial(UserPublicInfoObject, yadisk=yadisk))\n        self.import_fields(public_resource)\n\n\nclass SyncPublicResourceObject(PublicResourceObject, ResourceObjectMethodsMixin):\n    \"\"\"\n        Public resource object.\n\n        :param resource: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar antivirus_status: `str`, antivirus check status\n        :ivar file: `str`, download URL\n        :ivar size: `int`, file size\n        :ivar public_key: `str`, public resource key\n        :ivar sha256: `str`, SHA256 hash\n        :ivar md5: `str`, MD5 hash\n        :ivar embedded: :any:`SyncPublicResourceObject`, list of nested resources\n        :ivar name: `str`, filename\n        :ivar exif: :any:`EXIFObject`, EXIF metadata\n        :ivar resource_id: `str`, resource ID\n        :ivar custom_properties: `dict`, custom resource properties\n        :ivar public_url: `str`, public URL\n        :ivar share: :any:`ShareInfoObject`, shared folder information\n        :ivar modified: :any:`datetime.datetime`, date of last modification\n        :ivar created: :any:`datetime.datetime`, date of creation\n        :ivar photoslice_time: :any:`datetime.datetime`, photo/video creation date\n        :ivar mime_type: `str`, MIME type\n        :ivar path: `str`, path to the resource\n        :ivar preview: `str`, file preview URL\n        :ivar comment_ids: :any:`CommentIDsObject`, comment IDs\n        :ivar type: `str`, type (\"file\" or \"dir\")\n        :ivar media_type: `str`, file type as determined by Yandex.Disk\n        :ivar revision: `int`, Yandex.Disk revision at the time of last modification\n        :ivar view_count: `int`, number of times the public resource was viewed\n        :ivar owner: :any:`UserPublicInfoObject`, owner of the public resource\n    \"\"\"\n\n    embedded: Optional[\"SyncPublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"SyncPublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self, public_resource: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        PublicResourceObject.__init__(self, None, yadisk)\n        self.set_field_type(\"embedded\", partial(SyncPublicResourceListObject, yadisk=yadisk))\n        self.import_fields(public_resource)\n\n\nclass AsyncPublicResourceObject(PublicResourceObject, AsyncResourceObjectMethodsMixin):\n    \"\"\"\n        Public resource object.\n\n        :param resource: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar antivirus_status: `str`, antivirus check status\n        :ivar file: `str`, download URL\n        :ivar size: `int`, file size\n        :ivar public_key: `str`, public resource key\n        :ivar sha256: `str`, SHA256 hash\n        :ivar md5: `str`, MD5 hash\n        :ivar embedded: :any:`AsyncPublicResourceObject`, list of nested resources\n        :ivar name: `str`, filename\n        :ivar exif: :any:`EXIFObject`, EXIF metadata\n        :ivar resource_id: `str`, resource ID\n        :ivar custom_properties: `dict`, custom resource properties\n        :ivar public_url: `str`, public URL\n        :ivar share: :any:`ShareInfoObject`, shared folder information\n        :ivar modified: :any:`datetime.datetime`, date of last modification\n        :ivar created: :any:`datetime.datetime`, date of creation\n        :ivar photoslice_time: :any:`datetime.datetime`, photo/video creation date\n        :ivar mime_type: `str`, MIME type\n        :ivar path: `str`, path to the resource\n        :ivar preview: `str`, file preview URL\n        :ivar comment_ids: :any:`CommentIDsObject`, comment IDs\n        :ivar type: `str`, type (\"file\" or \"dir\")\n        :ivar media_type: `str`, file type as determined by Yandex.Disk\n        :ivar revision: `int`, Yandex.Disk revision at the time of last modification\n        :ivar view_count: `int`, number of times the public resource was viewed\n        :ivar owner: :any:`UserPublicInfoObject`, owner of the public resource\n    \"\"\"\n\n    embedded: Optional[\"AsyncPublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"AsyncPublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self, public_resource: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        PublicResourceObject.__init__(self, None, yadisk)\n        self.set_field_type(\"embedded\", partial(AsyncPublicResourceListObject, yadisk=yadisk))\n        self.import_fields(public_resource)\n\n\nclass PublicResourceListObject(ResourceListObject):\n    \"\"\"\n        List of public resources.\n\n        :param public_resource_list: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar sort: `str`, sort type\n        :ivar items: `list`, list of resources (:any:`ResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n        :ivar path: `str`, path to the directory that contains the elements of the list\n        :ivar total: `int`, number of elements in the list\n        :ivar public_key: `str`, public key of the resource\n    \"\"\"\n\n    public_key: Optional[str]\n    items: Optional[List[PublicResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 public_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        ResourceListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"public_key\", str_or_error)\n        self.set_field_type(\"items\", typed_list(partial(PublicResourceObject, yadisk=yadisk)))\n        self.import_fields(public_resource_list)\n\n\nclass SyncPublicResourceListObject(PublicResourceListObject):\n    \"\"\"\n        List of public resources.\n\n        :param public_resource_list: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar sort: `str`, sort type\n        :ivar items: `list`, list of resources (:any:`SyncResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n        :ivar path: `str`, path to the directory that contains the elements of the list\n        :ivar total: `int`, number of elements in the list\n        :ivar public_key: `str`, public key of the resource\n    \"\"\"\n\n    items: Optional[List[SyncPublicResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self, public_resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        PublicResourceListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"items\", typed_list(partial(SyncPublicResourceObject, yadisk=yadisk)))\n        self.import_fields(public_resource_list)\n\n\nclass AsyncPublicResourceListObject(PublicResourceListObject):\n    \"\"\"\n        List of public resources.\n\n        :param public_resource_list: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar sort: `str`, sort type\n        :ivar items: `list`, list of resources (:any:`AsyncResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n        :ivar path: `str`, path to the directory that contains the elements of the list\n        :ivar total: `int`, number of elements in the list\n        :ivar public_key: `str`, public key of the resource\n    \"\"\"\n\n    items: Optional[List[AsyncPublicResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self, public_resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None):\n        PublicResourceListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"items\", typed_list(partial(AsyncPublicResourceObject, yadisk=yadisk)))\n        self.import_fields(public_resource_list)\n\n\nclass TrashResourceObject(ResourceObject):\n    \"\"\"\n        Trash resource object.\n\n        :param trash_resource: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar antivirus_status: `str`, antivirus check status\n        :ivar file: `str`, download URL\n        :ivar size: `int`, file size\n        :ivar public_key: `str`, public resource key\n        :ivar sha256: `str`, SHA256 hash\n        :ivar md5: `str`, MD5 hash\n        :ivar embedded: :any:`TrashResourceListObject`, list of nested resources\n        :ivar name: `str`, filename\n        :ivar exif: :any:`EXIFObject`, EXIF metadata\n        :ivar resource_id: `str`, resource ID\n        :ivar custom_properties: `dict`, custom resource properties\n        :ivar public_url: `str`, public URL\n        :ivar share: :any:`ShareInfoObject`, shared folder information\n        :ivar modified: :any:`datetime.datetime`, date of last modification\n        :ivar created: :any:`datetime.datetime`, date of creation\n        :ivar photoslice_time: :any:`datetime.datetime`, photo/video creation date\n        :ivar mime_type: `str`, MIME type\n        :ivar path: `str`, path to the resource\n        :ivar preview: `str`, file preview URL\n        :ivar comment_ids: :any:`CommentIDsObject`, comment IDs\n        :ivar type: `str`, type (\"file\" or \"dir\")\n        :ivar media_type: `str`, file type as determined by Yandex.Disk\n        :ivar revision: `int`, Yandex.Disk revision at the time of last modification\n        :ivar origin_path: `str`, original path\n        :ivar deleted: :any:`datetime.datetime`, date of deletion\n        :ivar sizes: `dict[str, str]`, mapping of all preview sizes,\n                     where keys are names and values are download links\n    \"\"\"\n\n    embedded: Optional[\"TrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"TrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    origin_path: Optional[str]\n    deleted: Optional[\"datetime.datetime\"]\n\n    def __init__(self,\n                 trash_resource: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        ResourceObject.__init__(self, None, yadisk)\n        self.set_field_type(\"embedded\", partial(TrashResourceListObject, yadisk=yadisk))\n        self.set_field_type(\"origin_path\", str_or_error)\n        self.set_field_type(\"deleted\", yandex_date)\n        self.import_fields(trash_resource)\n\n\nclass SyncTrashResourceObject(TrashResourceObject):\n    \"\"\"\n        Trash resource object.\n\n        :param trash_resource: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar antivirus_status: `str`, antivirus check status\n        :ivar file: `str`, download URL\n        :ivar size: `int`, file size\n        :ivar public_key: `str`, public resource key\n        :ivar sha256: `str`, SHA256 hash\n        :ivar md5: `str`, MD5 hash\n        :ivar embedded: :any:`SyncTrashResourceListObject`, list of nested resources\n        :ivar name: `str`, filename\n        :ivar exif: :any:`EXIFObject`, EXIF metadata\n        :ivar resource_id: `str`, resource ID\n        :ivar custom_properties: `dict`, custom resource properties\n        :ivar public_url: `str`, public URL\n        :ivar share: :any:`ShareInfoObject`, shared folder information\n        :ivar modified: :any:`datetime.datetime`, date of last modification\n        :ivar created: :any:`datetime.datetime`, date of creation\n        :ivar photoslice_time: :any:`datetime.datetime`, photo/video creation date\n        :ivar mime_type: `str`, MIME type\n        :ivar path: `str`, path to the resource\n        :ivar preview: `str`, file preview URL\n        :ivar comment_ids: :any:`CommentIDsObject`, comment IDs\n        :ivar type: `str`, type (\"file\" or \"dir\")\n        :ivar media_type: `str`, file type as determined by Yandex.Disk\n        :ivar revision: `int`, Yandex.Disk revision at the time of last modification\n        :ivar origin_path: `str`, original path\n        :ivar deleted: :any:`datetime.datetime`, date of deletion\n        :ivar sizes: `dict[str, str]`, mapping of all preview sizes,\n                     where keys are names and values are download links\n    \"\"\"\n\n    embedded: Optional[\"SyncTrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"SyncTrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self,\n                 trash_resource: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        TrashResourceObject.__init__(self, None, yadisk)\n        self.set_field_type(\"embedded\", partial(SyncTrashResourceListObject, yadisk=yadisk))\n        self.import_fields(trash_resource)\n\n    def get_meta(self: ResourceProtocol,\n                 relative_path: Optional[str] = None, /, **kwargs) -> \"SyncTrashResourceObject\":\n        \"\"\"\n            Get meta information about a trash resource.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: :any:`SyncTrashResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.get_trash_meta(str(path), **kwargs)\n\n    def exists(self: ResourceProtocol,\n               relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the trash resource exists.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.trash_exists(str(path), **kwargs)\n\n    def get_type(self: ResourceProtocol,\n                 relative_path: Optional[str] = None, /, **kwargs) -> str:\n        \"\"\"\n            Get trash resource type.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.get_trash_type(str(path), **kwargs)\n\n    def is_dir(self: ResourceProtocol,\n               relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource is a trash directory.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.is_trash_dir(str(path), **kwargs)\n\n    def is_file(self: ResourceProtocol,\n                relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource is a trash file.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a file, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.is_trash_file(str(path), **kwargs)\n\n    def listdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> Generator[\"SyncTrashResourceObject\", None, None]:\n        \"\"\"\n            Get contents of a trash resource.\n\n            :param relative_path: `str` or `None`, relative path to the directory in the trash bin\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: generator of :any:`SyncTrashResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.trash_listdir(str(path), **kwargs)\n\n    def remove(self: ResourceProtocol,\n               relative_path: Optional[str] = None, /, **kwargs) -> Optional[\"SyncOperationLinkObject\"]:\n        \"\"\"\n            Remove a trash resource.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource to be deleted\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`SyncOperationLinkObject` if the operation is performed asynchronously, `None` otherwise\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.remove_trash(str(path), **kwargs)\n\n    @overload\n    def restore(self: ResourceProtocol,\n                dst_path: str, /, **kwargs) -> Union[SyncResourceLinkObject, \"SyncOperationLinkObject\"]:\n        pass\n\n    @overload\n    def restore(self: ResourceProtocol,\n                relative_path: Optional[str],\n                dst_path: str, /, **kwargs) -> Union[SyncResourceLinkObject, \"SyncOperationLinkObject\"]:\n        pass\n\n    def restore(self: ResourceProtocol, /, *args, **kwargs) -> Union[SyncResourceLinkObject, \"SyncOperationLinkObject\"]:\n        \"\"\"\n            Restore a trash resource.\n            Returns a link to the newly created resource or a link to the asynchronous operation.\n\n            This method takes 1 or 2 positional arguments:\n\n            1. :code:`restore(dst_path, /, **kwargs)`\n            2. :code:`restore(relative_path=None, dst_path, /, **kwargs)`\n\n            :param relative_path: `str` or `None`, relative path to the trash resource to be restored\n            :param dst_path: destination path\n            :param overwrite: `bool`, determines whether the destination can be overwritten\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param requests_args: `dict`, additional parameters for :any:`RequestsSession`\n            :param httpx_args: `dict`, additional parameters for :any:`HTTPXSession`\n            :param curl_options: `dict`, additional options for :any:`PycURLSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`SyncResourceLinkObject` or :any:`SyncOperationLinkObject`\n        \"\"\"\n\n        if len(args) == 0:\n            relative_path = dst_path = None\n        elif len(args) == 1:\n            relative_path, dst_path = None, args[0]\n        elif len(args) == 2:\n            relative_path, dst_path = args\n        else:\n            raise TypeError(\"restore() takes up to 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return self._yadisk.restore_trash(str(path), dst_path, **kwargs)\n\n\nclass AsyncTrashResourceObject(TrashResourceObject):\n    \"\"\"\n        Trash resource object.\n\n        :param trash_resource: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar antivirus_status: `str`, antivirus check status\n        :ivar file: `str`, download URL\n        :ivar size: `int`, file size\n        :ivar public_key: `str`, public resource key\n        :ivar sha256: `str`, SHA256 hash\n        :ivar md5: `str`, MD5 hash\n        :ivar embedded: :any:`AsyncTrashResourceListObject`, list of nested resources\n        :ivar name: `str`, filename\n        :ivar exif: :any:`EXIFObject`, EXIF metadata\n        :ivar resource_id: `str`, resource ID\n        :ivar custom_properties: `dict`, custom resource properties\n        :ivar public_url: `str`, public URL\n        :ivar share: :any:`ShareInfoObject`, shared folder information\n        :ivar modified: :any:`datetime.datetime`, date of last modification\n        :ivar created: :any:`datetime.datetime`, date of creation\n        :ivar photoslice_time: :any:`datetime.datetime`, photo/video creation date\n        :ivar mime_type: `str`, MIME type\n        :ivar path: `str`, path to the resource\n        :ivar preview: `str`, file preview URL\n        :ivar comment_ids: :any:`CommentIDsObject`, comment IDs\n        :ivar type: `str`, type (\"file\" or \"dir\")\n        :ivar media_type: `str`, file type as determined by Yandex.Disk\n        :ivar revision: `int`, Yandex.Disk revision at the time of last modification\n        :ivar origin_path: `str`, original path\n        :ivar deleted: :any:`datetime.datetime`, date of deletion\n        :ivar sizes: `dict[str, str]`, mapping of all preview sizes, where\n                     keys are names and values are download links\n    \"\"\"\n\n    embedded: Optional[\"AsyncTrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"AsyncTrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self,\n                 trash_resource: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        TrashResourceObject.__init__(self, None, yadisk)\n        self.set_field_type(\"embedded\", partial(AsyncTrashResourceListObject, yadisk=yadisk))\n        self.import_fields(trash_resource)\n\n    async def get_meta(self: ResourceProtocol,\n                       relative_path: Optional[str] = None, /, **kwargs) -> \"AsyncTrashResourceObject\":\n        \"\"\"\n            Get meta information about a trash resource.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param sort: `str`, field to be used as a key to sort children resources\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: :any:`AsyncTrashResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"ResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.get_trash_meta(str(path), **kwargs)\n\n    async def exists(self: ResourceProtocol,\n                     relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether the trash resource exists.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `bool`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.trash_exists(str(path), **kwargs)\n\n    async def get_type(self: ResourceProtocol,\n                       relative_path: Optional[str] = None, /, **kwargs) -> str:\n        \"\"\"\n            Get trash resource type.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: \"file\" or \"dir\"\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.get_trash_type(str(path), **kwargs)\n\n    async def is_dir(self: ResourceProtocol,\n                     relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource is a trash directory.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a directory, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.is_trash_dir(str(path), **kwargs)\n\n    async def is_file(self: ResourceProtocol,\n                      relative_path: Optional[str] = None, /, **kwargs) -> bool:\n        \"\"\"\n            Check whether resource is a trash file.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises ForbiddenError: application doesn't have enough rights for this request\n\n            :returns: `True` if `path` is a file, `False` otherwise (even if it doesn't exist)\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.is_trash_file(str(path), **kwargs)\n\n    async def listdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        **kwargs\n    ) -> AsyncGenerator[\"AsyncTrashResourceObject\", None]:\n        \"\"\"\n            Get contents of a trash resource.\n\n            :param relative_path: `str` or `None`, relative path to the directory in the trash bin\n            :param max_items: `int` or `None`, maximum number of returned items (`None` means unlimited)\n            :param limit: number of children resources to be included in the response\n            :param offset: number of children resources to be skipped in the response\n            :param preview_size: size of the file preview\n            :param preview_crop: `bool`, cut the preview to the size specified in the `preview_size`\n            :param fields: list of keys to be included in the response\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises WrongResourceTypeError: resource is not a directory\n\n            :returns: generator of :any:`AsyncTrashResourceObject`\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        async for i in self._yadisk.trash_listdir(str(path), **kwargs):\n            yield i\n\n    async def remove(self: ResourceProtocol,\n                     relative_path: Optional[str] = None, /, **kwargs) -> Optional[\"AsyncOperationLinkObject\"]:\n        \"\"\"\n            Remove a trash resource.\n\n            :param relative_path: `str` or `None`, relative path to the trash resource to be deleted\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`AsyncOperationLinkObject` if the operation is performed asynchronously, `None` otherwise\n        \"\"\"\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.remove_trash(str(path), **kwargs)\n\n    @overload\n    async def restore(self: ResourceProtocol,\n                      dst_path: str, /, **kwargs) -> Union[AsyncResourceLinkObject, \"AsyncOperationLinkObject\"]:\n        pass\n\n    @overload\n    async def restore(self: ResourceProtocol,\n                      relative_path: Optional[str],\n                      dst_path: str, /, **kwargs) -> Union[AsyncResourceLinkObject, \"AsyncOperationLinkObject\"]:\n        pass\n\n    async def restore(\n        self: ResourceProtocol,\n        /,\n        *args,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, \"AsyncOperationLinkObject\"]:\n        \"\"\"\n            Restore a trash resource.\n            Returns a link to the newly created resource or a link to the asynchronous operation.\n\n            This method takes 1 or 2 positional arguments:\n\n            1. :code:`restore(dst_path, /, **kwargs)`\n            2. :code:`restore(relative_path=None, dst_path, /, **kwargs)`\n\n            :param relative_path: `str` or `None`, relative path to the trash resource to be restored\n            :param dst_path: destination path\n            :param overwrite: `bool`, determines whether the destination can be overwritten\n            :param force_async: forces the operation to be executed asynchronously\n            :param fields: list of keys to be included in the response\n            :param wait: `bool`, if :code:`True`, the method will wait until the asynchronous operation is completed\n            :param poll_interval: `float`, interval in seconds between subsequent operation status queries\n            :param poll_timeout: `float` or `None`, total polling timeout (`None` means no timeout),\n                                 if this timeout is exceeded, an exception is raised\n            :param timeout: `float` or `tuple`, request timeout\n            :param headers: `dict` or `None`, additional request headers\n            :param n_retries: `int`, maximum number of retries\n            :param retry_interval: delay between retries in seconds\n            :param retry_on: `tuple`, additional exception classes to retry on\n            :param aiohttp_args: `dict`, additional parameters for :any:`AIOHTTPSession`\n            :param httpx_args: `dict`, additional parameters for :any:`AsyncHTTPXSession`\n            :param kwargs: any other parameters, accepted by :any:`Session.send_request()`\n\n            :raises PathNotFoundError: resource was not found on Disk\n            :raises PathExistsError: destination path already exists\n            :raises ForbiddenError: application doesn't have enough rights for this request\n            :raises ResourceIsLockedError: resource is locked by another request\n            :raises OperationNotFoundError: requested operation was not found\n            :raises AsyncOperationFailedError: requested operation failed\n            :raises AsyncOperationPollingTimeoutError: requested operation did not\n                                                       complete in specified time\n                                                       (when `poll_timeout` is not `None`)\n\n            :returns: :any:`AsyncResourceLinkObject` or :any:`AsyncOperationLinkObject`\n        \"\"\"\n\n        if len(args) == 0:\n            relative_path = dst_path = None\n        elif len(args) == 1:\n            relative_path, dst_path = None, args[0]\n        elif len(args) == 2:\n            relative_path, dst_path = args\n        else:\n            raise TypeError(\"restore() takes up to 2 positional arguments\")\n\n        if self._yadisk is None:\n            raise ValueError(\"This object is not bound to a YaDisk instance\")\n\n        if self.path is None:\n            raise ValueError(\"TrashResourceObject doesn't have a path\")\n\n        path = PurePosixPath(self.path) / (relative_path or \"\")\n\n        return await self._yadisk.restore_trash(str(path), dst_path, **kwargs)\n\n\nclass TrashResourceListObject(ResourceListObject):\n    \"\"\"\n        List of trash resources.\n\n        :param trash_resource_list: `dict` or `None`\n        :param yadisk: :any:`Client`/:any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar sort: `str`, sort type\n        :ivar items: `list`, list of resources (:any:`TrashResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n        :ivar path: `str`, path to the directory that contains the elements of the list\n        :ivar total: `int`, number of elements in the list\n    \"\"\"\n\n    items: Optional[List[TrashResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 trash_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        ResourceListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"items\", typed_list(partial(TrashResourceObject, yadisk=yadisk)))\n        self.import_fields(trash_resource_list)\n\n\nclass SyncTrashResourceListObject(TrashResourceListObject):\n    \"\"\"\n        List of trash resources.\n\n        :param trash_resource_list: `dict` or `None`\n        :param yadisk: :any:`Client` or `None`, `YaDisk` object\n\n        :ivar sort: `str`, sort type\n        :ivar items: `list`, list of resources (:any:`SyncTrashResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n        :ivar path: `str`, path to the directory that contains the elements of the list\n        :ivar total: `int`, number of elements in the list\n    \"\"\"\n\n    items: Optional[List[SyncTrashResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 trash_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        TrashResourceListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"items\", typed_list(partial(SyncTrashResourceObject, yadisk=yadisk)))\n        self.import_fields(trash_resource_list)\n\n\nclass AsyncTrashResourceListObject(TrashResourceListObject):\n    \"\"\"\n        List of trash resources.\n\n        :param trash_resource_list: `dict` or `None`\n        :param yadisk: :any:`AsyncClient` or `None`, `YaDisk` object\n\n        :ivar sort: `str`, sort type\n        :ivar items: `list`, list of resources (:any:`AsyncTrashResourceObject`)\n        :ivar limit: `int`, maximum number of elements in the list\n        :ivar offset: `int`, offset from the beginning of the list\n        :ivar path: `str`, path to the directory that contains the elements of the list\n        :ivar total: `int`, number of elements in the list\n    \"\"\"\n\n    items: Optional[List[AsyncTrashResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 trash_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None):\n        TrashResourceListObject.__init__(self, None, yadisk)\n        self.set_field_type(\"items\", typed_list(partial(AsyncTrashResourceObject, yadisk=yadisk)))\n        self.import_fields(trash_resource_list)\n\n\nclass PublicSettingsObject(YaDiskObject):\n    \"\"\"\n        Public settings of a shared resource.\n\n        :ivar available_until: `int`, timestamp indicating the expiration date of the link\n        :ivar read_only: `bool`, whether the resource is read-only\n        :ivar available_until_verbose: :any:`AvailableUntilVerboseObject`, verbose information about the expiration date\n        :ivar password: `str`, password to access the resource\n        :ivar password_verbose: :any:`PasswordVerboseObject`, verbose information about the password\n        :ivar external_organization_id: `str`, external organization ID\n        :ivar external_organization_id_verbose: :any:`ExternalOrganizationIdVerboseObject`,\n            verbose information about the external organization ID\n        :ivar accesses: `List[PublicSettingsAccessObject]`, list of access settings\n    \"\"\"\n\n    available_until: Optional[int]\n    read_only: Optional[bool]\n    available_until_verbose: Optional[\"AvailableUntilVerboseObject\"]\n    password: Optional[str]\n    password_verbose: Optional[\"PasswordVerboseObject\"]\n    external_organization_id: Optional[str]\n    external_organization_id_verbose: Optional[\"ExternalOrganizationIdVerboseObject\"]\n    accesses: Optional[List[\"PublicAccessObject\"]]\n\n    def __init__(\n        self,\n        public_settings: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"available_until\": int_or_error,\n                 \"read_only\": bool_or_error,\n                 \"available_until_verbose\": AvailableUntilVerboseObject,\n                 \"password\": str_or_error,\n                 \"password_verbose\": PasswordVerboseObject,\n                 \"external_organization_id\": str_or_error,\n                 \"external_organization_id_verbose\": ExternalOrganizationIdVerboseObject,\n                 \"accesses\": typed_list(PublicAccessObject)\n            },\n            yadisk\n        )\n        self.import_fields(public_settings)\n\n\nclass AvailableUntilVerboseObject(YaDiskObject):\n    \"\"\"\n        Verbose information about the expiration date of a shared resource.\n\n        :ivar enabled: `bool`, whether the expiration date is enabled\n        :ivar value: `int`, timestamp of the expiration date\n    \"\"\"\n\n    enabled: Optional[bool]\n    value: Optional[int]\n\n    def __init__(\n        self,\n        available_until_verbose: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"enabled\": bool_or_error,\n                \"value\": int_or_error\n            },\n            yadisk\n        )\n        self.import_fields(available_until_verbose)\n\n\nclass PasswordVerboseObject(YaDiskObject):\n    \"\"\"\n        Verbose information about the password of shared resource.\n\n        :ivar enabled: `bool`, whether the password is enabled\n        :ivar value: `str`, password value\n    \"\"\"\n\n    enabled: Optional[bool]\n    value: Optional[str]\n\n    def __init__(\n        self,\n        password_verbose: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"enabled\": bool_or_error,\n                \"value\": str_or_error\n            },\n            yadisk\n        )\n        self.import_fields(password_verbose)\n\n\nclass ExternalOrganizationIdVerboseObject(YaDiskObject):\n    \"\"\"\n        Verbose information about the external organization ID of a shared resource.\n\n        :ivar enabled: `bool`, whether the external organization ID is enabled\n        :ivar value: `str`, external organization ID\n    \"\"\"\n\n    enabled: Optional[bool]\n    value: Optional[str]\n\n    def __init__(\n        self,\n        external_organization_id_verbose: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"enabled\": bool_or_error,\n                \"value\": str_or_error\n            },\n            yadisk\n        )\n        self.import_fields(external_organization_id_verbose)\n\n\nclass PublicAccessObject(YaDiskObject):\n    \"\"\"\n        Access settings of a shared resource.\n\n        :ivar macros: `List[Union[Literal[\"employees\"], Literal[\"all\"]]],`,\n            specifies who has access to the shared resource, must contain only\n            one element\n        :ivar type: `str`, specifies the type of access, must be one of the following:\n\n        - `macro`: access for all employees or all users\n        - `user`: access for a specific user\n        - `group`: access for a specific group\n        - `department`: access for a specific department\n\n        :ivar org_id: `int`, organization ID\n        :ivar id: `str`, user, group or department ID\n        :ivar rights: `List[str]`, specifies the access rights\n\n        Valid access rights:\n\n        - `write`: write access\n        - `read`: read access\n        - `read_without_download`: read access without download\n        - `read_with_password`: read access with password\n        - `read_with_password_without_download`: read access with password and without download\n    \"\"\"\n\n    macros: Optional[List[Union[Literal[\"all\", \"employees\"], str]]]\n    type: Optional[Union[Literal[\"macro\", \"user\", \"group\", \"department\"], str]]\n    org_id: Optional[int]\n    id: Optional[str]\n    rights: Optional[List[\n        Union[\n            Literal[\n                \"read\",\n                \"write\",\n                \"read_without_download\",\n                \"read_with_password\",\n                \"read_with_password_without_download\"\n            ],\n            str\n        ]\n    ]]\n\n    def __init__(\n        self,\n        public_access: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"macros\": typed_list(str_or_error),\n                \"type\": str_or_error,\n                \"org_id\": int_or_error,\n                \"id\": str_or_error,\n                \"group_ids\": typed_list(int_or_error),\n                \"department_ids\": typed_list(int_or_error),\n                \"rights\": typed_list(str_or_error)\n            },\n            yadisk\n        )\n        self.import_fields(public_access)\n\n\nclass PublicAvailableSettingsObject(YaDiskObject):\n    \"\"\"\n        Public settings of a shared resource for the current OAuth token owner.\n\n        :ivar permissions: `List[str]`, list of available permissions\n        :ivar address_access_sharing: `str`, specifies who has access to the\n            shared resource, must be one of the following:\n\n            - `all`: access for all users\n            - `inner`: access for all employees\n\n        :ivar use_sharing: `bool`, whether the resource can be shared\n        :ivar macro_sharing: `str`, specifies who has access to the shared\n            resource, must be one of the following:\n\n            - `all`: access for all users\n            - `inner`: access for all employees\n\n        :ivar default: `List[PublicDefault]`, default public settings\n    \"\"\"\n\n    permissions: Optional[List[str]]\n    address_access_sharing: Optional[Union[Literal[\"all\", \"inner\"], str]]\n    use_sharing: Optional[bool]\n    macro_sharing: Optional[Union[Literal[\"all\", \"inner\"], str]]\n    default: Optional[List[\"PublicDefaultObject\"]]\n\n    def __init__(\n        self,\n        public_available_settings: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"permissions\": typed_list(str_or_error),\n                \"address_access_sharing\": str_or_error,\n                \"use_sharing\": bool_or_error,\n                \"macro_sharing\": str_or_error,\n                \"default\": typed_list(PublicDefaultObject)\n            },\n            yadisk\n        )\n        self.import_fields(public_available_settings)\n\n\nclass PublicDefaultObject(YaDiskObject):\n    \"\"\"\n        Access settings of a shared resource.\n\n        :ivar macros: `List[Union[Literal[\"employees\"], Literal[\"all\"]]],`,\n            specifies who has access to the shared resource, must contain only\n            one element\n        :ivar org_id: `int`, organization ID\n        :ivar rights: `List[str]`, specifies the access rights\n\n        Valid access rights:\n\n        - `write`: write access\n        - `read`: read access\n        - `read_without_download`: read access without download\n        - `read_with_password`: read access with password\n        - `read_with_password_without_download`: read access with password and without download\n    \"\"\"\n\n    macros: Optional[List[str]]\n    org_id: Optional[int]\n    rights: Optional[List[str]]\n\n    def __init__(\n        self,\n        public_default: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        YaDiskObject.__init__(\n            self,\n            {\n                \"macros\": typed_list(str_or_error),\n                \"org_id\": int_or_error,\n                \"rights\": typed_list(str_or_error)\n            },\n            yadisk\n        )\n        self.import_fields(public_default)\n"
  },
  {
    "path": "src/yadisk/objects/_resources.pyi",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom ._yadisk_object import YaDiskObject\nfrom ._link_object import LinkObject\nfrom ._disk import UserPublicInfoObject\n\nfrom typing import Any, Literal, overload, Union, Protocol, Optional\n\nfrom .._typing_compat import (\n    Generator, Dict, List, AsyncGenerator, Iterable, Tuple, Type\n)\n\nfrom ..types import (\n    AsyncFileOrPath, AsyncFileOrPathDestination, FileOrPath,\n    FileOrPathDestination, Headers, TimeoutParameter, PublicSettings\n)\n\nimport datetime\nfrom ._operations import (\n    OperationLinkObject, AsyncOperationLinkObject, SyncOperationLinkObject\n)\n\n__all__ = [\n    \"AsyncFilesResourceListObject\",\n    \"AsyncLastUploadedResourceListObject\",\n    \"AsyncPublicResourceLinkObject\",\n    \"AsyncPublicResourceListObject\",\n    \"AsyncPublicResourceObject\",\n    \"AsyncPublicResourcesListObject\",\n    \"AsyncResourceLinkObject\",\n    \"AsyncResourceListObject\",\n    \"AsyncResourceObject\",\n    \"AsyncTrashResourceListObject\",\n    \"AsyncTrashResourceObject\",\n    \"AvailableUntilVerboseObject\",\n    \"CommentIDsObject\",\n    \"EXIFObject\",\n    \"ExternalOrganizationIdVerboseObject\",\n    \"FilesResourceListObject\",\n    \"LastUploadedResourceListObject\",\n    \"PasswordVerboseObject\",\n    \"PublicAccessObject\",\n    \"PublicAvailableSettingsObject\",\n    \"PublicDefaultObject\",\n    \"PublicResourceLinkObject\",\n    \"PublicResourceListObject\",\n    \"PublicResourceObject\",\n    \"PublicResourcesListObject\",\n    \"PublicSettingsObject\",\n    \"ResourceDownloadLinkObject\",\n    \"ResourceLinkObject\",\n    \"ResourceListObject\",\n    \"ResourceObject\",\n    \"ResourceUploadLinkObject\",\n    \"ShareInfoObject\",\n    \"SyncFilesResourceListObject\",\n    \"SyncLastUploadedResourceListObject\",\n    \"SyncPublicResourceLinkObject\",\n    \"SyncPublicResourceListObject\",\n    \"SyncPublicResourceObject\",\n    \"SyncPublicResourcesListObject\",\n    \"SyncResourceLinkObject\",\n    \"SyncResourceListObject\",\n    \"SyncResourceObject\",\n    \"SyncTrashResourceListObject\",\n    \"SyncTrashResourceObject\",\n    \"TrashResourceListObject\",\n    \"TrashResourceObject\",\n]\n\n\nclass CommentIDsObject(YaDiskObject):\n    private_resource: Optional[str]\n    public_resource: Optional[str]\n\n    def __init__(self,\n                 comment_ids: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass EXIFObject(YaDiskObject):\n    date_time: Optional[datetime.datetime]\n    gps_longitude: Optional[float]\n    gps_latitude:  Optional[float]\n\n    def __init__(\n        self,\n        exif: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        ...\n\nclass FilesResourceListObject(YaDiskObject):\n    items: Optional[List[\"ResourceObject\"]]\n    limit: Optional[int]\n    offset: Optional[int]\n\n    def __init__(self,\n                 files_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass SyncFilesResourceListObject(FilesResourceListObject):\n    items: Optional[List[\"SyncResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 files_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\nclass AsyncFilesResourceListObject(FilesResourceListObject):\n    items: Optional[List[\"AsyncResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 files_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass LastUploadedResourceListObject(YaDiskObject):\n    items: Optional[List[\"ResourceObject\"]]\n    limit: Optional[int]\n\n    def __init__(self,\n                 last_uploaded_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass SyncLastUploadedResourceListObject(LastUploadedResourceListObject):\n    items: Optional[List[\"SyncResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 last_uploaded_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass AsyncLastUploadedResourceListObject(LastUploadedResourceListObject):\n    items: Optional[List[\"AsyncResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 last_uploaded_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass PublicResourcesListObject(YaDiskObject):\n    items: Optional[List[\"PublicResourceObject\"]]\n    type: Optional[str]\n    limit: Optional[int]\n    offset: Optional[int]\n\n    def __init__(self,\n                 public_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass SyncPublicResourcesListObject(PublicResourcesListObject):\n    items: Optional[List[\"SyncPublicResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 public_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass AsyncPublicResourcesListObject(PublicResourcesListObject):\n    items: Optional[List[\"AsyncPublicResourceObject\"]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 public_resources_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass ResourceProtocol(Protocol):\n    @property\n    def type(self) -> Optional[str]: ...\n\n    @property\n    def path(self) -> Optional[str]: ...\n\n    @property\n    def public_key(self) -> Optional[str]: ...\n\n    @property\n    def public_url(self) -> Optional[str]: ...\n\n    @property\n    def file(self) -> Optional[str]: ...\n\n    @property\n    def _yadisk(self) -> Optional[Any]: ...\n\n\nclass ResourceObjectMethodsMixin:\n    def get_meta(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncResourceObject\":\n        ...\n\n    def get_public_meta(\n        self: ResourceProtocol,\n        *,\n        path: Optional[str] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncPublicResourceObject\":\n        ...\n\n    def exists(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def get_type(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    def is_dir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def is_file(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def listdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Generator[SyncResourceObject, None, None]:\n        ...\n\n    def public_listdir(\n        self: ResourceProtocol,\n        *,\n        path: Optional[str] = None,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Generator[SyncPublicResourceObject, None, None]:\n        ...\n\n    def get_upload_link(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        overwrite: bool = False,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs) -> str:\n        ...\n\n    def get_upload_link_object(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        overwrite: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> ResourceUploadLinkObject:\n        ...\n\n    def upload(\n        self: ResourceProtocol,\n        path_or_file: FileOrPath,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        overwrite: bool = False,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncResourceLinkObject\":\n        ...\n\n    def upload_url(\n        self: ResourceProtocol,\n        url: str,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        disable_redirects: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"OperationLinkObject\":\n        ...\n\n    def get_download_link(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    @overload\n    def download(\n        self: ResourceProtocol,\n        dst_path_or_file: FileOrPathDestination,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncResourceLinkObject\":\n        ...\n\n    @overload\n    def download(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path_or_file: FileOrPathDestination,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncResourceLinkObject\":\n        ...\n\n    @overload\n    def patch(\n        self: ResourceProtocol,\n        properties: Dict,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncResourceObject\":\n        ...\n\n    @overload\n    def patch(\n        self: ResourceProtocol,\n        relative_path: Union[str, None],\n        properties: Dict,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncResourceObject\":\n        ...\n\n    def publish(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        allow_address_access: bool = False,\n        public_settings: Optional[PublicSettings] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncResourceLinkObject\":\n        ...\n\n    def unpublish(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncResourceLinkObject\":\n        ...\n\n    def get_public_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        allow_address_access: bool = False,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        ...\n\n    def get_public_available_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        ...\n\n    @overload\n    def update_public_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        public_settings: PublicSettings,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        ...\n\n    @overload\n    def update_public_settings(\n        self: ResourceProtocol,\n        public_settings: PublicSettings,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        ...\n\n    def mkdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        ...\n\n    def makedirs(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncResourceLinkObject:\n        ...\n\n    @overload\n    def remove(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def remove(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Optional[SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def move(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def move(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def move(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def move(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def rename(\n        self: ResourceProtocol,\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def rename(\n        self: ResourceProtocol,\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def rename(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def rename(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def copy(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def copy(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def copy(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def copy(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n\nclass AsyncResourceObjectMethodsMixin:\n    async def get_meta(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceObject\":\n        ...\n\n    async def get_public_meta(\n        self: ResourceProtocol,\n        *,\n        path: Optional[str] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncPublicResourceObject\":\n        ...\n\n    async def exists(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def get_type(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    async def is_dir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def is_file(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def listdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncGenerator[AsyncResourceObject, None]:\n        # This line here is needed so that the type checker knows that this is\n        # an async generator, rather than a simple async function\n        yield AsyncResourceObject()\n\n    async def public_listdir(\n        self: ResourceProtocol,\n        *,\n        path: Optional[str] = None,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncGenerator[AsyncPublicResourceObject, None]:\n        # This line here is needed so that the type checker knows that this is\n        # an async generator, rather than a simple async function\n        yield AsyncPublicResourceObject()\n\n    async def get_upload_link(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        overwrite: bool = False,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    async def get_upload_link_object(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        overwrite: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> ResourceUploadLinkObject:\n        ...\n\n    async def upload(\n        self: ResourceProtocol,\n        path_or_file: AsyncFileOrPath,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        overwrite: bool = False,\n        spoof_user_agent: bool = True,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        ...\n\n    async def upload_url(\n        self: ResourceProtocol,\n        url: str,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        disable_redirects: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncOperationLinkObject\":\n        ...\n\n    async def get_download_link(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    @overload\n    async def download(\n        self: ResourceProtocol,\n        dst_path_or_file: AsyncFileOrPathDestination,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        ...\n\n    @overload\n    async def download(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path_or_file: AsyncFileOrPathDestination,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        ...\n\n    @overload\n    async def patch(\n        self: ResourceProtocol,\n        properties: Dict,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceObject\":\n        ...\n\n    @overload\n    async def patch(\n        self: ResourceProtocol,\n        relative_path: Union[str, None],\n        properties: dict,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceObject\":\n        ...\n\n    async def publish(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        allow_address_access: bool = False,\n        public_settings: Optional[PublicSettings] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        ...\n\n    async def unpublish(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        ...\n\n    async def get_public_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        allow_address_access: bool = False,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        ...\n\n    async def get_public_available_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        ...\n\n    @overload\n    async def update_public_settings(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        public_settings: PublicSettings,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        ...\n\n    @overload\n    async def update_public_settings(\n        self: ResourceProtocol,\n        public_settings: PublicSettings,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"PublicSettingsObject\":\n        ...\n\n    async def mkdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        ...\n\n    async def makedirs(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncResourceLinkObject\":\n        ...\n\n    @overload\n    async def remove(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def remove(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Optional[AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def move(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def move(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def move(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def move(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def rename(\n        self: ResourceProtocol,\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def rename(\n        self: ResourceProtocol,\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def rename(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def rename(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        new_name: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def copy(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def copy(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def copy(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def copy(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n\nclass ResourceObject(YaDiskObject):\n    antivirus_status: Optional[str]\n    file: Optional[str]\n    size: Optional[int]\n    public_key: Optional[str]\n    sha256: Optional[str]\n    embedded: Optional[\"ResourceListObject\"]\n    _embedded: Optional[\"ResourceListObject\"]\n    name: Optional[str]\n    exif: Optional[EXIFObject]\n    resource_id: Optional[str]\n    custom_properties: Optional[Dict]\n    public_url: Optional[str]\n    share: Optional[\"ShareInfoObject\"]\n    modified: Optional[\"datetime.datetime\"]\n    created: Optional[\"datetime.datetime\"]\n    photoslice_time: Optional[\"datetime.datetime\"]\n    mime_type: Optional[str]\n    path: Optional[str]\n    preview: Optional[str]\n    comment_ids: Optional[CommentIDsObject]\n    type: Optional[str]\n    media_type: Optional[str]\n    md5: Optional[str]\n    revision: Optional[int]\n    sizes: Optional[Dict[str, str]]\n\n    def __init__(self, resource: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass SyncResourceObject(ResourceObject, ResourceObjectMethodsMixin):\n    embedded: Optional[\"SyncResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"SyncResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self, resource: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass AsyncResourceObject(ResourceObject, AsyncResourceObjectMethodsMixin):\n    embedded: Optional[\"AsyncResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"AsyncResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self, resource: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass ResourceLinkObject(LinkObject):\n    type: Optional[str]\n    public_key: Optional[str]\n    public_url: Optional[str]\n    file: Optional[str]\n\n    path: Optional[str]\n\n    def __init__(self, link: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n    @classmethod\n    def from_path(cls, path: Optional[str], yadisk: Optional[Any] = None):\n        ...\n\n\nclass SyncResourceLinkObject(ResourceLinkObject, ResourceObjectMethodsMixin):\n    ...\n\n\nclass AsyncResourceLinkObject(ResourceLinkObject, AsyncResourceObjectMethodsMixin):\n    ...\n\n\nclass PublicResourceLinkObject(LinkObject):\n    type: Optional[str]\n    file: Optional[str]\n\n    path: Optional[str]\n    public_key: Optional[str]\n    public_url: Optional[str]\n\n    def __init__(self, link: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n    @classmethod\n    def from_public_key(cls, public_key: Optional[str], yadisk: Optional[Any] = None):\n        ...\n\nclass SyncPublicResourceLinkObject(PublicResourceLinkObject, ResourceObjectMethodsMixin):\n    ...\n\n\nclass AsyncPublicResourceLinkObject(PublicResourceLinkObject, AsyncResourceObjectMethodsMixin):\n    ...\n\n\nclass ResourceListObject(YaDiskObject):\n    sort: Optional[str]\n    items: Optional[List[ResourceObject]]\n    limit: Optional[int]\n    offset: Optional[int]\n    path: Optional[str]\n    total: Optional[int]\n\n    def __init__(self, resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass SyncResourceListObject(ResourceListObject):\n    items: Optional[List[SyncResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self, resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass AsyncResourceListObject(ResourceListObject):\n    items: Optional[List[AsyncResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self, resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass ResourceUploadLinkObject(LinkObject):\n    operation_id: Optional[str]\n\n    def __init__(self,\n                 resource_upload_link: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass ResourceDownloadLinkObject(LinkObject):\n    ...\n\n\nclass ShareInfoObject(YaDiskObject):\n    is_root: Optional[bool]\n    is_owned: Optional[bool]\n    rights: Optional[str]\n\n    def __init__(self, share_info: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass PublicResourceObject(ResourceObject):\n    views_count: Optional[int]\n    view_count: Optional[int]\n    embedded: Optional[\"PublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"PublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    owner: Optional[UserPublicInfoObject]\n\n    def __init__(self, public_resource: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass SyncPublicResourceObject(PublicResourceObject, ResourceObjectMethodsMixin):\n    embedded: Optional[\"SyncPublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"SyncPublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self, public_resource: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass AsyncPublicResourceObject(PublicResourceObject, AsyncResourceObjectMethodsMixin):\n    embedded: Optional[\"AsyncPublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"AsyncPublicResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self, public_resource: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass PublicResourceListObject(ResourceListObject):\n    public_key: Optional[str]\n    items: Optional[List[PublicResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 public_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass SyncPublicResourceListObject(PublicResourceListObject):\n    items: Optional[List[SyncPublicResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self, public_resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass AsyncPublicResourceListObject(PublicResourceListObject):\n    items: Optional[List[AsyncPublicResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self, public_resource_list: Optional[Dict] = None, yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass TrashResourceObject(ResourceObject):\n    embedded: Optional[\"TrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"TrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    origin_path: Optional[str]\n    deleted: Optional[\"datetime.datetime\"]\n\n    def __init__(self,\n                 trash_resource: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass SyncTrashResourceObject(TrashResourceObject):\n    embedded: Optional[\"SyncTrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"SyncTrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self,\n                 trash_resource: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n    def get_meta(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> \"SyncTrashResourceObject\":\n        ...\n\n    def exists(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def get_type(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    def is_dir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def is_file(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    def listdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Generator[SyncTrashResourceObject, None, None]:\n        ...\n\n    @overload\n    def remove(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def remove(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Optional[SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def restore(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def restore(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n    @overload\n    def restore(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> SyncOperationLinkObject:\n        ...\n\n    @overload\n    def restore(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        requests_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Union[SyncResourceLinkObject, SyncOperationLinkObject]:\n        ...\n\n\nclass AsyncTrashResourceObject(TrashResourceObject):\n    embedded: Optional[\"AsyncTrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n    _embedded: Optional[\"AsyncTrashResourceListObject\"]  # pyright: ignore[reportIncompatibleVariableOverride]\n\n    def __init__(self,\n                 trash_resource: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n    async def get_meta(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> \"AsyncTrashResourceObject\":\n        ...\n\n    async def exists(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def get_type(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> str:\n        ...\n\n    async def is_dir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def is_file(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> bool:\n        ...\n\n    async def listdir(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        max_items: Optional[int] = None,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        preview_size: Optional[str] = None,\n        preview_crop: Optional[bool] = None,\n        sort: Optional[str] = None,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncGenerator[AsyncTrashResourceObject, None]:\n        # This line here is needed so that the type checker knows that this is\n        # an async generator, rather than a simple async function\n        yield AsyncTrashResourceObject()\n\n    @overload\n    async def remove(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def remove(\n        self: ResourceProtocol,\n        relative_path: Optional[str] = None,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Optional[AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def restore(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def restore(\n        self: ResourceProtocol,\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n    @overload\n    async def restore(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: Literal[True],\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> AsyncOperationLinkObject:\n        ...\n\n    @overload\n    async def restore(\n        self: ResourceProtocol,\n        relative_path: Optional[str],\n        dst_path: str,\n        /,\n        *,\n        wait: bool = True,\n        poll_interval: float = 1.0,\n        poll_timeout: Optional[float] = None,\n        overwrite: bool = False,\n        force_async: bool = False,\n        fields: Optional[Iterable[str]] = None,\n        headers: Optional[Headers] = None,\n        timeout: TimeoutParameter = ...,\n        n_retries: Optional[int] = None,\n        retry_interval: Optional[float] = None,\n        retry_on: Tuple[Type[Exception], ...] = tuple(),\n        aiohttp_args: Optional[Dict[str, Any]] = None,\n        httpx_args: Optional[Dict[str, Any]] = None,\n        **kwargs\n    ) -> Union[AsyncResourceLinkObject, AsyncOperationLinkObject]:\n        ...\n\n\nclass TrashResourceListObject(ResourceListObject):\n    items: Optional[List[TrashResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 trash_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass SyncTrashResourceListObject(TrashResourceListObject):\n    items: Optional[List[SyncTrashResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 trash_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass AsyncTrashResourceListObject(TrashResourceListObject):\n    items: Optional[List[AsyncTrashResourceObject]]  # type: ignore[assignment]\n\n    def __init__(self,\n                 trash_resource_list: Optional[Dict] = None,\n                 yadisk: Optional[Any] = None) -> None:\n        ...\n\n\nclass PublicSettingsObject(YaDiskObject):\n    available_until: Optional[int]\n    read_only: Optional[bool]\n    available_until_verbose: Optional[\"AvailableUntilVerboseObject\"]\n    password: Optional[str]\n    password_verbose: Optional[\"PasswordVerboseObject\"]\n    external_organization_id: Optional[str]\n    external_organization_id_verbose: Optional[\"ExternalOrganizationIdVerboseObject\"]\n    accesses: Optional[List[\"PublicAccessObject\"]]\n\n    def __init__(\n        self,\n        public_settings: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        ...\n\n\nclass AvailableUntilVerboseObject(YaDiskObject):\n    enabled: Optional[bool]\n    value: Optional[int]\n\n    def __init__(\n        self,\n        available_until_verbose: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        ...\n\n\nclass PasswordVerboseObject(YaDiskObject):\n    enabled: Optional[bool]\n    value: Optional[str]\n\n    def __init__(\n        self,\n        password_verbose: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        ...\n\n\nclass ExternalOrganizationIdVerboseObject(YaDiskObject):\n    enabled: Optional[bool]\n    value: Optional[str]\n\n    def __init__(\n        self,\n        external_organization_id_verbose: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        ...\n\n\nclass PublicAccessObject(YaDiskObject):\n    macros: Optional[List[Union[Literal[\"all\", \"employees\"], str]]]\n    type: Optional[Union[Literal[\"macro\", \"user\", \"group\", \"department\"], str]]\n    org_id: Optional[int]\n    id: Optional[str]\n    rights: Optional[List[\n        Union[\n            Literal[\n                \"read\",\n                \"write\",\n                \"read_without_download\",\n                \"read_with_password\",\n                \"read_with_password_without_download\"\n            ],\n            str\n        ]\n    ]]\n\n    def __init__(\n        self,\n        public_access: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        ...\n\n\nclass PublicAvailableSettingsObject(YaDiskObject):\n    permissions: Optional[List[str]]\n    address_access_sharing: Optional[Union[Literal[\"all\", \"inner\"], str]]\n    use_sharing: Optional[bool]\n    macro_sharing: Optional[Union[Literal[\"all\", \"inner\"], str]]\n    default: Optional[List[\"PublicDefaultObject\"]]\n\n    def __init__(\n        self,\n        public_available_settings: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        ...\n\n\nclass PublicDefaultObject(YaDiskObject):\n    macros: Optional[List[str]]\n    org_id: Optional[int]\n    rights: Optional[List[str]]\n\n    def __init__(\n        self,\n        public_default: Optional[Dict] = None,\n        yadisk: Optional[Any] = None\n    ) -> None:\n        ...\n"
  },
  {
    "path": "src/yadisk/objects/_yadisk_object.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import Any, Optional\nfrom .._typing_compat import Callable, Iterator, Generator\n\n__all__ = [\"YaDiskObject\"]\n\n\nclass YaDiskObject:\n    \"\"\"\n        Base class for all objects mirroring the ones returned by Yandex.Disk REST API.\n        It must have a fixed number of fields, each field must have a type.\n        It also supports subscripting and access of fields through the . operator.\n\n        :param field_types: `dict` or `None`\n        :param yadisk: :any:`YaDisk` or `None`, `YaDisk` object\n    \"\"\"\n\n    FIELD_TYPES: dict\n    FIELDS: dict\n    ALIASES: dict\n    _yadisk: Optional[Any]\n\n    def __init__(self,\n                 field_types: Optional[dict] = None,\n                 yadisk: Optional[Any] = None):\n        if field_types is None:\n            field_types = {}\n\n        self.FIELD_TYPES = {}\n        self.FIELDS = {}\n        self.ALIASES = {}\n        self.set_field_types(field_types)\n\n        self._yadisk = yadisk\n\n    def __dir__(self) -> Generator[str, None, None]:\n        \"\"\"\n            Return available attributes.\n        \"\"\"\n\n        yield from super().__dir__()\n        yield from self.FIELD_TYPES.keys()\n        yield from self.ALIASES.keys()\n\n    def set_field_types(self, field_types: dict) -> None:\n        \"\"\"\n            Set the field types of the object\n\n            :param field_types: `dict`, where keys are the field names and values are types (or factories)\n        \"\"\"\n\n        self.FIELD_TYPES = field_types\n\n    def set_field_type(self, field: str, type: Callable) -> None:\n        \"\"\"\n            Set field type.\n\n            :param field: `str`\n            :param type: type or factory\n        \"\"\"\n\n        self.FIELD_TYPES[field] = type\n\n    def set_alias(self, alias: str, name: str) -> None:\n        \"\"\"\n            Set an alias.\n\n            :param alias: `str`, alias to add\n            :param name: `str`, field name\n        \"\"\"\n\n        self.ALIASES[alias] = name\n\n    def remove_alias(self, alias: str) -> None:\n        \"\"\"\n            Remove an alias.\n\n            :param alias: `str`\n        \"\"\"\n\n        self.ALIASES.pop(alias)\n\n    def remove_field(self, field: str) -> None:\n        \"\"\"\n            Remove field.\n\n            :param field: `str`\n        \"\"\"\n\n        self.FIELDS.pop(field, None)\n        self.FIELD_TYPES.pop(field)\n\n    def import_fields(self, source_dict: Optional[dict]) -> None:\n        \"\"\"\n            Set all the fields of the object to the values in `source_dict`.\n            All the other fields are ignored\n\n            :param source_dict: `dict` or `None` (nothing will be done in that case)\n        \"\"\"\n\n        if source_dict is not None:\n            for field in self.FIELD_TYPES:\n                try:\n                    self[field] = source_dict[field]\n                except KeyError:\n                    pass\n\n            for alias, field in self.ALIASES.items():\n                try:\n                    self[field] = source_dict[alias]\n                except KeyError:\n                    pass\n\n    def __setattr__(self, attr: str, value: Any) -> None:\n        if attr in (\"FIELDS\", \"FIELD_TYPES\", \"ALIASES\", \"_yadisk\"):\n            self.__dict__[attr] = value\n            return\n\n        attr = self.ALIASES.get(attr, attr)\n\n        if attr not in self.FIELD_TYPES:\n            raise AttributeError(\"Unknown attribute: %r\" % (attr,))\n\n        datatype = self.FIELD_TYPES[attr]\n        self.FIELDS[attr] = datatype(value) if value is not None else None\n\n    def __getattr__(self, attr: str) -> Any:\n        attr = self.ALIASES.get(attr, attr)\n\n        if attr not in self.FIELD_TYPES:\n            raise AttributeError(\"Unknown attribute: %r\" % (attr,))\n\n        return self.FIELDS.get(attr)\n\n    def __getitem__(self, key: str) -> Any:\n        key = self.ALIASES.get(key, key)\n\n        if key not in self.FIELD_TYPES:\n            raise KeyError(str(key))\n\n        return self.FIELDS.get(key)\n\n    def __setitem__(self, key: str, value: Any) -> None:\n        self.__setattr__(key, value)\n\n    def __delitem__(self, key: str) -> None:\n        key = self.ALIASES.get(key, key)\n\n        if key not in self.FIELD_TYPES:\n            raise KeyError(str(key))\n\n        self.FIELDS.pop(key, None)\n\n    def __iter__(self) -> Iterator[dict]:\n        return iter(self.FIELDS)\n\n    def __len__(self) -> int:\n        return len(self.FIELDS)\n\n    def __repr__(self) -> str:\n        return \"<%s%r>\" % (self.__class__.__name__, self.FIELDS)\n\n    def _repr_pretty_(self, p, cycle: bool) -> None:\n        \"\"\"IPython pretty-print implementation.\"\"\"\n\n        if cycle:\n            p.text(f\"<{self.__class__.__name__}{'{...}'}>\")\n        else:\n            if not self.FIELDS:\n                p.text(f\"<{self.__class__.__name__}{'{}'}>\")\n                return\n\n            with p.group(4, f\"<{self.__class__.__name__}{'{'}\", \"})>\"):\n                p.breakable()\n\n                for idx, (k, v) in enumerate(self.FIELDS.items()):\n                    if idx:\n                        p.text(\",\")\n                        p.breakable()\n\n                    p.text(repr(k))\n                    p.text(\": \")\n                    p.pretty(v)\n\n    def field(self, name: str) -> Any:\n        \"\"\"\n            Get value of field `name`, guarantee it's not :code:`None` or\n            raise a :any:`ValueError`.\n\n            :param name: `str`, name of the field\n\n            :raises ValueError: value of the given field is :code:`None`\n\n            :returns: field's value\n        \"\"\"\n\n        value = self.__getattr__(name)\n\n        if value is not None:\n            return value\n\n        raise ValueError(f\"field {repr(name)} is None\")\n\n    def __matmul__(self, name: str) -> Any:\n        \"\"\"\n            The :code:`@` operator. Same as :any:`YaDiskObject.field()`.\n            Can be used like this:\n\n            .. code:: python\n\n                # if embedded or embedded.total turn out to be None, we'll get a ValueError\n                file_count = client.get_meta(\"/some_folder\") @ \"embedded\" @ \"total\"\n                print(f\"/some_folder contains {file_count} files\")\n\n            :param name: `str`, name of the field\n\n            :raises ValueError: value of the given field is :code:`None`\n\n            :returns: field's value\n        \"\"\"\n\n        return self.field(name)\n"
  },
  {
    "path": "src/yadisk/py.typed",
    "content": ""
  },
  {
    "path": "src/yadisk/sessions/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "src/yadisk/sessions/_httpx_common.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import Any, Optional, Union\n\nfrom ..exceptions import (\n    RequestError, TooManyRedirectsError,\n    RequestTimeoutError, YaDiskConnectionError\n)\n\nfrom ..types import TimeoutParameter\nfrom .._typing_compat import Dict, Tuple\nfrom .. import settings\n\nimport httpx\n\n__all__ = [\"convert_args_for_httpx\", \"convert_httpx_exception\", \"convert_timeout\"]\n\n\ndef convert_httpx_exception(exc: httpx.HTTPError) -> Union[RequestError, httpx.HTTPError]:\n    if isinstance(exc, httpx.TooManyRedirects):\n        return TooManyRedirectsError(str(exc))\n    elif isinstance(exc, httpx.TimeoutException):\n        return RequestTimeoutError(str(exc))\n    elif isinstance(exc, httpx.ConnectError):\n        return YaDiskConnectionError(str(exc))\n    elif isinstance(exc, httpx.HTTPError):\n        return RequestError(str(exc))\n    else:\n        return exc\n\n\ndef convert_timeout(timeout: TimeoutParameter) -> Optional[httpx.Timeout]:\n    if timeout is ...:\n        return convert_timeout(settings.DEFAULT_TIMEOUT)\n    elif timeout is None:\n        return None\n    elif isinstance(timeout, (int, float)):\n        return httpx.Timeout(timeout)\n\n    connect, read = timeout\n\n    return httpx.Timeout(connect=connect, pool=connect, read=read, write=read)\n\n\ndef convert_args_for_httpx(\n    session: Union[httpx.Client, httpx.AsyncClient],\n    kwargs: Dict[str, Any]\n) -> Tuple[Dict[str, Any], Dict[str, Any]]:\n    request_kwargs = {\n        \"params\": kwargs.get(\"params\"),\n        \"headers\": kwargs.get(\"headers\"),\n        \"content\": kwargs.get(\"data\"),\n        \"timeout\": session.timeout\n    }\n\n    if \"timeout\" in kwargs:\n        request_kwargs[\"timeout\"] = convert_timeout(kwargs[\"timeout\"])\n\n    send_kwargs = {\"stream\": kwargs.get(\"stream\", False)}\n\n    if \"httpx_args\" in kwargs:\n        httpx_args = dict(kwargs[\"httpx_args\"] or {})\n\n        for key in (\"stream\", \"auth\", \"follow_redirects\"):\n            if key in httpx_args:\n                send_kwargs[key] = httpx_args.pop(key)\n\n        request_kwargs.update(httpx_args)\n\n    return request_kwargs, send_kwargs\n"
  },
  {
    "path": "src/yadisk/sessions/aiohttp_session.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import Optional, Any, Union\n\nfrom ..exceptions import (\n    RequestError, TooManyRedirectsError,\n    RequestTimeoutError, YaDiskConnectionError\n)\n\nfrom .._async_session import AsyncSession, AsyncResponse\nfrom .._common import is_async_func\nfrom ..utils import CaseInsensitiveDict\nfrom .._typing_compat import Dict\nfrom ..types import (\n    JSON, AsyncConsumeCallback, Headers, TimeoutParameter, HTTPMethod, AsyncPayload\n)\n\nfrom .. import settings\n\nimport aiohttp\nimport sys\n\n__all__ = [\"AIOHTTPSession\"]\n\n\ndef convert_aiohttp_exception(exc: aiohttp.ClientError) -> Union[RequestError, aiohttp.ClientError]:\n    if isinstance(exc, aiohttp.TooManyRedirects):\n        return TooManyRedirectsError(str(exc))\n    elif isinstance(exc, aiohttp.ServerTimeoutError):\n        return RequestTimeoutError(str(exc))\n    elif isinstance(exc, aiohttp.ClientConnectionError):\n        return YaDiskConnectionError(str(exc))\n    elif isinstance(exc, aiohttp.ClientError):\n        return RequestError(str(exc))\n    else:\n        return exc\n\n\nclass AIOHTTPResponse(AsyncResponse):\n    def __init__(self, response: aiohttp.ClientResponse):\n        super().__init__()\n\n        self._response = response\n        self.status = response.status\n\n    async def json(self) -> JSON:\n        try:\n            return await self._response.json()\n        except aiohttp.ContentTypeError as e:\n            raise ValueError(\"Expected Content-Type: application/json, got something else\") from e\n        except aiohttp.ClientError as e:\n            raise convert_aiohttp_exception(e) from e\n\n    async def download(self, consume_callback: AsyncConsumeCallback) -> None:\n        callback: Any = consume_callback\n\n        try:\n            if is_async_func(consume_callback):\n                async for chunk in self._response.content.iter_chunked(8192):\n                    await callback(chunk)\n            else:\n                async for chunk in self._response.content.iter_chunked(8192):\n                    callback(chunk)\n        except aiohttp.ClientError as e:\n            raise convert_aiohttp_exception(e) from e\n\n    async def close(self) -> None:\n        await self._response.release()\n\n\ndef convert_timeout(timeout: TimeoutParameter) -> Optional[aiohttp.ClientTimeout]:\n    if timeout is ...:\n        return convert_timeout(settings.DEFAULT_TIMEOUT)\n    elif timeout is None:\n        return None\n    elif isinstance(timeout, (int, float)):\n        return aiohttp.ClientTimeout(sock_connect=timeout, sock_read=timeout)\n\n    connect, read = timeout\n\n    return aiohttp.ClientTimeout(sock_connect=connect, sock_read=read)\n\n\nDEFAULT_USER_AGENT = \"Python/%s.%s aiohttp/%s\" % (sys.version_info.major,\n                                                  sys.version_info.minor,\n                                                  aiohttp.__version__)\n\n\nclass AIOHTTPSession(AsyncSession):\n    \"\"\"\n        .. _aiohttp: https://pypi.org/project/aiohttp\n\n        :any:`AsyncSession` implementation using the `aiohttp`_ library.\n\n        All arguments passed in the constructor are directly forwared to :any:`aiohttp.ClientSession`.\n\n        :ivar aiohttp_session: underlying instance of :any:`aiohttp.ClientSession`\n\n        To pass `aiohttp`-specific arguments from :any:`AsyncClient` use :code:`aiohttp_args` keyword argument.\n\n        Usage example:\n\n        .. code:: python\n\n           import yadisk\n\n           async def main():\n               async with yadisk.AsyncClient(..., session=\"aiohttp\") as client:\n                   await client.get_meta(\n                       \"/my_file.txt\",\n                       n_retries=5,\n                       aiohttp_args={\n                           \"proxies\": {\"https\": \"http://example.com:1234\"},\n                           \"verify\": False\n                       }\n                    )\n    \"\"\"\n    def __init__(self, *args, **kwargs) -> None:\n        headers = CaseInsensitiveDict({\n            \"User-Agent\": DEFAULT_USER_AGENT,\n            \"Accept-Encoding\": \"gzip, deflate\",\n            \"Accept\": \"*/*\",\n            \"Connection\": \"keep-alive\"\n        })\n\n        headers.update(kwargs.get(\"headers\") or {})\n\n        kwargs[\"headers\"] = headers\n\n        self._session = aiohttp.ClientSession(*args, **kwargs)\n\n    @property\n    def aiohttp_session(self) -> aiohttp.ClientSession:\n        return self._session\n\n    async def send_request(\n        self,\n        method: HTTPMethod,\n        url: str,\n        *,\n        params: Optional[Dict[str, Any]] = None,\n        data: Optional[AsyncPayload] = None,\n        headers: Optional[Headers] = None,\n        **kwargs\n    ) -> AsyncResponse:\n        converted_kwargs: Dict[str, Any] = {\n            \"params\": params,\n            \"data\": data,\n            \"headers\": headers\n        }\n\n        if \"timeout\" in kwargs:\n            converted_kwargs[\"timeout\"] = convert_timeout(kwargs[\"timeout\"])\n\n        if \"aiohttp_args\" in kwargs:\n            converted_kwargs.update(kwargs[\"aiohttp_args\"] or {})\n\n        try:\n            return AIOHTTPResponse(await self._session.request(method, url, **converted_kwargs))\n        except aiohttp.ClientError as e:\n            raise convert_aiohttp_exception(e) from e\n\n    async def close(self) -> None:\n        await self._session.close()\n"
  },
  {
    "path": "src/yadisk/sessions/async_httpx_session.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import Any\n\nfrom .._async_session import AsyncSession, AsyncResponse\nfrom ..types import JSON, AsyncConsumeCallback, HTTPMethod\nfrom .._common import is_async_func\n\nfrom ._httpx_common import *\n\nimport httpx\n\n__all__ = [\"AsyncHTTPXSession\"]\n\n\nclass AsyncHTTPXResponse(AsyncResponse):\n    def __init__(self, response: httpx.Response):\n        super().__init__()\n\n        self._response = response\n        self.status = response.status_code\n\n    async def json(self) -> JSON:\n        try:\n            await self._response.aread()\n        except httpx.HTTPError as e:\n            raise convert_httpx_exception(e) from e\n        except httpx.StreamConsumed as e:\n            raise ValueError(f\"Could not parse JSON: {e}\") from e\n\n        return self._response.json()\n\n    async def download(self, consume_callback: AsyncConsumeCallback) -> None:\n        callback: Any = consume_callback\n\n        try:\n            if is_async_func(consume_callback):\n                async for chunk in self._response.aiter_bytes(8192):\n                    await callback(chunk)\n            else:\n                async for chunk in self._response.aiter_bytes(8192):\n                    callback(chunk)\n        except httpx.HTTPError as e:\n            raise convert_httpx_exception(e) from e\n\n    async def close(self) -> None:\n        await self._response.aclose()\n\n\nclass AsyncHTTPXSession(AsyncSession):\n    \"\"\"\n        .. _httpx: https://pypi.org/project/httpx\n\n        :any:`AsyncSession` implementation using the `httpx`_ library.\n\n        .. _httpx.AsyncClient: https://www.python-httpx.org/api/#asyncclient\n\n        All arguments passed in the constructor are directly forwared to `httpx.AsyncClient`_.\n\n        :ivar httpx_client: underlying instance of `httpx.AsyncClient`_\n\n        To pass `httpx`-specific arguments from :any:`AsyncClient` use :code:`httpx_args` keyword argument.\n\n        Usage example:\n\n        .. code:: python\n\n           import yadisk\n\n           async def main():\n               async with yadisk.AsyncClient(..., session=\"httpx\") as client:\n                   await client.get_meta(\n                       \"/my_file.txt\",\n                       n_retries=5,\n                       httpx_args={\n                           \"proxy\": \"http://localhost:11234\",\n                           \"verify\": False,\n                           \"max_redirects\": 10\n                       }\n                    )\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        self._session = httpx.AsyncClient(*args, **kwargs)\n        self._session.follow_redirects = True\n\n    @property\n    def httpx_session(self) -> httpx.AsyncClient:\n        return self._session\n\n    async def send_request(self, method: HTTPMethod, url: str, **kwargs) -> AsyncResponse:\n        request_kwargs, send_kwargs = convert_args_for_httpx(self._session, kwargs)\n\n        try:\n            request = self._session.build_request(method, url, **request_kwargs)\n            return AsyncHTTPXResponse(await self._session.send(request, **send_kwargs))\n        except httpx.HTTPError as e:\n            raise convert_httpx_exception(e) from e\n\n    async def close(self) -> None:\n        await self._session.aclose()\n"
  },
  {
    "path": "src/yadisk/sessions/httpx_session.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom .._session import Session, Response\nfrom ..types import JSON, ConsumeCallback, HTTPMethod\n\nfrom ._httpx_common import *\n\nimport httpx\n\n__all__ = [\"HTTPXSession\"]\n\n\nclass HTTPXResponse(Response):\n    def __init__(self, response: httpx.Response):\n        super().__init__()\n\n        self._response = response\n        self.status = response.status_code\n\n    def json(self) -> JSON:\n        try:\n            self._response.read()\n        except httpx.HTTPError as e:\n            raise convert_httpx_exception(e) from e\n        except httpx.StreamConsumed as e:\n            raise ValueError(f\"Could not parse JSON: {e}\") from e\n\n        return self._response.json()\n\n    def download(self, consume_callback: ConsumeCallback) -> None:\n        try:\n            for chunk in self._response.iter_bytes(8192):\n                consume_callback(chunk)\n        except httpx.HTTPError as e:\n            raise convert_httpx_exception(e) from e\n\n    def close(self) -> None:\n        self._response.close()\n\n\nclass HTTPXSession(Session):\n    \"\"\"\n        .. _httpx: https://pypi.org/project/httpx\n\n        :any:`Session` implementation using the `httpx`_ library.\n\n        .. _httpx.Client: https://www.python-httpx.org/api/#client\n\n        All arguments passed in the constructor are directly forwared to `httpx.Client`_.\n\n        :ivar httpx_client: underlying instance of `httpx.Client`_\n\n        To pass `httpx`-specific arguments from :any:`Client` use :code:`httpx_args` keyword argument.\n\n        Usage example:\n\n        .. code:: python\n\n           import yadisk\n\n           with yadisk.Client(..., session=\"httpx\") as client:\n               client.get_meta(\n                   \"/my_file.txt\",\n                   n_retries=5,\n                   httpx_args={\n                       \"proxy\": \"http://localhost:11234\",\n                       \"verify\": False,\n                       \"max_redirects\": 10\n                   }\n                )\n    \"\"\"\n    def __init__(self, *args, **kwargs):\n        self._client = httpx.Client(*args, **kwargs)\n        self._client.follow_redirects = True\n\n    @property\n    def httpx_client(self) -> httpx.Client:\n        return self._client\n\n    def send_request(self, method: HTTPMethod, url: str, **kwargs) -> Response:\n        request_kwargs, send_kwargs = convert_args_for_httpx(self._client, kwargs)\n\n        try:\n            request = self._client.build_request(method, url, **request_kwargs)\n            return HTTPXResponse(self._client.send(request, **send_kwargs))\n        except httpx.HTTPError as e:\n            raise convert_httpx_exception(e) from e\n\n    def close(self) -> None:\n        self._client.close()\n"
  },
  {
    "path": "src/yadisk/sessions/pycurl_session.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom io import BytesIO\nimport json\nfrom typing import Any, Optional\n\nfrom ..exceptions import (\n    RequestError, RequestTimeoutError,\n    TooManyRedirectsError, YaDiskConnectionError\n)\n\nfrom .._session import Session, Response\nfrom .._typing_compat import Iterator, Tuple, Dict\nfrom ..utils import CaseInsensitiveDict\nfrom ..types import JSON, ConsumeCallback, HTTPMethod, Headers, Payload, TimeoutParameter\nfrom .. import settings\n\nfrom urllib.parse import urlencode\n\nimport pycurl\n\n__all__ = [\"PycURLSession\"]\n\n\ndef convert_curl_error(error: pycurl.error) -> RequestError:\n    code, msg = error.args\n\n    mapping = {pycurl.E_TOO_MANY_REDIRECTS:      TooManyRedirectsError,\n               pycurl.E_COULDNT_CONNECT:         YaDiskConnectionError,\n               pycurl.E_NO_CONNECTION_AVAILABLE: YaDiskConnectionError,\n               pycurl.E_OPERATION_TIMEDOUT:      RequestTimeoutError}\n\n    exc = mapping.get(code) or RequestError\n    return exc(msg)\n\n\n# see PycurlResponse.download() implementation\nMAX_RESPONSE_BUFFER_SIZE = 128 * 1024\n\n\nclass PycURLResponse(Response):\n    def __init__(self, curl: pycurl.Curl, response: bytes):\n        super().__init__()\n\n        self._curl = curl\n        self._response = response\n\n        self._update_status()\n\n    def _update_status(self) -> None:\n        self.status = self._curl.getinfo(pycurl.RESPONSE_CODE)\n\n    def _perform(self) -> None:\n        try:\n            self._curl.perform()\n        except pycurl.error as e:\n            raise convert_curl_error(e) from e\n\n        self._update_status()\n\n    def _perform_rb(self) -> None:\n        try:\n            self._response = self._curl.perform_rb()\n        except pycurl.error as e:\n            raise convert_curl_error(e) from e\n\n        self._update_status()\n\n    def json(self) -> JSON:\n        if not self.status:\n            self._perform_rb()\n\n        return json.loads(self._response)\n\n    def download(self, consume_callback: ConsumeCallback) -> None:\n        buffer = BytesIO()\n\n        def write_cb(chunk: bytes) -> int:\n            # Write up to `MAX_RESPONSE_BUFFER_SIZE` bytes of data into an in-memory buffer\n            # This is a hack to detect bad HTTP status codes to give\n            # `consume_callback` an opportunity to check status before writing\n            if buffer.tell() < MAX_RESPONSE_BUFFER_SIZE:\n                buffer.write(chunk)\n                return len(chunk)\n            elif buffer.tell():\n                buffer.seek(0)\n\n                chunk_from_buffer = buffer.read()\n                consume_callback(chunk_from_buffer)\n\n                buffer.seek(0)\n                buffer.truncate(0)\n\n            consume_callback(chunk)\n            return len(chunk)\n\n        self._curl.setopt(pycurl.WRITEFUNCTION, write_cb)\n\n        self._perform()\n\n        # Write left over data from the buffer\n        if buffer.tell():\n            buffer.seek(0)\n            consume_callback(buffer.read())\n\n    def close(self) -> None:\n        self._curl.close()\n\n\nclass IterableReader:\n    def __init__(self, iterator: Iterator[bytes]):\n        self.iterator = iterator\n        self._current_chunk = b\"\"\n        self._position_in_chunk = 0\n\n    def read(self, size=-1) -> bytes:\n        if size < 0:\n            return self.readall()\n\n        data = b\"\"\n        while len(data) < size:\n            if self._position_in_chunk >= len(self._current_chunk):\n                try:\n                    self._current_chunk = next(self.iterator)\n                except StopIteration:\n                    return data\n\n                self._position_in_chunk = 0\n\n            remaining = size - len(data)\n\n            chunk_fragment = self._current_chunk[self._position_in_chunk:self._position_in_chunk + remaining]\n\n            data += chunk_fragment\n            self._position_in_chunk += len(chunk_fragment)\n\n        return data\n\n    def readall(self) -> bytes:\n        data = b\"\"\n\n        while True:\n            if self._position_in_chunk >= len(self._current_chunk):\n                try:\n                    self._current_chunk = next(self.iterator)\n                except StopIteration:\n                    return data\n\n                self._position_in_chunk = 0\n\n            chunk_fragment = self._current_chunk[self._position_in_chunk:]\n\n            data += chunk_fragment\n            self._position_in_chunk += len(chunk_fragment)\n\n\ndef convert_timeout(timeout: TimeoutParameter) -> Tuple[float, float]:\n    if timeout is ...:\n        return convert_timeout(settings.DEFAULT_TIMEOUT)\n\n    if isinstance(timeout, tuple):\n        connect_timeout, read_timeout = timeout\n    else:\n        connect_timeout = read_timeout = timeout\n\n    MAX_TIMEOUT = 4294967  # in seconds\n\n    if connect_timeout is None:\n        connect_timeout = MAX_TIMEOUT\n    elif connect_timeout <= 0.001:\n        # If connect_timeout gets rounded down to 0, the default connect\n        # timeout would be applied instead by cURL\n        connect_timeout = 0.001\n\n    if read_timeout is None:\n        # 0 disables LOW_SPEED_TIME\n        read_timeout = 0\n    elif read_timeout <= 1.0:\n        # If read_timeout gets rounded down to 0, the low speed time will be disabled\n        # 1 second is the lowest possible timeout\n        read_timeout = 1.0\n\n    return connect_timeout, read_timeout\n\nclass PycURLSession(Session):\n    \"\"\"\n        .. _pycurl: https://pypi.org/project/pycurl\n\n        :any:`Session` implementation using the `pycurl`_ library.\n\n        To pass `pycurl`-specific arguments from :any:`Client` use :code:`curl_options` keyword argument.\n\n        Usage example:\n\n        .. code:: python\n\n           import yadisk\n           import pycurl\n\n           with yadisk.Client(..., session=\"pycurl\") as client:\n               client.get_meta(\n                   \"/my_file.txt\",\n                   n_retries=5,\n                   curl_options={\n                       pycurl.MAX_SEND_SPEED_LARGE: 5 * 1024**2,\n                       pycurl.MAX_RECV_SPEED_LARGE: 5 * 1024**2,\n                       pycurl.PROXY: \"http://localhost:12345\",\n                       pycurl.MAXREDIRS: 15\n                   }\n                )\n    \"\"\"\n\n    def __init__(self) -> None:\n        self._share = pycurl.CurlShare()\n\n        self._share.setopt(pycurl.SH_SHARE, pycurl.LOCK_DATA_CONNECT)\n        self._share.setopt(pycurl.SH_SHARE, pycurl.LOCK_DATA_DNS)\n        self._share.setopt(pycurl.SH_SHARE, pycurl.LOCK_DATA_SSL_SESSION)\n\n    def send_request(\n        self,\n        method: HTTPMethod,\n        url: str,\n        *,\n        params: Optional[Dict[str, Any]] = None,\n        data: Optional[Payload] = None,\n        headers: Optional[Headers] = None,\n        stream: bool = False,\n        curl_options: Optional[Dict[int, Any]] = None,\n        **kwargs\n    ) -> Response:\n        curl_headers = CaseInsensitiveDict({\"connection\": \"keep-alive\"})\n        curl_headers.update(headers or {})\n\n        if params:\n            url = url + \"?\" + urlencode(params)\n\n        curl = pycurl.Curl()\n        curl.setopt(pycurl.NOSIGNAL, True)\n        curl.setopt(pycurl.FOLLOWLOCATION, True)\n        curl.setopt(pycurl.URL, url)\n        curl.setopt(pycurl.SHARE, self._share)\n\n        if \"timeout\" in kwargs:\n            connect_timeout, read_timeout = convert_timeout(kwargs[\"timeout\"])\n\n            curl.setopt(pycurl.CONNECTTIMEOUT_MS, int(connect_timeout * 1000))\n            curl.setopt(pycurl.LOW_SPEED_TIME, int(read_timeout))\n            curl.setopt(pycurl.LOW_SPEED_LIMIT, 64)\n\n        curl.setopt(pycurl.HTTPHEADER, [f\"{k}:{v}\" for k, v in curl_headers.items() if k and v])\n\n        if curl_options is not None:\n            for option, value in curl_options.items():\n                curl.setopt(option, value)\n\n        uploading_file = False\n\n        if data is not None:\n            curl.setopt(pycurl.UPLOAD, True)\n            uploading_file = True\n\n            curl_data: Any\n\n            if isinstance(data, bytes):\n                curl_data = BytesIO(data)\n\n                # Some requests may silently fail without specifying the exact\n                # payload size. This appears to happen with PatchRequest (PUT\n                # /v1/disk/resources). The server claims to have received an\n                # empty string, but when using the test API gateway (which\n                # forwards all requests using httpx) all data is sent\n                # correctly. Weird. This also doesn't seem to affect file\n                # uploads.\n                curl.setopt(pycurl.INFILESIZE, len(data))\n            elif hasattr(data, \"read\"):\n                curl_data = data\n            elif isinstance(data, Iterator):\n                curl_data = IterableReader(data)\n\n            curl.setopt(pycurl.READDATA, curl_data)\n\n        curl.setopt(pycurl.CUSTOMREQUEST, method)\n\n        if not stream or uploading_file:\n            try:\n                response = curl.perform_rb()\n            except pycurl.error as e:\n                raise convert_curl_error(e) from e\n        else:\n            response = b\"\"\n\n        return PycURLResponse(curl, response)\n\n    def close(self) -> None:\n        self._share.close()\n"
  },
  {
    "path": "src/yadisk/sessions/requests_session.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom ..exceptions import (\n    RequestError, TooManyRedirectsError,\n    RequestTimeoutError, YaDiskConnectionError\n)\n\nfrom .._session import Session, Response\nfrom ..utils import CaseInsensitiveDict\nfrom .._typing_compat import Dict\nfrom ..types import JSON, ConsumeCallback, HTTPMethod, Headers, Payload\n\nfrom typing import Any, Optional, Union\n\nimport threading\n\nimport requests\n\n__all__ = [\"RequestsSession\"]\n\n\ndef convert_requests_exception(exc: requests.RequestException) -> Union[RequestError, requests.RequestException]:\n    if isinstance(exc, requests.exceptions.TooManyRedirects):\n        return TooManyRedirectsError(str(exc))\n    elif isinstance(exc, requests.exceptions.Timeout):\n        return RequestTimeoutError(str(exc))\n    elif isinstance(exc, requests.exceptions.ConnectionError):\n        return YaDiskConnectionError(str(exc))\n    elif isinstance(exc, requests.RequestException):\n        return RequestError(str(exc))\n    else:\n        return exc\n\n\nclass RequestsResponse(Response):\n    def __init__(self, response: requests.Response):\n        super().__init__()\n\n        self._response = response\n        self.status = self._response.status_code\n\n    def json(self) -> JSON:\n        try:\n            return self._response.json()\n        except RuntimeError as e:\n            raise ValueError(f\"Could not parse JSON: {e}\") from e\n\n    def download(self, consume_callback: ConsumeCallback) -> None:\n        try:\n            for chunk in self._response.iter_content(8192):\n                consume_callback(chunk)\n        except requests.RequestException as e:\n            raise convert_requests_exception(e) from e\n\n    def close(self) -> None:\n        self._response.close()\n\n\nclass RequestsSession(Session):\n    \"\"\"\n        .. _requests: https://pypi.org/project/requests\n\n        :any:`Session` implementation using the `requests`_ library.\n\n        All arguments passed in the constructor are directly forwared to :any:`requests.Session`.\n\n        :ivar requests_session: underlying instance of :any:`requests.Session`\n\n        .. note::\n           Internally, this class creates thread-local instances of\n           :any:`requests.Session`, since it is not currently guaranteed to be\n           thread safe.\n           Calling :any:`Session.close()` will close all thread-local sessions\n           managed by this object.\n\n        To pass `requests`-specific arguments from :any:`Client` use :code:`requests_args` keyword argument.\n\n        Usage example:\n\n        .. code:: python\n\n           import yadisk\n\n           with yadisk.Client(..., session=\"requests\") as client:\n               client.get_meta(\n                   \"/my_file.txt\",\n                   n_retries=5,\n                   requests_args={\n                       \"proxies\": {\"https\": \"http://example.com:1234\"},\n                       \"verify\": False\n                   }\n                )\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        self._args, self._kwargs = args, kwargs\n        self._local = threading.local()\n        self._sessions = []\n\n    @property\n    def requests_session(self) -> requests.Session:\n        if not hasattr(self._local, \"session\"):\n            self._local.session = requests.Session(*self._args, **self._kwargs)\n            self._sessions.append(self._local.session)\n\n        return self._local.session\n\n    def _close_local(self) -> None:\n        if not hasattr(self._local, \"session\"):\n            return\n\n        session = self._local.session\n\n        session.close()\n        self._sessions.remove(session)\n\n    def send_request(\n        self,\n        method: HTTPMethod,\n        url: str,\n        *,\n        params: Optional[Dict[str, Any]] = None,\n        data: Optional[Payload] = None,\n        headers: Optional[Headers] = None,\n        stream: bool = False,\n        **kwargs\n    ) -> Response:\n        requests_headers = CaseInsensitiveDict(self.requests_session.headers)\n\n        requests_headers.update(headers or {})\n\n        converted_kwargs: Dict[str, Any] = {\n            \"params\": params,\n            \"data\": data,\n            \"headers\": requests_headers,\n            \"stream\": stream\n        }\n\n        if \"timeout\" in kwargs:\n            converted_kwargs[\"timeout\"] = kwargs[\"timeout\"]\n\n        if \"requests_args\" in kwargs:\n            converted_kwargs.update(kwargs[\"requests_args\"] or {})\n\n        try:\n            return RequestsResponse(\n                self.requests_session.request(method, url, **converted_kwargs)\n            )\n        except requests.exceptions.RequestException as e:\n            raise convert_requests_exception(e) from e\n\n    def close(self) -> None:\n        while self._sessions:\n            session = self._sessions.pop()\n            session.close()\n"
  },
  {
    "path": "src/yadisk/settings.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2024 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nimport logging\nfrom .types import TimeoutParameter\n\n__all__ = [\n    \"BASE_API_URL\",\n    \"BASE_OAUTH_API_URL\",\n    \"DEFAULT_N_RETRIES\",\n    \"DEFAULT_RETRY_INTERVAL\",\n    \"DEFAULT_TIMEOUT\",\n    \"DEFAULT_UPLOAD_RETRY_INTERVAL\",\n    \"DEFAULT_UPLOAD_TIMEOUT\",\n    \"logger\"\n]\n\n#: `tuple` of 2 numbers (`int` or `float`), default timeout for requests.\n#: First number is the connect timeout, the second one is the read timeout.\nDEFAULT_TIMEOUT: TimeoutParameter = (10.0, 15.0)\n\n#: `int`, default number of retries\nDEFAULT_N_RETRIES: int = 3\n\n#: `float`, default retry interval\nDEFAULT_RETRY_INTERVAL: float = 0.0\n\n#: Analogous to :any:`settings.DEFAULT_TIMEOUT` but for\n#: :any:`Client.upload()`/:any:`AsyncClient.upload()` function\nDEFAULT_UPLOAD_TIMEOUT: TimeoutParameter = DEFAULT_TIMEOUT\n\n#: Analogous to :any:`settings.DEFAULT_RETRY_INTERVAL` but for\n#: :any:`Client.upload()`/:any:`AsyncClient.upload()` function\nDEFAULT_UPLOAD_RETRY_INTERVAL: float = 0.0\n\n#: Base URL for Yandex.Disk's REST API.\n#: Can be overriden for testing and other purposes\nBASE_API_URL: str = \"https://cloud-api.yandex.net\"\n\n#: Base URL for Yandex.Disk's OAuth API.\n#: Can be overriden for testing and other purposes\nBASE_OAUTH_API_URL: str = \"https://oauth.yandex.ru\"\n\n#: Logger for the library. Logs include information about requests to the API\n#: and automatic retry attempts.\nlogger = logging.getLogger(\"yadisk\")\n"
  },
  {
    "path": "src/yadisk/types.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2025 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nfrom typing import Any, Optional, TypedDict, Union, TYPE_CHECKING, Protocol, BinaryIO, Literal\nfrom ._typing_compat import (\n    Dict, List, Tuple, Callable, Awaitable,\n    Iterator, AsyncIterator, Mapping, TypeAlias\n)\n\nif TYPE_CHECKING:  # pragma: no cover\n    from ._session import Session, Response\n    from ._async_session import AsyncSession, AsyncResponse\n    from ._client import Client\n    from ._async_client import AsyncClient\n\n__all__ = [\n    \"JSON\",\n    \"AnyClient\",\n    \"AnyResponse\",\n    \"AsyncConsumeCallback\",\n    \"AsyncFileLike\",\n    \"AsyncFileOrPath\",\n    \"AsyncFileOrPathDestination\",\n    \"AsyncOpenFileCallback\",\n    \"AsyncPayload\",\n    \"AsyncSessionFactory\",\n    \"AsyncSessionName\",\n    \"AvailableUntilVerbose\",\n    \"BinaryAsyncFileLike\",\n    \"ConsumeCallback\",\n    \"ExternalOrganizationIdVerbose\",\n    \"FileOpenMode\",\n    \"FileOrPath\",\n    \"FileOrPathDestination\",\n    \"HTTPMethod\",\n    \"Headers\",\n    \"OpenFileCallback\",\n    \"OperationStatus\",\n    \"PasswordVerbose\",\n    \"Payload\",\n    \"PublicSettings\",\n    \"PublicSettingsAccess\",\n    \"SessionFactory\",\n    \"SessionName\",\n    \"TimeoutParameter\",\n]\n\n#: JSON data (parsed)\nJSON: TypeAlias = Union[Dict, List, str, int, float, None]\n\n#: Request timeout (in seconds). Can be a single number, None or a tuple.\n#: If the timeout is specified as a tuple, then the first value is the\n#: connect timeout, and the second value is the read timeout.\n#: Otherwise, both connect and read timeouts are set to the same value.\n#: A value of None means no timeout.\n#: If the timeout's value is :code:`...`, the default timeout is used\n#: (either :any:`settings.DEFAULT_TIMEOUT` or :any:`settings.DEFAULT_UPLOAD_TIMEOUT`)\nTimeoutParameter: TypeAlias = Optional[\n    Union[\n        float,\n        Tuple[Optional[float], Optional[float]]\n    ]\n]\n\n#: Type used for passing HTTP request headers\nHeaders: TypeAlias = Mapping[str, str]\n\n#: Request payload - data to be uploaded\nPayload: TypeAlias = Union[bytes, Iterator[bytes], BinaryIO]\n\n#: Callback function that is invoked to consume the streamed HTTP response body\nConsumeCallback: TypeAlias = Callable[[bytes], None]\n\n#: Request payload - data to be uploaded (async variant)\nAsyncPayload: TypeAlias = Union[bytes, Iterator[bytes], AsyncIterator[bytes], BinaryIO, \"BinaryAsyncFileLike\"]\n\n#: Callback function (may be asynchronous) that is invoked to consume the\n#: streamed HTTP response body\nAsyncConsumeCallback: TypeAlias = Union[Callable[[bytes], None], Callable[[bytes], Awaitable[None]]]\n\n#: :any:`Response` or :any:`AsyncResponse`\nAnyResponse: TypeAlias = Union[\"Response\", \"AsyncResponse\"]\n\n#: :any:`Session` or :any:`AsyncSession`\nAnySession: TypeAlias = Union[\"Session\", \"AsyncSession\"]\n\n#: :any:`Client` or :any:`AsyncClient`\nAnyClient: TypeAlias = Union[\"Client\", \"AsyncClient\"]\n\n\nclass AsyncFileLike(Protocol):\n    \"\"\"\n        This protocol describes the bare minimum set of required methods for\n        an async file-like object (open in either binary or unicode mode).\n    \"\"\"\n\n    async def read(self, size: int = ..., /) -> Union[str, bytes]:\n        \"\"\"\n            Reads `size` bytes or characters.\n\n            :param size: `int`, number of bytes/characters to read from the file\n            :returns: data that was read from the file\n        \"\"\"\n        ...\n\n    async def write(self, buffer: Any, /) -> int:\n        \"\"\"\n            Writes data (contained in `buffer`).\n\n            :param buffer: data to be written\n            :returns: the number of written bytes/characters\n        \"\"\"\n        ...\n\n    async def seek(self, pos: int, whence: int = ..., /) -> int:\n        \"\"\"\n            Performs a seek operation on a file.\n\n            :param pos: `int`, position to seek to\n            :param whence: `int`, 0 (seek absolute position), 1 (seek relative\n                            to current position) or 2 (seek to file's end)\n\n            :returns: `int`, absolute position within the file after the seek operation\n        \"\"\"\n        ...\n\n    async def tell(self) -> int:\n        \"\"\"\n            Returns current position within the file.\n\n            :returns: `int`, current position within the file\n        \"\"\"\n        ...\n\n\nclass BinaryAsyncFileLike(Protocol):\n    \"\"\"\n        This protocol describes the bare minimum set of required methods for\n        an async file-like object open in binary mode.\n    \"\"\"\n\n    async def read(self, size: int = ..., /) -> bytes:\n        \"\"\"\n            Reads `size` bytes.\n\n            :param size: `int`, number of bytes/characters to read from the file\n            :returns: data that was read from the file\n        \"\"\"\n        ...\n\n    async def write(self, buffer: Any, /) -> int:\n        \"\"\"\n            Writes data (contained in `buffer`).\n\n            :param buffer: data to be written\n            :returns: the number of written bytes\n        \"\"\"\n        ...\n\n    async def seek(self, pos: int, whence: int = ..., /) -> int:\n        \"\"\"\n            Performs a seek operation on a file.\n\n            :param pos: `int`, position to seek to\n            :param whence: `int`, 0 (seek absolute position), 1 (seek relative\n                            to current position) or 2 (seek to file's end)\n\n            :returns: `int`, absolute position within the file after the seek operation\n        \"\"\"\n        ...\n\n    async def tell(self) -> int:\n        \"\"\"\n            Returns current position within the file.\n\n            :returns: `int`, current position within the file\n        \"\"\"\n        ...\n\n\n#: This is used to specify a source file to upload\nFileOrPath: TypeAlias = Union[\n    str,\n    bytes,\n    BinaryIO,\n    Callable[[], Iterator[bytes]]\n]\n\n#: This is used to specify a destination file to download into\nFileOrPathDestination: TypeAlias = Union[\n    str,\n    bytes,\n    BinaryIO,\n]\n\n#: This is used to specify a source file to upload (async variant)\nAsyncFileOrPath: TypeAlias = Union[\n    str,\n    bytes,\n    BinaryIO,\n    AsyncFileLike,\n    Callable[[], AsyncIterator[bytes]]\n]\n\n#: This is used to specify a destination file to download into (async variant)\nAsyncFileOrPathDestination: TypeAlias = Union[\n    str,\n    bytes,\n    BinaryIO,\n    BinaryAsyncFileLike\n]\n\n#: Function that returns an instance of :any:`Session`\nSessionFactory: TypeAlias = Callable[[], \"Session\"]\n\n#: Function that returns an instance of :any:`AsyncSession`\nAsyncSessionFactory: TypeAlias = Callable[[], \"AsyncSession\"]\n\n#: File mode for :any:`OpenFileCallback` and :any:`AsyncOpenFileCallback`\nFileOpenMode: TypeAlias = Union[Literal[\"rb\"], Literal[\"wb\"]]\n\n#: Function that is used for opening local files (like :any:`open`)\nOpenFileCallback: TypeAlias = Callable[[Union[str, bytes], FileOpenMode], BinaryIO]\n\n#: Function that is used for opening local files (async variant)\nAsyncOpenFileCallback: TypeAlias = Union[\n    Callable[[Union[str, bytes], FileOpenMode], Awaitable[BinaryAsyncFileLike]],\n    Callable[[Union[str, bytes], FileOpenMode], Awaitable[BinaryIO]],\n]\n\n#: HTTP request method\nHTTPMethod: TypeAlias = Union[\n    Literal[\"GET\"],\n    Literal[\"POST\"],\n    Literal[\"PUT\"],\n    Literal[\"PATCH\"],\n    Literal[\"DELETE\"],\n    Literal[\"OPTIONS\"],\n    Literal[\"HEAD\"],\n    Literal[\"CONNECT\"],\n    Literal[\"TRACE\"],\n]\n\n#: Valid session name (see :doc:`/api_reference/sessions`)\nSessionName: TypeAlias = Union[Literal[\"httpx\"], Literal[\"pycurl\"], Literal[\"requests\"]]\n\n#: Valid asynchronous session name (see :doc:`/api_reference/sessions`)\nAsyncSessionName: TypeAlias = Union[Literal[\"aiohttp\"], Literal[\"httpx\"]]\n\n#: Yandex.Disk's asynchronous operation status\nOperationStatus: TypeAlias = Union[Literal[\"in-progress\"], Literal[\"success\"], Literal[\"failed\"]]\n\n\nclass PublicSettings(TypedDict, total=False):\n    \"\"\"\n        Public settings of a shared resource. This type describes the input for\n        requests that modify public settings. For the related response object,\n        see :any:`PublicSettingsObject`.\n\n        :ivar available_until: `int`, timestamp indicating the expiration date of the link\n        :ivar read_only: `bool`, whether the resource is read-only\n        :ivar available_until_verbose: :any:`AvailableUntilVerbose`, verbose information about the expiration date\n        :ivar password: `str`, password to access the resource\n        :ivar password_verbose: :any:`PasswordVerbose`, verbose information about the password\n        :ivar external_organization_id: `str`, external organization ID\n        :ivar external_organization_id_verbose: :any:`ExternalOrganizationIdVerbose`,\n            verbose information about the external organization ID\n        :ivar accesses: `List[PublicSettingsAccess]`, list of access settings\n\n        .. note::\n\n           It appears that passing :code:`available_until` as an empty string\n           disables the expiration date. Similarly, password can be disabled\n           by passing :code:`False` or :code:`0`. This is not officially\n           documented, though.\n    \"\"\"\n\n    available_until: Union[int, str]\n    read_only: bool\n    available_until_verbose: \"AvailableUntilVerbose\"\n    password: Union[str, Literal[False, 0]]\n    password_verbose: \"PasswordVerbose\"\n    external_organization_id: str\n    external_organization_id_verbose: \"ExternalOrganizationIdVerbose\"\n    accesses: List[\"PublicSettingsAccess\"]\n\n\nclass AvailableUntilVerbose(TypedDict):\n    \"\"\"\n        Verbose information about the expiration date of a shared resource.\n\n        :ivar enabled: `bool`, whether the expiration date is enabled\n        :ivar value: `int`, timestamp indicating the expiration date\n    \"\"\"\n\n    enabled: bool\n    value: int\n\n\nclass PasswordVerbose(TypedDict):\n    \"\"\"\n        Verbose information about the password of a shared resource.\n\n        :ivar enabled: `bool`, whether the password is enabled\n        :ivar value: `str`, password to access the resource\n    \"\"\"\n\n    enabled: bool\n    value: str\n\n\nclass ExternalOrganizationIdVerbose(TypedDict):\n    \"\"\"\n        Verbose information about the external organization ID of a shared resource.\n\n        :ivar enabled: `bool`, whether the external organization ID is enabled\n        :ivar value: `str`, external organization ID\n    \"\"\"\n\n    enabled: bool\n    value: str\n\n\nclass PublicSettingsAccess(TypedDict, total=False):\n    \"\"\"\n        Access settings of a shared resource.\n\n        :ivar macros: `List[Union[Literal[\"employees\"], Literal[\"all\"]]],`,\n            specifies who has access to the shared resource, must contain only\n            one element\n        :ivar org_id: `int`, organization ID\n        :ivar user_ids: `List[str]`, list of user IDs\n        :ivar group_ids: `List[int]`, list of group IDs\n        :ivar department_ids: `List[int]`, list of department IDs\n        :ivar rights: `list[str]`, list of access rights\n\n        Valid access rights:\n\n        - `write`: write access\n        - `read`: read access\n        - `read_without_download`: read access without download\n        - `read_with_password`: read access with password\n        - `read_with_password_without_download`: read access with password and without download\n    \"\"\"\n\n    macros: List[Union[Literal[\"employees\"], Literal[\"all\"]]]\n    org_id: int\n    user_ids: List[str]\n    group_ids: List[int]\n    department_ids: List[int]\n    rights: List[\n        Union[\n            Literal[\"write\"],\n            Literal[\"read\"],\n            Literal[\"read_without_download\"],\n            Literal[\"read_with_password\"],\n            Literal[\"read_with_password_without_download\"]\n        ]\n    ]\n"
  },
  {
    "path": "src/yadisk/utils.py",
    "content": "# -*- coding: utf-8 -*-\n# Copyright © 2025 Ivan Konovalov\n\n# This file is part of a Python library yadisk.\n\n# This library is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n\n# This library is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n# GNU Lesser General Public License for more details.\n\n# You should have received a copy of the GNU Lesser General Public License\n# along with this library; if not, see <http://www.gnu.org/licenses/>.\n\nimport asyncio\nfrom collections import defaultdict\nimport inspect\nimport sys\nimport time\n\nfrom .objects import ErrorObject\nfrom .exceptions import *\nfrom . import settings\n\nfrom typing import Any, Optional, Union, TypeVar\n\nfrom ._typing_compat import Callable, Awaitable, Dict, Tuple, Type\nfrom .types import AnyResponse\n\n__all__ = [\"CaseInsensitiveDict\", \"async_auto_retry\", \"auto_retry\", \"get_exception\"]\n\n\nclass _UnexpectedRequestError(YaDiskError):\n    # Used for testing (see tests/disk_gateway.py)\n    pass\n\n\nif sys.version_info >= (3, 11) and hasattr(Exception, \"add_note\"):\n    def _add_exception_note(exc: Exception, note: str) -> None:\n        exc.add_note(note)\nelse:\n    def _add_exception_note(exc: Exception, note: str) -> None:\n        pass\n\n\nEXCEPTION_MAP: Dict[int, Dict[str, Type[YaDiskError]]] = {\n    400: defaultdict(\n        lambda: BadRequestError,\n        {\n            \"FieldValidationError\":   FieldValidationError,\n            \"authorization_pending\":  AuthorizationPendingError,\n            \"invalid_client\":         InvalidClientError,\n            \"invalid_grant\":          InvalidGrantError,\n            \"bad_verification_code\":  BadVerificationCodeError,\n            \"unsupported_token_type\": UnsupportedTokenTypeError\n        }\n    ),\n    401: defaultdict(lambda: UnauthorizedError),\n    403: defaultdict(\n        lambda: ForbiddenError,\n        {\n            \"DiskSymlinkPasswordRequiredError\": PasswordRequiredError\n        }\n    ),\n    404: defaultdict(\n        lambda: NotFoundError,\n        {\n            \"DiskNotFoundError\":          PathNotFoundError,\n            \"DiskOperationNotFoundError\": OperationNotFoundError\n        }\n    ),\n    406: defaultdict(lambda: NotAcceptableError),\n    409: defaultdict(\n        lambda: ConflictError,\n        {\n            \"DiskPathDoesntExistsError\":              ParentNotFoundError,\n            \"DiskPathPointsToExistentDirectoryError\": DirectoryExistsError,\n            \"DiskResourceAlreadyExistsError\":         PathExistsError,\n            \"MD5DifferError\":                         MD5DifferError\n        }\n    ),\n    410: defaultdict(lambda: GoneError),\n    413: defaultdict(lambda: PayloadTooLargeError),\n    415: defaultdict(lambda: UnsupportedMediaError),\n    423: defaultdict(\n        lambda: LockedError,\n        {\n            \"DiskResourceLockedError\":        ResourceIsLockedError,\n            \"DiskUploadTrafficLimitExceeded\": UploadTrafficLimitExceededError\n        }\n    ),\n    429: defaultdict(\n        lambda: TooManyRequestsError,\n        {\"DiskResourceDownloadLimitExceededError\": ResourceDownloadLimitExceededError}\n    ),\n    500: defaultdict(lambda: InternalServerError),\n    502: defaultdict(lambda: BadGatewayError),\n    503: defaultdict(lambda: UnavailableError),\n    504: defaultdict(lambda: GatewayTimeoutError),\n    507: defaultdict(lambda: InsufficientStorageError),\n\n    # This is a special value for testing\n    499: defaultdict(lambda: _UnexpectedRequestError)\n}\n\n\ndef get_exception(response: AnyResponse, error: Optional[ErrorObject]) -> YaDiskError:\n    \"\"\"\n        Get an exception instance based on response, assuming the request has failed.\n\n        :param response: an instance of :any:`Response` or :any:`AsyncResponse`\n        :param error: an instance of :any:`ErrorObject` or `None`\n\n        :returns: an exception instance, subclass of :any:`YaDiskError`\n    \"\"\"\n\n    exc_group = EXCEPTION_MAP.get(response.status, None)\n\n    if exc_group is None:\n        return UnknownYaDiskError(f\"Unknown Yandex.Disk error: status code {response.status}\")\n\n    if error is not None:\n        msg = error.message or \"\"\n        desc = error.description or \"\"\n        error_name = error.error or \"\"\n    else:\n        msg = \"\"\n        desc = \"\"\n        error_name = \"\"\n\n    exc = exc_group[error_name]\n\n    exc_message = \"\"\n\n    if msg:\n        exc_message = msg\n\n    if desc:\n        if exc_message:\n            exc_message += \" | \"\n\n        exc_message += f\"Error description: {desc.rstrip('.')}.\"\n\n    if error_name:\n        if exc_message:\n            exc_message += \" | \"\n\n        exc_message += f\"Error code: {error_name}\"\n\n    if exc_message:\n        exc_message += \" | \"\n\n    exc_message += f\"Status code: {response.status}\"\n\n    return exc(error_name, exc_message, response)\n\n\nT = TypeVar(\"T\")\n\n\ndef auto_retry(\n    func: Callable[..., T],\n    n_retries: Optional[int] = None,\n    retry_interval: Optional[Union[int, float]] = None,\n    args: Optional[Tuple] = None,\n    kwargs: Optional[Dict[str, Any]] = None,\n    retry_on: Tuple[Type[Exception], ...] = tuple()\n) -> T:\n    \"\"\"\n        Attempt to perform a request with automatic retries.\n        A retry is triggered by :any:`RequestError` or :any:`RetriableYaDiskError`,\n        unless the raised exception has :code:`disable_retry` set to :code:`True`.\n\n        :param func: function to run, must not require any arguments\n        :param n_retries: `int`, maximum number of retries\n        :param retry_interval: `int` or `float`, delay between retries (in seconds)\n        :param args: `tuple` or `None`, additional arguments for `func`\n        :param kwargs: `dict` or `None`, additional keyword arguments for `func`\n        :param retry_on: `tuple`, additional exception classes to retry on\n\n        :returns: return value of func()\n    \"\"\"\n\n    if n_retries is None:\n        n_retries = settings.DEFAULT_N_RETRIES\n\n    if retry_interval is None:\n        retry_interval = settings.DEFAULT_RETRY_INTERVAL\n\n    if args is None:\n        args = tuple()\n\n    if kwargs is None:\n        kwargs = {}\n\n    exceptions: Tuple[Type[Exception], ...] = (RequestError, RetriableYaDiskError, *retry_on)\n\n    for i in range(n_retries + 1):\n        try:\n            return func(*args, **kwargs)\n        except exceptions as e:\n            if i == n_retries or (isinstance(e, YaDiskError) and e.disable_retry):\n                settings.logger.info(\n                    f\"not triggering an automatic retry: ({i + 1} out of {n_retries}), got {e.__class__.__name__}: {e}\"\n                )\n\n                if i:\n                    _add_exception_note(e, f\"Got the error after {i} retry attempts\")\n\n                raise\n\n            settings.logger.info(\n                f\"automatic retry triggered: ({i + 1} out of {n_retries}), got {e.__class__.__name__}: {e}\"\n            )\n\n        if retry_interval:\n            time.sleep(retry_interval)\n\n    # This should never be reachable\n    raise AssertionError()\n\n\nasync def async_auto_retry(\n    func: Union[Callable[..., Any], Callable[..., Awaitable[Any]]],\n    n_retries: Optional[int] = None,\n    retry_interval: Optional[Union[int, float]] = None,\n    args: Optional[Tuple] = None,\n    kwargs: Optional[Dict[str, Any]] = None,\n    retry_on: Tuple[Type[Exception], ...] = tuple()\n) -> Any:\n    \"\"\"\n        Attempt to perform a request with automatic retries.\n        A retry is triggered by :any:`RequestError` or :any:`RetriableYaDiskError`,\n        unless the raised exception has :code:`disable_retry` set to :code:`True`.\n\n        :param func: function to run, must not require any arguments\n        :param n_retries: `int`, maximum number of retries\n        :param retry_interval: `int` or `float`, delay between retries (in seconds)\n        :param args: `tuple` or `None`, additional arguments for `func`\n        :param kwargs: `dict` or `None`, additional keyword arguments for `func`\n        :param retry_on: `tuple`, additional exception classes to retry on\n\n        :returns: return value of func()\n    \"\"\"\n\n    if n_retries is None:\n        n_retries = settings.DEFAULT_N_RETRIES\n\n    if retry_interval is None:\n        retry_interval = settings.DEFAULT_RETRY_INTERVAL\n\n    if args is None:\n        args = tuple()\n\n    if kwargs is None:\n        kwargs = {}\n\n    is_coro = inspect.iscoroutinefunction(func)\n\n    # Suppress false type hint errors\n    callback: Any = func\n\n    exceptions: Tuple[Type[Exception], ...] = (RequestError, RetriableYaDiskError, *retry_on)\n\n    for i in range(n_retries + 1):\n        try:\n            if is_coro:\n                return await callback(*args, **kwargs)\n            else:\n                return callback(*args, **kwargs)\n        except exceptions as e:\n            if i == n_retries or (isinstance(e, YaDiskError) and e.disable_retry):\n                settings.logger.info(\n                    f\"not triggering an automatic retry: ({i + 1} out of {n_retries}), got {e.__class__.__name__}: {e}\"\n                )\n\n                if i:\n                    _add_exception_note(e, f\"Got the error after {i} retry attempts\")\n\n                raise\n\n            settings.logger.info(\n                f\"automatic retry triggered: ({i + 1} out of {n_retries}), got {e.__class__.__name__}: {e}\"\n            )\n\n        if retry_interval:\n            await asyncio.sleep(retry_interval)\n\n    # This should never be reachable\n    raise AssertionError()\n\n\nclass CaseInsensitiveDict(dict):\n    \"\"\"A case-insensitive dictionary. All keys are converted to lowercase.\"\"\"\n\n    @classmethod\n    def _k(cls, key: str) -> str:\n        return key.lower()\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._convert_keys()\n\n    def __getitem__(self, key: str) -> Any:\n        return super().__getitem__(self.__class__._k(key))\n\n    def __setitem__(self, key: str, value: Any) -> None:\n        super().__setitem__(self.__class__._k(key), value)\n\n    def __delitem__(self, key: str) -> Any:\n        return super().__delitem__(self.__class__._k(key))\n\n    def __contains__(self, key: Any) -> bool:\n        return super().__contains__(self.__class__._k(key))\n\n    def pop(self, key: str, /, *args, **kwargs) -> Any:\n        return super().pop(self.__class__._k(key), *args, **kwargs)\n\n    def get(self, key: str, /, *args, **kwargs) -> Any:\n        return super().get(self.__class__._k(key), *args, **kwargs)\n\n    def setdefault(self, key: str, *args, **kwargs) -> Any:\n        return super().setdefault(self.__class__._k(key), *args, **kwargs)\n\n    def update(self, *args, **kwargs) -> None:\n        super().update(*(self.__class__(arg) for arg in args), **self.__class__(kwargs))\n\n    def _convert_keys(self) -> None:\n        for k in list(self.keys()):\n            v = super(CaseInsensitiveDict, self).pop(k)\n            self.__setitem__(k, v)\n"
  },
  {
    "path": "tests/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n"
  },
  {
    "path": "tests/async_client_test.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport hashlib\nimport logging\nimport os\nimport platform\nimport posixpath\nimport sys\nimport tempfile\n\nfrom typing import Any, Union, BinaryIO\nfrom io import BytesIO\n\nimport aiofiles\n\nimport yadisk\nfrom yadisk._common import is_operation_link, ensure_path_has_scheme, remove_path_scheme\nfrom yadisk._api import GetOperationStatusRequest\n\nimport pytest\n\nfrom yadisk.types import FileOpenMode\n\n__all__ = [\"TestAsyncClient\"]\n\nreplay_disabled = os.environ.get(\"PYTHON_YADISK_REPLAY_ENABLED\", \"1\") != \"1\"\nrecording_enabled = os.environ.get(\"PYTHON_YADISK_RECORDING_ENABLED\", \"0\") == \"1\"\n\n\ndef open_tmpfile(mode):\n    if platform.system() == \"Windows\" and sys.version_info >= (3, 12):\n        # This is needed in order to work on Windows\n        return tempfile.NamedTemporaryFile(mode, delete_on_close=False)\n    else:\n        return tempfile.NamedTemporaryFile(mode)\n\n\ndef async_open_tmpfile(mode):\n    if platform.system() == \"Windows\" and sys.version_info >= (3, 12):\n        # This is needed in order to work on Windows\n        return aiofiles.tempfile.NamedTemporaryFile(mode, delete_on_close=False)\n    else:\n        return aiofiles.tempfile.NamedTemporaryFile(mode)\n\n\n@pytest.mark.anyio\nclass TestAsyncClient:\n    @pytest.mark.skipif(\n        replay_disabled,\n        reason=\"this test is not meant to run outside of replay mode, it must be modified first\"\n    )\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    async def test_get_disk_info(self, async_client: yadisk.AsyncClient) -> None:\n        disk_info = await async_client.get_disk_info()\n\n        assert isinstance(disk_info, yadisk.objects.DiskInfoObject)\n        assert disk_info.user is not None\n\n        # If you re-record this test, you'll have to put your account data here\n        assert disk_info.user.login == \"ivknv\"\n        assert disk_info.field(\"reg_time\").year == 2017\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_get_meta(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        resource = await async_client.get_meta(disk_root)\n\n        assert isinstance(resource, yadisk.objects.ResourceObject)\n        assert resource.type == \"dir\"\n        assert resource.name == posixpath.split(disk_root)[1]\n\n        # Test convenience method as well\n        assert (await resource.get_meta(\".\")).resource_id == resource.resource_id\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_listdir(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\", \"dir3\"]\n        paths = [posixpath.join(disk_root, name) for name in names]\n\n        for path in paths:\n            await async_client.mkdir(path)\n\n        contents = [i async for i in async_client.listdir(disk_root)]\n        result = [i.name for i in contents]\n\n        assert result == names\n\n        # Test the convenience method as well\n        for dir in contents:\n            assert [i async for i in dir.listdir(\".\")] == []\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_listdir_fields(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\", \"dir3\"]\n        paths = [posixpath.join(disk_root, name) for name in names]\n\n        for path in paths:\n            await async_client.mkdir(path)\n\n        async def get_result():\n            return [(i.name, i.type, i.file)\n                    async for i in async_client.listdir(disk_root, fields=[\"name\", \"type\"])]\n\n        result = await get_result()\n\n        assert result == [(name, \"dir\", None) for name in names]\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_listdir_on_file(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        buf = BytesIO()\n        buf.write(b\"0\" * 1000)\n        buf.seek(0)\n\n        path = posixpath.join(disk_root, \"zeroes.txt\")\n\n        await async_client.upload(buf, path)\n\n        with pytest.raises(yadisk.exceptions.WrongResourceTypeError):\n            [i async for i in async_client.listdir(path)]\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_listdir_with_limits(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\", \"dir3\"]\n        paths = [posixpath.join(disk_root, name) for name in names]\n\n        for path in paths:\n            await async_client.mkdir(path)\n\n        async def get_result():\n            return [i.name async for i in async_client.listdir(disk_root, limit=1)]\n\n        result = await get_result()\n\n        assert result == names\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_listdir_with_max_items(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\", \"dir3\", \"dir4\", \"dir5\", \"dir6\"]\n\n        for name in names:\n            path = posixpath.join(disk_root, name)\n\n            await async_client.mkdir(path)\n\n        results = [\n            [i.name async for i in async_client.listdir(disk_root, max_items=0)],\n            [i.name async for i in async_client.listdir(disk_root, max_items=1, limit=1)],\n            [i.name async for i in async_client.listdir(disk_root, max_items=2, limit=1)],\n            [i.name async for i in async_client.listdir(disk_root, max_items=3, limit=1)],\n            [i.name async for i in async_client.listdir(disk_root, max_items=10, limit=1)],\n        ]\n\n        expected = [\n            [],\n            names[:1],\n            names[:2],\n            names[:3],\n            names[:10],\n        ]\n\n        assert results == expected\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_mkdir_and_exists(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\", \"dir3\"]\n        paths = [posixpath.join(disk_root, name) for name in names]\n\n        async def check_existence(path):\n            await async_client.mkdir(path)\n            assert await async_client.exists(path)\n\n            await async_client.remove(path, permanently=True)\n            assert not await async_client.exists(path)\n\n        for path in paths:\n            await check_existence(path)\n\n    async def _test_makedirs(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        parent1 = posixpath.join(disk_root, \"parent1\")\n        parent2 = posixpath.join(parent1, \"parent2\")\n        parent3 = posixpath.join(parent2, \"parent3\")\n\n        path1 = posixpath.join(parent3, \"leaf_directory\")\n        path2 = posixpath.join(parent3, \"another_directory\")\n        path3 = posixpath.join(disk_root, \"directory\")\n\n        for path in [parent1, parent2, parent3, path1, path2, path3]:\n            assert not await async_client.exists(path)\n\n        await async_client.makedirs(path1)\n        assert await async_client.is_dir(path1)\n\n        with pytest.raises(yadisk.exceptions.DirectoryExistsError):\n            await async_client.makedirs(path1)\n\n        await async_client.makedirs(path2)\n        assert await async_client.is_dir(path2)\n\n        await async_client.makedirs(path3)\n        assert await async_client.is_dir(path3)\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_makedirs_without_scheme(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        await self._test_makedirs(async_client, remove_path_scheme(disk_root)[1])\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_makedirs_with_scheme(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        await self._test_makedirs(async_client, ensure_path_has_scheme(disk_root, \"disk\"))\n\n    @pytest.mark.skipif(\n        platform.system() == \"Windows\" and sys.version_info < (3, 12),\n        reason=\"won't work on Windows with Python < 3.12\"\n    )\n    @pytest.mark.usefixtures(\"async_client_test\")\n    @pytest.mark.parametrize(\"use_sync_open_function\", (True, False))\n    async def test_upload_and_download(\n        self,\n        async_client: yadisk.AsyncClient,\n        disk_root: str,\n        use_sync_open_function: bool\n    ) -> None:\n        # Ensure to test synchronous file IO here\n        # see https://github.com/ivknv/yadisk/issues/62\n        if use_sync_open_function:\n            async def sync_open(path: Union[str, bytes], mode: FileOpenMode) -> BinaryIO:\n                return open(path, mode)\n\n            async_client.open_file = sync_open\n\n        with open_tmpfile(\"w+b\") as buf1, open_tmpfile(\"w+b\") as buf2:\n            buf1.write(b\"0\" * 1024**2)\n            buf1.seek(0)\n\n            path = posixpath.join(disk_root, \"zeroes.txt\")\n\n            await async_client.upload(buf1.name, path, overwrite=True, n_retries=50)\n            await async_client.download(path, buf2.name, n_retries=50)\n\n            buf1.seek(0)\n            buf2.seek(0)\n\n            assert buf1.read() == buf2.read()\n\n    @pytest.mark.skipif(\n        platform.system() == \"Windows\" and sys.version_info < (3, 12),\n        reason=\"won't work on Windows with Python < 3.12\"\n    )\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_upload_and_download_async(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        content = b\"0\" * 1024 ** 2\n        async with async_open_tmpfile(\"wb+\") as source:\n            await source.write(content)\n            await source.seek(0)\n\n            path1 = posixpath.join(disk_root, \"zeroes.txt\")\n            path2 = posixpath.join(disk_root, \"zeroes_from_generator.txt\")\n\n            await async_client.upload(source, path1, overwrite=True, n_retries=50)\n\n            async def source_generator():\n                for _ in range(1024):\n                    yield b\"0\" * 1024\n\n            await async_client.upload(source_generator, path2, overwrite=True, n_retries=50)\n\n        async with async_open_tmpfile(\"wb+\") as destination:\n            await async_client.download(path1, destination, n_retries=50)\n            await destination.seek(0)\n\n            assert content == await destination.read()\n\n            await destination.seek(0)\n            await destination.truncate()\n            await async_client.download(path2, destination, n_retries=50)\n            await destination.seek(0)\n\n            assert content == await destination.read()\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_check_token(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        assert await async_client.check_token()\n        assert not await async_client.check_token(\"asdasdasd\")\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_permanent_remove(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        path = posixpath.join(disk_root, \"dir\")\n        origin_path = \"disk:\" + path\n\n        await async_client.mkdir(path)\n        await async_client.remove(path, permanently=True)\n\n        async for i in async_client.trash_listdir(\"/\"):\n            assert i.origin_path != origin_path\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_restore_trash(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        path = posixpath.join(disk_root, \"dir\")\n        origin_path = \"disk:\" + path\n\n        await async_client.mkdir(path)\n        await async_client.remove(path)\n\n        trash_path: Any = None\n\n        async for i in async_client.trash_listdir(\"/\"):\n            if i.origin_path == origin_path:\n                assert await i.exists()\n                assert await i.is_dir()\n                assert not await i.is_file()\n\n                trash_path = i.path\n                break\n\n        assert trash_path is not None\n\n        await async_client.restore_trash(trash_path, path)\n        assert await async_client.exists(path)\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_move(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        path1 = posixpath.join(disk_root, \"dir1\")\n        path2 = posixpath.join(disk_root, \"dir2\")\n        await async_client.mkdir(path1)\n        await async_client.move(path1, path2)\n\n        assert await async_client.exists(path2)\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_rename(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        filename1 = \"dir1\"\n        filename2 = \"dir2/\"\n\n        path1 = posixpath.join(disk_root, filename1)\n        path2 = posixpath.join(disk_root, filename2)\n\n        assert not await async_client.exists(path1)\n        assert not await async_client.exists(path2)\n\n        dir = await async_client.mkdir(path1)\n\n        assert await dir.is_dir()\n        rename_result = await dir.rename(filename2)\n\n        assert isinstance(rename_result, yadisk.objects.AsyncResourceLinkObject)\n        dir = rename_result\n\n        assert not await async_client.exists(path1)\n        assert await dir.is_dir()\n\n        for bad_filename in (\"\", \".\", \"..\", \"/\", \"something/else\"):\n            with pytest.raises(ValueError):\n                await dir.rename(bad_filename)\n\n    async def test_rename_edgecases(self, async_client: yadisk.AsyncClient, mocker) -> None:\n        # Test a few edgecases, make sure the destination paths are correct\n        # Path schemes must be preserved\n\n        dst_paths = []\n\n        async def mock_move(src_path: str, dst_path: str, **kwargs) -> None:\n            # Store the destination path for later checking\n            dst_paths.append(dst_path)\n\n        mocker.patch.object(async_client, \"move\", mock_move)\n\n        with pytest.raises(ValueError):\n            await async_client.rename(\"\", \"impossible\")\n\n        with pytest.raises(ValueError):\n            await async_client.rename(\"/\", \"impossible\")\n\n        with pytest.raises(ValueError):\n            await async_client.rename(\"////\", \"impossible\")\n\n        with pytest.raises(ValueError):\n            await async_client.rename(\"disk:/\", \"impossible\")\n\n        with pytest.raises(ValueError):\n            await async_client.rename(\"app:/\", \"another_directory\")\n\n        await async_client.rename(\"disk:\", \"not_a_scheme\")\n        await async_client.rename(\"disk:/asd.txt\", \"renamed.txt\")\n        await async_client.rename(\"asd.txt\", \"renamed.txt\")\n        await async_client.rename(\"disk:/directory/file1.txt\", \"renamed_file.txt\")\n        await async_client.rename(\"disk:/directory/\", \"renamed_dir\")\n\n        assert dst_paths == [\n            \"not_a_scheme\", \"disk:/renamed.txt\", \"renamed.txt\",\n            \"disk:/directory/renamed_file.txt\", \"disk:/renamed_dir\"\n        ]\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_remove_trash(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        path = posixpath.join(disk_root, \"dir-to-remove\")\n        origin_path = \"disk:\" + path\n\n        await async_client.mkdir(path)\n        await async_client.remove(path)\n\n        trash_path: Any = None\n\n        async for i in async_client.trash_listdir(\"/\"):\n            if i.origin_path == origin_path:\n                trash_path = i.path\n                break\n\n        assert trash_path is not None\n\n        await async_client.remove_trash(trash_path)\n        assert not await async_client.trash_exists(trash_path)\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_publish_unpublish(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        await async_client.publish(disk_root)\n        meta = await async_client.get_meta(disk_root)\n        assert meta.public_url is not None\n        assert meta.public_key is not None\n\n        public_key, public_url = meta.public_key, meta.public_url\n\n        assert await async_client.is_public_dir(public_key)\n        assert await async_client.is_public_dir(public_url)\n        assert not await async_client.is_public_file(public_key)\n        assert not await async_client.is_public_file(public_url)\n\n        await async_client.unpublish(disk_root)\n\n        meta = await async_client.get_meta(disk_root)\n        assert meta.public_url is None\n        assert meta.public_key is None\n\n        assert not await async_client.is_public_dir(public_key)\n        assert not await async_client.is_public_dir(public_url)\n        assert not await async_client.is_public_file(public_key)\n        assert not await async_client.is_public_file(public_url)\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_public_settings(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        await async_client.publish(disk_root)\n        public_url = await async_client.get_meta(disk_root) @ \"public_url\"\n\n        # First, set a password\n        await async_client.update_public_settings(disk_root, {\n            \"password\": \"1234\"\n        })\n\n        with pytest.raises(yadisk.exceptions.PasswordRequiredError):\n            await async_client.get_public_download_link(public_url)\n\n        # We will make the public resource link expire by updating the settings\n        available_until = 1\n        await async_client.update_public_settings(disk_root, {\n            \"password\": \"1234\",\n            \"available_until\": available_until\n        })\n\n        # As of writing, the endpoint returns only \"available_until\"\n        settings = await async_client.get_public_settings(disk_root)\n\n        assert settings.available_until == available_until\n\n        # At this point the public link should no longer be valid\n        with pytest.raises(yadisk.exceptions.PathNotFoundError):\n            await async_client.get_public_meta(public_url)\n\n        await async_client.unpublish(disk_root)\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_patch(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        directory = await async_client.patch(disk_root, {\"test_property\": \"I'm a value!\"})\n        assert directory.custom_properties == {\"test_property\": \"I'm a value!\"}\n\n        directory = await async_client.patch(disk_root, {\"number\": 42})\n        assert directory.custom_properties == {\"test_property\": \"I'm a value!\", \"number\": 42}\n\n        directory = await directory.patch({\"test_property\": None, \"number\": None})\n        assert directory.custom_properties is None\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_issue7(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        # See https://github.com/ivknv/yadisk/issues/7\n\n        try:\n            [i async for i in async_client.public_listdir(\"any value here\", path=\"any value here\")]\n        except yadisk.exceptions.PathNotFoundError:\n            pass\n\n    def test_is_operation_link(self) -> None:\n        assert is_operation_link(\"https://cloud-api.yandex.net/v1/disk/operations/123asd\")\n        assert is_operation_link(\"http://cloud-api.yandex.net/v1/disk/operations/123asd\")\n        assert not is_operation_link(\"https://cloud-api.yandex.net/v1/disk/operation/1283718\")\n        assert not is_operation_link(\"https://asd8iaysd89asdgiu\")\n        assert not is_operation_link(\"http://asd8iaysd89asdgiu\")\n\n    async def test_get_operation_status_request_url(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        request = GetOperationStatusRequest(\n            async_client.session,\n            \"https://cloud-api.yandex.net/v1/disk/operations/123asd\")\n        assert is_operation_link(request.url)\n\n        request = GetOperationStatusRequest(\n            async_client.session,\n            \"http://cloud-api.yandex.net/v1/disk/operations/123asd\")\n        assert is_operation_link(request.url)\n        assert request.url.startswith(\"https://\")\n\n        request = GetOperationStatusRequest(\n            async_client.session,\n            \"https://asd8iaysd89asdgiu\")\n        assert is_operation_link(request.url)\n        assert request.url.startswith(\"https://\")\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_is_file(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        # See https://github.com/ivknv/yadisk-async/pull/6\n        buf1 = BytesIO()\n\n        buf1.write(b\"0\" * 1024**2)\n        buf1.seek(0)\n\n        path = posixpath.join(disk_root, \"zeroes.txt\")\n\n        await async_client.upload(buf1, path, overwrite=True, n_retries=50)\n        assert await async_client.is_file(path)\n\n    def test_ensure_path_has_scheme(self) -> None:\n        # See https://github.com/ivknv/yadisk/issues/26 for more details\n\n        assert ensure_path_has_scheme(\"disk:\") == \"disk:/disk:\"\n        assert ensure_path_has_scheme(\"trash:\", default_scheme=\"trash\") == \"trash:/trash:\"\n        assert ensure_path_has_scheme(\"/asd:123\") == \"disk:/asd:123\"\n        assert ensure_path_has_scheme(\"/asd:123\", \"trash\") == \"trash:/asd:123\"\n        assert ensure_path_has_scheme(\"example/path\") == \"disk:/example/path\"\n        assert ensure_path_has_scheme(\"app:/test\") == \"app:/test\"\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_upload_download_non_seekable(\n        self,\n        async_client: yadisk.AsyncClient,\n        disk_root: str,\n        mocker\n    ) -> None:\n        # It should be possible to upload/download non-seekable file objects (such as stdin/stdout)\n        # See https://github.com/ivknv/yadisk/pull/31 for more details\n\n        def seek(*args, **kwargs):\n            raise NotImplementedError\n\n        test_input_file = BytesIO(b\"0\" * 1000)\n        mocker.patch.object(test_input_file, \"seekable\", lambda: False)\n        mocker.patch.object(test_input_file, \"seek\", seek)\n\n        dst_path = posixpath.join(disk_root, \"zeroes.txt\")\n\n        await async_client.upload(test_input_file, dst_path, n_retries=50)\n\n        test_output_file = BytesIO()\n        mocker.patch.object(test_output_file, \"seekable\", lambda: False)\n        mocker.patch.object(test_output_file, \"seek\", seek)\n\n        await async_client.download(dst_path, test_output_file, n_retries=50)\n\n        assert test_input_file.tell() == 1000\n        assert test_output_file.tell() == 1000\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_copy(\n        self,\n        async_client: yadisk.AsyncClient,\n        disk_root: str,\n        poll_interval: float\n    ) -> None:\n        dir = await async_client.mkdir(posixpath.join(disk_root, \"directory_to_copy\"))\n        await dir.upload(BytesIO(b\"example text\"), \"file.txt\")\n        await dir.mkdir(\"nested directory 1\")\n        await dir.mkdir(\"nested directory 2\")\n\n        dst_path = posixpath.join(disk_root, \"directory_copy\")\n\n        await dir.copy(dst_path, poll_interval=poll_interval)\n\n        copy_info = await async_client.get_meta(dst_path)\n\n        assert copy_info.embedded is not None\n        assert copy_info.embedded.items is not None\n\n        contents = sorted([(resource.type, resource.name) for resource in copy_info.embedded.items])\n\n        expected_contents = [\n            (\"dir\", \"nested directory 1\"),\n            (\"dir\", \"nested directory 2\"),\n            (\"file\", \"file.txt\"),\n        ]\n\n        assert copy_info.type == \"dir\"\n        assert contents == expected_contents\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_save_to_disk(\n        self,\n        async_client: yadisk.AsyncClient,\n        disk_root: str,\n        poll_interval: float\n    ) -> None:\n        test_contents = b\"test file contents\"\n\n        public_file_path = posixpath.join(disk_root, \"public_file.txt\")\n        await async_client.upload(BytesIO(test_contents), public_file_path)\n\n        await async_client.publish(public_file_path)\n\n        public_file_info = await async_client.get_meta(public_file_path)\n\n        assert public_file_info.public_url is not None\n\n        await async_client.save_to_disk(\n            public_file_info.public_url,\n            name=\"saved_public_file.txt\",\n            save_path=disk_root,\n            poll_interval=poll_interval\n        )\n\n        saved_file_path = posixpath.join(disk_root, \"saved_public_file.txt\")\n        saved_file_info = await async_client.get_meta(saved_file_path)\n\n        assert saved_file_info.md5 == hashlib.md5(test_contents).hexdigest() == public_file_info.md5\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_upload_url(\n        self,\n        async_client: yadisk.AsyncClient,\n        disk_root: str,\n        poll_interval: float\n    ) -> None:\n        test_contents = b\"test file contents\"\n\n        file_path = posixpath.join(disk_root, \"example_file.txt\")\n        dst_path = posixpath.join(disk_root, \"uploaded_from_url.txt\")\n\n        await async_client.upload(BytesIO(test_contents), file_path)\n        download_link = await async_client.get_download_link(file_path)\n\n        await async_client.upload_url(download_link, dst_path, poll_interval=poll_interval)\n\n        dst_file_info = await async_client.get_meta(dst_path)\n        assert dst_file_info.md5 == hashlib.md5(test_contents).hexdigest()\n\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    async def test_none_args(self, async_client: yadisk.AsyncClient) -> None:\n        # Passing headers=None, <session_name>_args=None should not trigger any errors\n\n        assert await async_client.check_token(\n            headers=None,\n            requests_args=None,\n            httpx_args=None,\n            curl_options=None\n        )\n\n        link = \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA%3D%3D?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\"\n\n        # This is worth testing on download_by_link() as well, since it has\n        # slightly different logic\n        with pytest.raises((yadisk.exceptions.GoneError, yadisk.exceptions.InternalServerError)):\n            await async_client.download_by_link(\n                link,\n                BytesIO(),\n                headers=None,\n                requests_args=None,\n                httpx_args=None,\n                curl_options=None\n            )\n\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    async def test_get_files(self, async_client: yadisk.AsyncClient) -> None:\n        files = [i async for i in async_client.get_files(max_items=25)]\n\n        assert len(files) <= 25\n\n        for file in files:\n            assert await file.is_file()\n\n        offset = 15\n        files_with_offset = [i async for i in async_client.get_files(max_items=10, offset=offset)]\n\n        assert len(files_with_offset) <= 10\n\n        for file in files_with_offset:\n            assert await file.is_file()\n\n        assert [file @ \"path\" for file in files[offset:]] == [file @ \"path\" for file in files_with_offset]\n\n        assert len([i async for i in async_client.get_files(max_items=10, limit=3)]) <= 10\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_get_last_uploaded(\n        self,\n        async_client: yadisk.AsyncClient,\n        disk_root: str\n    ) -> None:\n        files_to_upload = [\n            (\"first.txt\", b\"example content\"),\n            (\"second.txt\", b\"this is the second file\"),\n            (\"third.txt\", b\"this is the third file\")\n        ]\n\n        for filename, content in files_to_upload:\n            await async_client.upload(BytesIO(content), posixpath.join(disk_root, filename))\n\n        last_uploaded = await async_client.get_last_uploaded(limit=3)\n\n        for uploaded_file, (filename, content) in zip(last_uploaded, files_to_upload[::-1]):\n            assert uploaded_file.path == \"disk:\" + posixpath.join(disk_root, filename)\n\n            output = BytesIO()\n            await uploaded_file.download(output)\n\n            output.seek(0)\n            assert output.read() == content\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_public_listdir(\n        self,\n        async_client: yadisk.AsyncClient,\n        disk_root: str\n    ) -> None:\n        directory = await async_client.mkdir(posixpath.join(disk_root, \"public\"))\n        await directory.publish()\n\n        public_directory = await directory.get_meta()\n\n        assert await public_directory.is_dir()\n        assert public_directory.public_key is not None\n        assert await async_client.is_public_dir(public_directory.public_key)\n\n        files_to_upload = [\n            (\"first.txt\", b\"example content\"),\n            (\"second.txt\", b\"this is the second file\"),\n            (\"third.txt\", b\"this is the third file\")\n        ]\n\n        for filename, content in files_to_upload:\n            await (await public_directory.upload(BytesIO(content), filename)).publish()\n\n        public_files = [i async for i in public_directory.public_listdir(sort=\"modified\")]\n\n        for file, (filename, content) in zip(public_files, files_to_upload):\n            assert file.name == filename\n            assert await async_client.is_public_file(public_directory.public_key, path=file.path)\n\n            output = BytesIO()\n            await async_client.download_public(public_directory.public_key, output, path=file.path)\n\n            output.seek(0)\n            assert output.read() == content\n\n        await public_directory.unpublish()\n        assert not await async_client.is_public_dir(public_directory.public_key)\n\n    @pytest.mark.skipif(\n        recording_enabled,\n        reason=\"before recording this test, ensure it's not a privacy concern for you\"\n    )\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    async def test_get_public_resources(self, async_client: yadisk.AsyncClient) -> None:\n        first_10 = [i async for i in async_client.get_all_public_resources(max_items=10, limit=3)]\n        with_offset = [i async for i in async_client.get_all_public_resources(max_items=5, offset=5, limit=2)]\n\n        assert first_10 is not None\n        assert with_offset is not None\n\n        for public_resource in first_10 + with_offset:\n            print(f\"{public_resource @ 'path'}\")\n            assert await async_client.public_exists(public_resource @ \"public_key\")\n\n        assert [i.path for i in first_10[5:]] == [i.path for i in with_offset]\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_get_upload_link_object(self, async_client: yadisk.AsyncClient, disk_root: str) -> None:\n        directory = await async_client.get_meta(disk_root)\n        upload_link = await directory.get_upload_link_object(\"test.txt\")\n\n        assert (\n            await async_client.get_operation_status(upload_link @ \"operation_id\")\n        ) == \"in-progress\"\n\n        await async_client.upload_by_link(BytesIO(b\"test file\"), upload_link @ \"href\")\n\n        assert (\n            await async_client.get_operation_status(upload_link @ \"operation_id\")\n        ) == \"success\"\n\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    async def test_streaming_requests(self, async_client: yadisk.AsyncClient) -> None:\n        # stream=True should not break requests\n\n        assert await async_client.check_token(stream=True)\n        assert len(\n            await async_client.get_last_uploaded(\n                stream=True, limit=10, fields=[\"items.type\"]\n            )\n        ) == 10\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_wait_for_operation(\n        self,\n        async_client: yadisk.AsyncClient,\n        disk_root: str,\n        poll_interval: float,\n        mocker\n    ) -> None:\n        directory = await async_client.mkdir(\"directory\")\n        operation = await directory.remove(permanently=True, force_async=True, wait=False)\n\n        with pytest.raises(yadisk.exceptions.AsyncOperationPollingTimeoutError):\n            await operation.wait(poll_timeout=0.0)\n\n        await operation.wait(poll_interval=poll_interval)\n\n        assert await operation.get_status() == \"success\"\n\n        # Mock get_operation_status() to trigger an AsyncOperationFailedError\n        async def fake_get_operation_status(*args, **kwargs) -> yadisk.types.OperationStatus:\n            return \"failed\"\n\n        mocker.patch.object(async_client, \"get_operation_status\", fake_get_operation_status)\n\n        with pytest.raises(yadisk.exceptions.AsyncOperationFailedError):\n            await operation.wait(poll_interval=poll_interval)\n\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    async def test_download_by_link_error(self, async_client: yadisk.AsyncClient) -> None:\n        # Make sure that if the server returns a bad status code (e.g. 500),\n        # download_by_link() will not write the response into the file\n\n        # Sample link, should either produce a 500 or 410 error\n        # In case of error it outputs an HTML page, rather than a file\n        link = \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA%3D%3D?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\"\n\n        output = BytesIO()\n\n        with pytest.raises((yadisk.exceptions.GoneError, yadisk.exceptions.InternalServerError)):\n            await async_client.download_by_link(link, output)\n\n        output.seek(0)\n        assert output.read() == b\"\"\n\n    @pytest.mark.usefixtures(\"async_client_test\")\n    async def test_operation_error_triggers_retry(\n        self,\n        async_client: yadisk.AsyncClient,\n        disk_root: str,\n        poll_interval: float,\n        mocker,\n        caplog\n    ) -> None:\n        path1 = posixpath.join(disk_root, \"test_file.txt\")\n        path2 = posixpath.join(disk_root, \"copy.txt\")\n        await async_client.upload(BytesIO(b\"test data\"), path1)\n\n\n        class GetOperationStatusMock:\n            def __init__(self):\n                self.call_count_since_success = 0\n\n            async def __call__(self, *args, **kwargs) -> yadisk.types.OperationStatus:\n                status = await yadisk.AsyncClient.get_operation_status(async_client, *args, **kwargs)\n\n                if status == \"success\":\n                    self.call_count_since_success += 1\n\n                    if self.call_count_since_success < 3:\n                        return \"failed\"\n\n                return status\n\n\n        mocker.patch.object(async_client, \"get_operation_status\", GetOperationStatusMock())\n\n        with caplog.at_level(logging.INFO, logger=\"yadisk\"):\n            await async_client.copy(\n                path1,\n                path2,\n                force_async=True,\n                overwrite=True,\n                poll_interval=poll_interval\n            )\n\n        expected_message1 = \"automatic retry triggered: (1 out of 50), got AsyncOperationFailedError: Asynchronous operation failed\"  # noqa: E501\n        expected_message2 = \"asynchronous operation failed, attempting to restart it\"\n        assert expected_message1 in caplog.text\n        assert caplog.text.count(expected_message2) >= 2\n\n        assert await async_client.is_file(path2)\n"
  },
  {
    "path": "tests/auth_test.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport os\n\nimport pytest\nimport yadisk\n\nconfirmation_code = \"5320215\"\n\nreplay_disabled = os.environ.get(\"PYTHON_YADISK_REPLAY_ENABLED\", \"1\") != \"1\"\ndevice_id = \"test device 123\"\n\n# Recording data for these tests requires human intervention\n# NOTE: If you re-record these tests, make sure you change the\n# application secret afterwards and ensure that none of the captured\n# tokens are valid, otherwise you may end up leaking that data\n\n@pytest.mark.skipif(\n    replay_disabled,\n    reason=\"this test has to be explicitly modified to be run outside of replay mode\"\n)\n@pytest.mark.usefixtures(\"record_or_replay\")\ndef test_auth(client: yadisk.Client) -> None:\n    token = client.get_token(confirmation_code, device_id=device_id)\n\n    assert client.check_token(token.access_token)\n    assert token.refresh_token is not None\n\n    refreshed_token = client.refresh_token(token.refresh_token)\n\n    assert client.check_token(refreshed_token.access_token)\n    assert token.refresh_token != refreshed_token.refresh_token\n\n    assert client.revoke_token(refreshed_token.access_token).status == \"ok\"\n    assert not client.check_token(refreshed_token.access_token)\n\n    assert client.revoke_token(token.access_token).status == \"ok\"\n    assert not client.check_token(token.access_token)\n\n@pytest.mark.skipif(\n    replay_disabled,\n    reason=\"this test has to be explicitly modified to be run outside of replay mode\"\n)\n@pytest.mark.usefixtures(\"record_or_replay\")\ndef test_device_code_auth(client: yadisk.Client) -> None:\n    device_code = client.get_device_code(device_id=device_id)\n\n    with pytest.raises(yadisk.exceptions.AuthorizationPendingError):\n        client.get_token_from_device_code(\n            device_code.device_code or \"\",\n            device_id=device_id\n        )\n\n    token = client.get_token_from_device_code(\n        device_code.device_code or \"\",\n        device_id=device_id\n    )\n\n    assert client.check_token(token.access_token)\n\n    assert client.revoke_token(token.access_token).status == \"ok\"\n    assert not client.check_token(token.access_token)\n\n@pytest.mark.skipif(\n    replay_disabled,\n    reason=\"this test has to be explicitly modified to be run outside of replay mode\"\n)\n@pytest.mark.usefixtures(\"record_or_replay\")\n@pytest.mark.anyio\nasync def test_auth_async(async_client: yadisk.AsyncClient) -> None:\n    token = await async_client.get_token(confirmation_code, device_id=\"test device 123\")\n\n    assert await async_client.check_token(token.access_token)\n    assert token.refresh_token is not None\n\n    refreshed_token = await async_client.refresh_token(token.refresh_token)\n\n    assert await async_client.check_token(refreshed_token.access_token)\n\n    assert (await async_client.revoke_token(refreshed_token.access_token)).status == \"ok\"\n    assert not await async_client.check_token(refreshed_token.access_token)\n\n    assert (await async_client.revoke_token(refreshed_token.access_token)).status == \"ok\"\n    assert not await async_client.check_token(token.access_token)\n\n@pytest.mark.skipif(\n    replay_disabled,\n    reason=\"this test has to be explicitly modified to be run outside of replay mode\"\n)\n@pytest.mark.usefixtures(\"record_or_replay\")\n@pytest.mark.anyio\nasync def test_device_code_auth_async(async_client: yadisk.AsyncClient) -> None:\n    device_code = await async_client.get_device_code(device_id=device_id)\n\n    with pytest.raises(yadisk.exceptions.AuthorizationPendingError):\n        await async_client.get_token_from_device_code(\n            device_code.device_code or \"\",\n            device_id=device_id\n        )\n\n    token = await async_client.get_token_from_device_code(\n        device_code.device_code or \"\",\n        device_id=device_id\n    )\n\n    assert await async_client.check_token(token.access_token)\n\n    assert (await async_client.revoke_token(token.access_token)).status == \"ok\"\n    assert not await async_client.check_token(token.access_token)\n"
  },
  {
    "path": "tests/auto_retry_test.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport pytest\nimport yadisk\n\n@pytest.mark.anyio\nasync def test_auto_retry() -> None:\n    attempt_counter = 0\n\n    class CustomException(Exception):\n        pass\n\n    def attempt() -> None:\n        nonlocal attempt_counter\n\n        attempt_counter += 1\n\n        if attempt_counter == 1:\n            raise yadisk.exceptions.RequestError(\"test\")\n        elif attempt_counter == 2:\n            raise yadisk.exceptions.YaDiskConnectionError(\"test\")\n        elif attempt_counter == 3:\n            raise yadisk.exceptions.InternalServerError(msg=\"test\")\n        elif attempt_counter == 4:\n            raise yadisk.exceptions.RetriableYaDiskError(msg=\"test\")\n        elif attempt_counter == 5:\n            raise CustomException(\"test\")\n\n    with pytest.raises(CustomException):\n        yadisk.utils.auto_retry(attempt, n_retries=10, retry_interval=0.0)\n\n    assert attempt_counter == 5\n    attempt_counter = 0\n\n    with pytest.raises(CustomException):\n        await yadisk.utils.async_auto_retry(attempt, n_retries=10, retry_interval=0.0)\n\n    assert attempt_counter == 5\n    attempt_counter = 0\n\n    with pytest.raises(yadisk.exceptions.InternalServerError):\n        yadisk.utils.auto_retry(attempt, n_retries=2, retry_interval=0.0)\n\n    assert attempt_counter == 3\n    attempt_counter = 0\n\n    with pytest.raises(yadisk.exceptions.InternalServerError):\n        await yadisk.utils.async_auto_retry(attempt, n_retries=2, retry_interval=0.0)\n\n    assert attempt_counter == 3\n    attempt_counter = 0\n\n    yadisk.utils.auto_retry(attempt, n_retries=10, retry_interval=0.0, retry_on=(CustomException,))\n    assert attempt_counter == 6\n    attempt_counter = 0\n\n    await yadisk.utils.async_auto_retry(attempt, n_retries=10, retry_interval=0.0, retry_on=(CustomException,))\n    assert attempt_counter == 6\n\n\n@pytest.mark.anyio\nasync def test_auto_retry_with_disable_retries() -> None:\n    attempt_counter = 0\n\n    def attempt() -> None:\n        nonlocal attempt_counter\n\n        attempt_counter += 1\n\n        if attempt_counter == 1:\n            raise yadisk.exceptions.RequestError(\"test\", disable_retry=True)\n\n    with pytest.raises(yadisk.exceptions.RequestError):\n        yadisk.utils.auto_retry(attempt, n_retries=5, retry_interval=0.0)\n\n    assert attempt_counter == 1\n    attempt_counter = 0\n\n    with pytest.raises(yadisk.exceptions.RequestError):\n        await yadisk.utils.async_auto_retry(attempt, n_retries=5, retry_interval=0.0)\n\n    assert attempt_counter == 1\n\n\n@pytest.mark.anyio\nasync def test_auto_retry_without_errors() -> None:\n    attempt_counter = 0\n\n    def attempt() -> None:\n        nonlocal attempt_counter\n        attempt_counter += 1\n\n    yadisk.utils.auto_retry(attempt, n_retries=5, retry_interval=0.0)\n    assert attempt_counter == 1\n\n    await yadisk.utils.async_auto_retry(attempt, n_retries=5, retry_interval=0.0)\n    assert attempt_counter == 2\n"
  },
  {
    "path": "tests/client_test.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport yadisk\n\nfrom yadisk._common import is_operation_link, ensure_path_has_scheme, remove_path_scheme\nfrom yadisk._api import GetOperationStatusRequest\n\nimport hashlib\nimport logging\nimport os\nimport platform\nimport posixpath\nimport sys\nimport tempfile\n\nfrom io import BytesIO\nfrom typing import Any\n\nimport pytest\n\n__all__ = [\"TestClient\"]\n\nreplay_disabled = os.environ.get(\"PYTHON_YADISK_REPLAY_ENABLED\", \"1\") != \"1\"\nrecording_enabled = os.environ.get(\"PYTHON_YADISK_RECORDING_ENABLED\", \"0\") == \"1\"\n\n\ndef open_tmpfile(mode):\n    if platform.system() == \"Windows\" and sys.version_info >= (3, 12):\n        # This is needed in order to work on Windows\n        return tempfile.NamedTemporaryFile(mode, delete_on_close=False)\n    else:\n        return tempfile.NamedTemporaryFile(mode)\n\n\nclass TestClient:\n    @pytest.mark.skipif(\n        replay_disabled,\n        reason=\"this test is not meant to run outside of replay mode, it must be modified first\"\n    )\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    def test_get_disk_info(self, client: yadisk.Client) -> None:\n        disk_info = client.get_disk_info()\n\n        assert isinstance(disk_info, yadisk.objects.DiskInfoObject)\n        assert disk_info.user is not None\n\n        # If you re-record this test, you'll have to put your account data here\n        assert disk_info.user.login == \"ivknv\"\n        assert disk_info.field(\"reg_time\").year == 2017\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_get_meta(self, client: yadisk.Client, disk_root: str) -> None:\n        resource = client.get_meta(disk_root)\n\n        assert isinstance(resource, yadisk.objects.ResourceObject)\n        assert resource.type == \"dir\"\n        assert resource.name == posixpath.split(disk_root)[1]\n\n        # Test the convenience method as well\n        assert resource.get_meta(\".\").resource_id == resource.resource_id\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_listdir(self, client: yadisk.Client, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\", \"dir3\"]\n\n        for name in names:\n            path = posixpath.join(disk_root, name)\n\n            client.mkdir(path)\n\n        contents = list(client.listdir(disk_root))\n        result = [i.name for i in contents]\n\n        assert result == names\n\n        # Test the convenience method as well\n        for dir in contents:\n            assert list(dir.listdir(\".\")) == []\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_listdir_fields(self, client: yadisk.Client, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\", \"dir3\"]\n\n        for name in names:\n            path = posixpath.join(disk_root, name)\n\n            client.mkdir(path)\n\n        result = [(i.name, i.type, i.file) for i in client.listdir(disk_root, fields=[\"name\", \"type\"])]\n\n        assert result == [(name, \"dir\", None) for name in names]\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_listdir_on_file(self, client: yadisk.Client, disk_root: str) -> None:\n        buf = BytesIO()\n        buf.write(b\"0\" * 1000)\n        buf.seek(0)\n\n        path = posixpath.join(disk_root, \"zeroes.txt\")\n\n        client.upload(buf, path)\n\n        with pytest.raises(yadisk.exceptions.WrongResourceTypeError):\n            list(client.listdir(path))\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_listdir_with_limits(self, client: yadisk.Client, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\", \"dir3\"]\n\n        for name in names:\n            path = posixpath.join(disk_root, name)\n\n            client.mkdir(path)\n\n        result = [i.name for i in client.listdir(disk_root, limit=1)]\n\n        assert result == names\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_listdir_with_max_items(self, client: yadisk.Client, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\", \"dir3\", \"dir4\", \"dir5\", \"dir6\"]\n\n        for name in names:\n            path = posixpath.join(disk_root, name)\n\n            client.mkdir(path)\n\n        results = [\n            [i.name for i in client.listdir(disk_root, max_items=0)],\n            [i.name for i in client.listdir(disk_root, max_items=1, limit=1)],\n            [i.name for i in client.listdir(disk_root, max_items=2, limit=1)],\n            [i.name for i in client.listdir(disk_root, max_items=3, limit=1)],\n            [i.name for i in client.listdir(disk_root, max_items=10, limit=1)],\n        ]\n\n        expected = [\n            [],\n            names[:1],\n            names[:2],\n            names[:3],\n            names[:10],\n        ]\n\n        assert results == expected\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_mkdir_and_exists(self, client: yadisk.Client, disk_root: str) -> None:\n        names = [\"dir1\", \"dir2\"]\n\n        for name in names:\n            path = posixpath.join(disk_root, name)\n\n            client.mkdir(path)\n            assert client.exists(path)\n\n            client.remove(path, permanently=True)\n            assert not client.exists(path)\n\n    def _test_makedirs(self, client: yadisk.Client, disk_root: str) -> None:\n        parent1 = posixpath.join(disk_root, \"parent1\")\n        parent2 = posixpath.join(parent1, \"parent2\")\n        parent3 = posixpath.join(parent2, \"parent3\")\n\n        path1 = posixpath.join(parent3, \"leaf_directory\")\n        path2 = posixpath.join(parent3, \"another_directory\")\n        path3 = posixpath.join(disk_root, \"directory\")\n\n        for path in [parent1, parent2, parent3, path1, path2, path3]:\n            assert not client.exists(path)\n\n        client.makedirs(path1)\n        assert client.is_dir(path1)\n\n        with pytest.raises(yadisk.exceptions.DirectoryExistsError):\n            client.makedirs(path1)\n\n        client.makedirs(path2)\n        assert client.is_dir(path2)\n\n        client.makedirs(path3)\n        assert client.is_dir(path3)\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_makedirs_without_scheme(self, client: yadisk.Client, disk_root: str) -> None:\n        self._test_makedirs(client, remove_path_scheme(disk_root)[1])\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_makedirs_with_scheme(self, client: yadisk.Client, disk_root: str) -> None:\n        self._test_makedirs(client, ensure_path_has_scheme(disk_root, \"disk\"))\n\n    @pytest.mark.skipif(\n        platform.system() == \"Windows\" and sys.version_info < (3, 12),\n        reason=\"won't work on Windows with Python < 3.12\"\n    )\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_upload_and_download(self, client: yadisk.Client, disk_root: str) -> None:\n        with open_tmpfile(\"w+b\") as buf1, open_tmpfile(\"w+b\") as buf2:\n            buf1.write(b\"0\" * 1024**2)\n            buf1.seek(0)\n\n            path = posixpath.join(disk_root, \"zeroes.txt\")\n\n            client.upload(buf1.name, path, overwrite=True)\n            client.download(path, buf2.name)\n\n            buf1.seek(0)\n            buf2.seek(0)\n\n            assert buf1.read() == buf2.read()\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_check_token(self, client: yadisk.Client, disk_root: str) -> None:\n        assert client.check_token()\n        assert not client.check_token(\"asdasdasd\")\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_permanent_remove(self, client: yadisk.Client, disk_root: str) -> None:\n        path = posixpath.join(disk_root, \"dir\")\n        origin_path = \"disk:\" + path\n\n        client.mkdir(path)\n        client.remove(path, permanently=True)\n\n        for i in client.trash_listdir(\"/\"):\n            assert i.origin_path != origin_path\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_restore_trash(self, client: yadisk.Client, disk_root: str) -> None:\n        path = posixpath.join(disk_root, \"dir\")\n        origin_path = \"disk:\" + path\n\n        client.mkdir(path)\n        client.remove(path)\n\n        trash_path: Any = None\n\n        for i in client.trash_listdir(\"/\"):\n            if i.origin_path == origin_path:\n                assert i.exists()\n                assert i.is_dir()\n                assert not i.is_file()\n\n                trash_path = i.path\n                break\n\n        assert trash_path is not None\n\n        client.restore_trash(trash_path, path)\n        assert client.exists(path)\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_move(self, client: yadisk.Client, disk_root: str) -> None:\n        path1 = posixpath.join(disk_root, \"dir1\")\n        path2 = posixpath.join(disk_root, \"dir2\")\n        client.mkdir(path1)\n        client.move(path1, path2)\n\n        assert client.exists(path2)\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_rename(self, client: yadisk.Client, disk_root: str) -> None:\n        filename1 = \"dir1\"\n        filename2 = \"dir2/\"\n\n        path1 = posixpath.join(disk_root, filename1)\n        path2 = posixpath.join(disk_root, filename2)\n\n        assert not client.exists(path1)\n        assert not client.exists(path2)\n\n        dir = client.mkdir(path1)\n\n        assert dir.is_dir()\n        rename_result = dir.rename(filename2)\n\n        assert isinstance(rename_result, yadisk.objects.SyncResourceLinkObject)\n        dir = rename_result\n\n        assert not client.exists(path1)\n        assert dir.is_dir()\n\n        for bad_filename in (\"\", \".\", \"..\", \"/\", \"something/else\"):\n            with pytest.raises(ValueError):\n                dir.rename(bad_filename)\n\n    def test_rename_edgecases(self, client: yadisk.Client, mocker) -> None:\n        # Test a few edgecases, make sure the destination paths are correct\n        # Path schemes must be preserved\n\n        dst_paths = []\n\n        def mock_move(src_path: str, dst_path: str, **kwargs) -> None:\n            # Store the destination path for later checking\n            dst_paths.append(dst_path)\n\n        mocker.patch.object(client, \"move\", mock_move)\n\n        with pytest.raises(ValueError):\n            client.rename(\"\", \"impossible\")\n\n        with pytest.raises(ValueError):\n            client.rename(\"/\", \"impossible\")\n\n        with pytest.raises(ValueError):\n            client.rename(\"////\", \"impossible\")\n\n        with pytest.raises(ValueError):\n            client.rename(\"disk:/\", \"impossible\")\n\n        with pytest.raises(ValueError):\n            client.rename(\"app:/\", \"another_directory\")\n\n        client.rename(\"disk:\", \"not_a_scheme\")\n        client.rename(\"disk:/asd.txt\", \"renamed.txt\")\n        client.rename(\"asd.txt\", \"renamed.txt\")\n        client.rename(\"disk:/directory/file1.txt\", \"renamed_file.txt\")\n        client.rename(\"disk:/directory/\", \"renamed_dir\")\n\n        assert dst_paths == [\n            \"not_a_scheme\", \"disk:/renamed.txt\", \"renamed.txt\",\n            \"disk:/directory/renamed_file.txt\", \"disk:/renamed_dir\"\n        ]\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_remove_trash(self, client: yadisk.Client, disk_root: str) -> None:\n        path = posixpath.join(disk_root, \"dir-to-remove\")\n        origin_path = \"disk:\" + path\n\n        client.mkdir(path)\n        client.remove(path)\n\n        trash_path: Any = None\n\n        for i in client.trash_listdir(\"/\"):\n            if i.origin_path == origin_path:\n                trash_path = i.path\n                break\n\n        assert trash_path is not None\n\n        client.remove_trash(trash_path)\n        assert not client.trash_exists(trash_path)\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_publish_unpublish(self, client: yadisk.Client, disk_root: str) -> None:\n        client.publish(disk_root)\n\n        meta = client.get_meta(disk_root)\n        assert meta.public_url is not None\n        assert meta.public_key is not None\n\n        public_key, public_url = meta.public_key, meta.public_url\n\n        assert client.is_public_dir(public_key)\n        assert client.is_public_dir(public_url)\n        assert not client.is_public_file(public_key)\n        assert not client.is_public_file(public_url)\n\n        client.unpublish(disk_root)\n\n        meta = client.get_meta(disk_root)\n        assert meta.public_url is None\n        assert meta.public_key is None\n\n        assert not client.is_public_dir(public_key)\n        assert not client.is_public_dir(public_url)\n        assert not client.is_public_file(public_key)\n        assert not client.is_public_file(public_url)\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_public_settings(self, client: yadisk.Client, disk_root: str) -> None:\n        client.publish(disk_root)\n        public_url = client.get_meta(disk_root) @ \"public_url\"\n\n        # First, set a password\n        client.update_public_settings(disk_root, {\n            \"password\": \"1234\"\n        })\n\n        with pytest.raises(yadisk.exceptions.PasswordRequiredError):\n            client.get_public_download_link(public_url)\n\n        # We will make the public resource link expire by updating the settings\n        available_until = 1\n        client.update_public_settings(disk_root, {\n            \"password\": \"1234\",\n            \"available_until\": available_until\n        })\n\n        # As of writing, the endpoint returns only \"available_until\"\n        settings = client.get_public_settings(disk_root)\n\n        assert settings.available_until == available_until\n\n        # At this point the public link should no longer be valid\n        with pytest.raises(yadisk.exceptions.PathNotFoundError):\n            client.get_public_meta(public_url)\n\n        client.unpublish(disk_root)\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_patch(self, client: yadisk.Client, disk_root: str) -> None:\n        directory = client.patch(disk_root, {\"test_property\": \"I'm a value!\"})\n        assert directory.custom_properties == {\"test_property\": \"I'm a value!\"}\n\n        directory = client.patch(disk_root, {\"number\": 42})\n        assert directory.custom_properties == {\"test_property\": \"I'm a value!\", \"number\": 42}\n\n        directory = directory.patch({\"test_property\": None, \"number\": None})\n        assert directory.custom_properties is None\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_issue7(self, client: yadisk.Client, disk_root: str) -> None:\n        # See https://github.com/ivknv/yadisk/issues/7\n\n        try:\n            list(client.public_listdir(\"any value here\", path=\"any value here\"))\n        except yadisk.exceptions.PathNotFoundError:\n            pass\n\n    def test_is_operation_link(self) -> None:\n        assert is_operation_link(\"https://cloud-api.yandex.net/v1/disk/operations/123asd\")\n        assert is_operation_link(\"http://cloud-api.yandex.net/v1/disk/operations/123asd\")\n        assert not is_operation_link(\"https://cloud-api.yandex.net/v1/disk/operation/1283718\")\n        assert not is_operation_link(\"https://asd8iaysd89asdgiu\")\n        assert not is_operation_link(\"http://asd8iaysd89asdgiu\")\n\n    def test_get_operation_status_request_url(self, client: yadisk.Client, disk_root: str) -> None:\n        request = GetOperationStatusRequest(\n            client.session,\n            \"https://cloud-api.yandex.net/v1/disk/operations/123asd\")\n        assert is_operation_link(request.url)\n\n        request = GetOperationStatusRequest(\n            client.session,\n            \"http://cloud-api.yandex.net/v1/disk/operations/123asd\")\n        assert is_operation_link(request.url)\n        assert request.url.startswith(\"https://\")\n\n        request = GetOperationStatusRequest(\n            client.session,\n            \"https://asd8iaysd89asdgiu\")\n        assert is_operation_link(request.url)\n        assert request.url.startswith(\"https://\")\n\n    def test_ensure_path_has_scheme(self) -> None:\n        # See https://github.com/ivknv/yadisk/issues/26 for more details\n\n        assert ensure_path_has_scheme(\"disk:\") == \"disk:/disk:\"\n        assert ensure_path_has_scheme(\"trash:\", default_scheme=\"trash\") == \"trash:/trash:\"\n        assert ensure_path_has_scheme(\"/asd:123\") == \"disk:/asd:123\"\n        assert ensure_path_has_scheme(\"/asd:123\", \"trash\") == \"trash:/asd:123\"\n        assert ensure_path_has_scheme(\"example/path\") == \"disk:/example/path\"\n        assert ensure_path_has_scheme(\"app:/test\") == \"app:/test\"\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_upload_download_non_seekable(\n        self,\n        client: yadisk.Client,\n        disk_root: str,\n        mocker\n    ) -> None:\n        # It should be possible to upload/download non-seekable file objects (such as sys.stdin/sys.stdout)\n        # See https://github.com/ivknv/yadisk/pull/31 for more details\n\n        def seek(*args, **kwargs):\n            raise NotImplementedError\n\n        test_input_file = BytesIO(b\"0\" * 1000)\n        mocker.patch.object(test_input_file, \"seekable\", lambda: False)\n        mocker.patch.object(test_input_file, \"seek\", seek)\n\n        test_input_file.seek = seek  # type: ignore\n\n        dst_path = posixpath.join(disk_root, \"zeroes.txt\")\n\n        client.upload(test_input_file, dst_path, n_retries=50)\n\n        test_output_file = BytesIO()\n        mocker.patch.object(test_output_file, \"seekable\", lambda: False)\n        mocker.patch.object(test_output_file, \"seek\", seek)\n\n        client.download(dst_path, test_output_file, n_retries=50)\n\n        assert test_input_file.tell() == 1000\n        assert test_output_file.tell() == 1000\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_upload_generator(self, client: yadisk.Client, disk_root: str) -> None:\n        data = b\"0\" * 1000\n\n        def payload():\n            yield data[:500]\n            yield data[500:]\n\n        dst_path = posixpath.join(disk_root, \"zeroes.txt\")\n\n        output = BytesIO()\n\n        client.upload(payload, dst_path).download(output)\n\n        output.seek(0)\n\n        assert output.read() == data\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_copy(\n        self,\n        client: yadisk.Client,\n        disk_root: str,\n        poll_interval: float\n    ) -> None:\n        dir = client.mkdir(posixpath.join(disk_root, \"directory_to_copy\"))\n        dir.upload(BytesIO(b\"example text\"), \"file.txt\")\n        dir.mkdir(\"nested directory 1\")\n        dir.mkdir(\"nested directory 2\")\n\n        dst_path = posixpath.join(disk_root, \"directory_copy\")\n\n        dir.copy(dst_path, poll_interval=poll_interval)\n\n        copy_info = client.get_meta(dst_path)\n\n        assert copy_info.embedded is not None\n        assert copy_info.embedded.items is not None\n\n        contents = sorted([(resource.type, resource.name) for resource in copy_info.embedded.items])\n\n        expected_contents = [\n            (\"dir\", \"nested directory 1\"),\n            (\"dir\", \"nested directory 2\"),\n            (\"file\", \"file.txt\"),\n        ]\n\n        assert copy_info.type == \"dir\"\n        assert contents == expected_contents\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_save_to_disk(\n        self,\n        client: yadisk.Client,\n        disk_root: str,\n        poll_interval: float\n    ) -> None:\n        test_contents = b\"test file contents\"\n\n        public_file_path = posixpath.join(disk_root, \"public_file.txt\")\n        client.upload(BytesIO(test_contents), public_file_path)\n\n        client.publish(public_file_path)\n\n        public_file_info = client.get_meta(public_file_path)\n\n        assert public_file_info.public_url is not None\n\n        client.save_to_disk(\n            public_file_info.public_url,\n            name=\"saved_public_file.txt\",\n            save_path=disk_root,\n            poll_interval=poll_interval\n        )\n\n        saved_file_path = posixpath.join(disk_root, \"saved_public_file.txt\")\n        saved_file_info = client.get_meta(saved_file_path)\n\n        assert saved_file_info.md5 == hashlib.md5(test_contents).hexdigest() == public_file_info.md5\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_upload_url(\n        self,\n        client: yadisk.Client,\n        disk_root: str,\n        poll_interval: float\n    ) -> None:\n        test_contents = b\"test file contents\"\n\n        file_path = posixpath.join(disk_root, \"example_file.txt\")\n        dst_path = posixpath.join(disk_root, \"uploaded_from_url.txt\")\n\n        client.upload(BytesIO(test_contents), file_path)\n        download_link = client.get_download_link(file_path)\n\n        client.upload_url(download_link, dst_path, poll_interval=poll_interval)\n\n        dst_file_info = client.get_meta(dst_path)\n        assert dst_file_info.md5 == hashlib.md5(test_contents).hexdigest()\n\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    def test_none_args(self, client: yadisk.Client) -> None:\n        # Passing headers=None, <session_name>_args=None should not trigger any errors\n\n        assert client.check_token(\n            headers=None,\n            requests_args=None,\n            httpx_args=None,\n            curl_options=None\n        )\n\n        link = \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA%3D%3D?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\"\n\n        # This is worth testing on download_by_link() as well, since it has\n        # slightly different logic\n        with pytest.raises((yadisk.exceptions.GoneError, yadisk.exceptions.InternalServerError)):\n            client.download_by_link(\n                link,\n                BytesIO(),\n                headers=None,\n                requests_args=None,\n                httpx_args=None,\n                curl_options=None\n            )\n\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    def test_get_files(self, client: yadisk.Client) -> None:\n        files = list(client.get_files(max_items=25))\n\n        assert len(files) <= 25\n\n        for file in files:\n            assert file.is_file()\n\n        offset = 15\n        files_with_offset = list(client.get_files(max_items=10, offset=offset))\n\n        assert len(files_with_offset) <= 10\n\n        for file in files_with_offset:\n            assert file.is_file()\n\n        assert [file @ \"path\" for file in files[offset:]] == [file @ \"path\" for file in files_with_offset]\n\n        assert len(list(client.get_files(max_items=10, limit=3))) <= 10\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_get_last_uploaded(self, client: yadisk.Client, disk_root: str) -> None:\n        files_to_upload = [\n            (\"first.txt\", b\"example content\"),\n            (\"second.txt\", b\"this is the second file\"),\n            (\"third.txt\", b\"this is the third file\")\n        ]\n\n        for filename, content in files_to_upload:\n            client.upload(BytesIO(content), posixpath.join(disk_root, filename))\n\n        for uploaded_file, (filename, content) in zip(client.get_last_uploaded(limit=3), files_to_upload[::-1]):\n            assert uploaded_file.path == \"disk:\" + posixpath.join(disk_root, filename)\n\n            output = BytesIO()\n            uploaded_file.download(output)\n\n            output.seek(0)\n            assert output.read() == content\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_public_listdir(self, client: yadisk.Client, disk_root: str) -> None:\n        directory = client.mkdir(posixpath.join(disk_root, \"public\"))\n        directory.publish()\n\n        public_directory = directory.get_meta()\n\n        assert public_directory.is_dir()\n        assert public_directory.public_key is not None\n        assert client.is_public_dir(public_directory.public_key)\n\n        files_to_upload = [\n            (\"first.txt\", b\"example content\"),\n            (\"second.txt\", b\"this is the second file\"),\n            (\"third.txt\", b\"this is the third file\")\n        ]\n\n        for filename, content in files_to_upload:\n            public_directory.upload(BytesIO(content), filename).publish()\n\n        public_files = list(public_directory.public_listdir(sort=\"modified\"))\n\n        for file, (filename, content) in zip(public_files, files_to_upload):\n            assert file.name == filename\n            assert client.is_public_file(public_directory.public_key, path=file.path)\n\n            output = BytesIO()\n            client.download_public(public_directory.public_key, output, path=file.path)\n\n            output.seek(0)\n            assert output.read() == content\n\n        public_directory.unpublish()\n        assert not client.is_public_dir(public_directory.public_key)\n\n    @pytest.mark.skipif(\n        recording_enabled,\n        reason=\"before recording this test, ensure it's not a privacy concern for you\"\n    )\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    def test_get_public_resources(self, client: yadisk.Client) -> None:\n        first_10 = list(client.get_all_public_resources(max_items=10, limit=3))\n        with_offset = list(client.get_all_public_resources(max_items=5, offset=5, limit=2))\n\n        for public_resource in first_10 + with_offset:\n            assert client.public_exists(public_resource @ \"public_key\")\n\n        assert [i.path for i in first_10[5:]] == [i.path for i in with_offset]\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_get_upload_link_object(self, client: yadisk.Client, disk_root: str) -> None:\n        directory = client.get_meta(disk_root)\n        upload_link = directory.get_upload_link_object(\"test.txt\")\n\n        assert client.get_operation_status(upload_link @ \"operation_id\") == \"in-progress\"\n\n        client.upload_by_link(BytesIO(b\"test file\"), upload_link @ \"href\")\n\n        assert client.get_operation_status(upload_link @ \"operation_id\") == \"success\"\n\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    def test_streaming_requests(self, client: yadisk.Client) -> None:\n        # stream=True should not break requests\n\n        assert client.check_token(stream=True)\n        assert len(client.get_last_uploaded(stream=True, limit=10, fields=[\"items.type\"])) == 10\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_wait_for_operation(\n        self,\n        client: yadisk.Client,\n        disk_root: str,\n        poll_interval: float,\n        mocker\n    ) -> None:\n        directory = client.mkdir(\"directory\")\n        operation = directory.remove(permanently=True, force_async=True, wait=False)\n\n        with pytest.raises(yadisk.exceptions.AsyncOperationPollingTimeoutError):\n            operation.wait(poll_timeout=0.0)\n\n        operation.wait(poll_interval=poll_interval)\n\n        assert operation.get_status() == \"success\"\n\n        # Mock get_operation_status() to trigger an AsyncOperationFailedError\n        mocker.patch.object(client, \"get_operation_status\", lambda *args, **kwargs: \"failed\")\n\n        with pytest.raises(yadisk.exceptions.AsyncOperationFailedError):\n            operation.wait(poll_interval=poll_interval)\n\n    @pytest.mark.usefixtures(\"record_or_replay\")\n    def test_download_by_link_error(self, client: yadisk.Client) -> None:\n        # Make sure that if the server returns a bad status code (e.g. 500),\n        # download_by_link() will not write the response into the file\n\n        # Sample link, should either produce a 500 or 410 error\n        # In case of error it outputs an HTML page, rather than a file\n        link = \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA%3D%3D?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\"\n\n        output = BytesIO()\n\n        with pytest.raises((yadisk.exceptions.GoneError, yadisk.exceptions.InternalServerError)):\n            client.download_by_link(link, output, n_retries=5)\n\n        output.seek(0)\n        assert output.read() == b\"\"\n\n    @pytest.mark.usefixtures(\"sync_client_test\")\n    def test_operation_error_triggers_retry(\n        self,\n        client: yadisk.Client,\n        disk_root: str,\n        poll_interval: float,\n        mocker,\n        caplog\n    ) -> None:\n        path1 = posixpath.join(disk_root, \"test_file.txt\")\n        path2 = posixpath.join(disk_root, \"copy.txt\")\n        client.upload(BytesIO(b\"test data\"), path1)\n\n\n        class GetOperationStatusMock:\n            def __init__(self):\n                self.call_count_since_success = 0\n\n            def __call__(self, *args, **kwargs) -> yadisk.types.OperationStatus:\n                status = yadisk.Client.get_operation_status(client, *args, **kwargs)\n\n                if status == \"success\":\n                    self.call_count_since_success += 1\n\n                    if self.call_count_since_success < 3:\n                        return \"failed\"\n\n                return status\n\n\n        mocker.patch.object(client, \"get_operation_status\", GetOperationStatusMock())\n\n        with caplog.at_level(logging.INFO, logger=\"yadisk\"):\n            client.copy(\n                path1,\n                path2,\n                force_async=True,\n                overwrite=True,\n                poll_interval=poll_interval\n            )\n\n        expected_message1 = \"automatic retry triggered: (1 out of 50), got AsyncOperationFailedError: Asynchronous operation failed\"  # noqa: E501\n        expected_message2 = \"asynchronous operation failed, attempting to restart it\"\n        assert expected_message1 in caplog.text\n        assert caplog.text.count(expected_message2) >= 2\n\n        assert client.is_file(path2)\n"
  },
  {
    "path": "tests/conftest.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport inspect\nimport posixpath\nimport os\n\nfrom .test_session import TestSession, AsyncTestSession\nfrom .disk_gateway import BackgroundGatewayThread\n\nimport yadisk\nfrom yadisk._typing_compat import Generator, AsyncGenerator\n\nimport pytest\n\n\n@pytest.fixture(scope=\"package\")\ndef gateway_host() -> str:\n    return os.environ.get(\"PYTHON_YADISK_GATEWAY_HOST\", \"0.0.0.0\")\n\n\n@pytest.fixture(scope=\"package\")\ndef gateway_port() -> int:\n    return int(os.environ.get(\"PYTHON_YADISK_GATEWAY_PORT\", \"8080\"))\n\n\n@pytest.fixture(scope=\"package\")\ndef gateway(gateway_host: str, gateway_port: int) -> Generator[BackgroundGatewayThread, None, None]:\n    gateway = BackgroundGatewayThread(gateway_host, gateway_port)\n    gateway.start()\n\n    # Make sure the actual API token won't be exposed in the recorded requests\n    gateway.client.update_token_map({\n        os.environ[\"PYTHON_YADISK_APP_TOKEN\"]: \"supposedly_valid_token\"\n    })\n\n    yield gateway\n\n    gateway.stop()\n\n\n@pytest.fixture\ndef disk_root(request: pytest.FixtureRequest) -> str:\n    path = os.environ[\"PYTHON_YADISK_TEST_ROOT\"]\n\n    # Get rid of 'disk:/' prefix in the path and make it start with a slash\n    # for consistency\n    if path.startswith(\"disk:/\"):\n        path = posixpath.join(\"/\", path[len(\"disk:/\"):])\n\n    if len([i for i in path.split(\"/\") if i]) < 1:\n        raise ValueError(\"PYTHON_YADISK_TEST_ROOT set to /\")\n\n    test_name = request.function.__name__\n\n    return posixpath.join(path, test_name)\n\n\n@pytest.fixture()\ndef disk_cleanup(\n    disk_root: str,\n    client: yadisk.Client,\n    poll_interval: float\n) -> Generator[None, None, None]:\n    try:\n        client.mkdir(disk_root)\n    except yadisk.exceptions.DirectoryExistsError:\n        pass\n    except yadisk.exceptions.ParentNotFoundError:\n        client.mkdir(posixpath.split(disk_root)[0])\n        client.mkdir(disk_root)\n\n    yield\n\n    try:\n        client.remove(\n            disk_root,\n            permanently=True,\n            poll_interval=poll_interval\n        )\n    except yadisk.utils._UnexpectedRequestError:\n        pass\n\n\n@pytest.fixture()\nasync def async_disk_cleanup(\n    disk_root: str,\n    async_client: yadisk.AsyncClient,\n    poll_interval: float\n) -> AsyncGenerator[None, None]:\n    try:\n        await async_client.mkdir(disk_root)\n    except yadisk.exceptions.DirectoryExistsError:\n        pass\n    except yadisk.exceptions.ParentNotFoundError:\n        await async_client.mkdir(posixpath.split(disk_root)[0])\n        await async_client.mkdir(disk_root)\n\n    yield\n\n    try:\n        await async_client.remove(\n            disk_root,\n            permanently=True,\n            poll_interval=poll_interval\n        )\n    except yadisk.utils._UnexpectedRequestError:\n        pass\n\n\n@pytest.fixture(scope=\"package\")\ndef replay_enabled() -> bool:\n    return os.environ.get(\"PYTHON_YADISK_REPLAY_ENABLED\", \"1\") == \"1\"\n\n\n@pytest.fixture(scope=\"package\")\ndef recording_enabled() -> bool:\n    return os.environ.get(\"PYTHON_YADISK_RECORDING_ENABLED\", \"0\") == \"1\"\n\n\n@pytest.fixture\ndef record_or_replay(\n    request: pytest.FixtureRequest,\n    gateway: BackgroundGatewayThread,\n    recording_enabled: bool,\n    replay_enabled: bool\n) -> Generator[None, None, None]:\n    if inspect.iscoroutinefunction(request.function):\n        directory = os.path.join(\"tests\", \"recorded\", \"async\")\n    else:\n        directory = os.path.join(\"tests\", \"recorded\", \"sync\")\n\n    test_name = request.function.__name__\n\n    if recording_enabled and replay_enabled:\n        raise ValueError(\"Both recording and replay enabled at the same time\")\n\n    if recording_enabled:\n        os.makedirs(directory, exist_ok=True)\n\n        with gateway.client.record_as(os.path.join(directory, f\"{test_name}.json\")):\n            yield\n    elif replay_enabled:\n        with gateway.client.replay(os.path.join(directory, f\"{test_name}.json\")):\n            yield\n    else:\n        yield\n\n\n@pytest.fixture(scope=\"class\", params=[\"requests\", \"httpx\", \"pycurl\"])\ndef client(\n    request: pytest.FixtureRequest,\n    gateway_host: str,\n    gateway_port: int,\n    replay_enabled: bool,\n    recording_enabled: bool\n) -> Generator[yadisk.Client, None, None]:\n    base_gateway_url = f\"http://{gateway_host}:{gateway_port}\"\n\n    test_session: yadisk.Session\n\n    if replay_enabled:\n        test_session = TestSession(\n            yadisk.import_session(request.param)(),\n            disk_base_url=f\"{base_gateway_url}/replay/response/disk\",\n            auth_base_url=f\"{base_gateway_url}/replay/response/auth\",\n            download_base_url=f\"{base_gateway_url}/replay/response/download\",\n            upload_base_url=f\"{base_gateway_url}/replay/response/upload\"\n        )\n    elif recording_enabled:\n        test_session = TestSession(\n            yadisk.import_session(request.param)(),\n            disk_base_url=f\"{base_gateway_url}/forward/disk\",\n            auth_base_url=f\"{base_gateway_url}/forward/auth\",\n            download_base_url=f\"{base_gateway_url}/forward/download\",\n            upload_base_url=f\"{base_gateway_url}/forward/upload\"\n        )\n    else:\n        test_session = yadisk.import_session(request.param)()\n\n    with yadisk.Client(\n        os.environ[\"PYTHON_YADISK_APP_ID\"],\n        os.environ[\"PYTHON_YADISK_APP_SECRET\"],\n        os.environ[\"PYTHON_YADISK_APP_TOKEN\"],\n        session=test_session\n    ) as client:\n        client.default_args.update({\n            \"n_retries\": 50,\n            \"retry_interval\": 0.0 if replay_enabled else 3.0,\n            \"timeout\": (30.0, 60.0)\n        })\n\n        yield client\n\n\n@pytest.fixture(scope=\"class\", params=[\"aiohttp\", \"httpx\"])\nasync def async_client(\n    request: pytest.FixtureRequest,\n    gateway_host: str,\n    gateway_port: int,\n    replay_enabled: bool,\n    recording_enabled: bool\n) -> AsyncGenerator[yadisk.AsyncClient, None]:\n    base_gateway_url = f\"http://{gateway_host}:{gateway_port}\"\n\n    test_session: yadisk.AsyncSession\n\n    if replay_enabled:\n        test_session = AsyncTestSession(\n            yadisk.import_async_session(request.param)(),\n            disk_base_url=f\"{base_gateway_url}/replay/response/disk\",\n            auth_base_url=f\"{base_gateway_url}/replay/response/auth\",\n            download_base_url=f\"{base_gateway_url}/replay/response/download\",\n            upload_base_url=f\"{base_gateway_url}/replay/response/upload\"\n        )\n    elif recording_enabled:\n        test_session = AsyncTestSession(\n            yadisk.import_async_session(request.param)(),\n            disk_base_url=f\"{base_gateway_url}/forward/disk\",\n            auth_base_url=f\"{base_gateway_url}/forward/auth\",\n            download_base_url=f\"{base_gateway_url}/forward/download\",\n            upload_base_url=f\"{base_gateway_url}/forward/upload\"\n        )\n    else:\n        test_session = yadisk.import_async_session(request.param)()\n\n    async with yadisk.AsyncClient(\n        os.environ[\"PYTHON_YADISK_APP_ID\"],\n        os.environ[\"PYTHON_YADISK_APP_SECRET\"],\n        os.environ[\"PYTHON_YADISK_APP_TOKEN\"],\n        session=test_session\n    ) as async_client:\n        async_client.default_args.update({\n            \"n_retries\": 50,\n            \"retry_interval\": 0.0 if replay_enabled else 3.0,\n            \"timeout\": (30.0, 60.0)\n        })\n\n        yield async_client\n\n\n@pytest.fixture(scope=\"package\")\ndef anyio_backend() -> str:\n    return \"asyncio\"\n\n\n@pytest.fixture\ndef sync_client_test(record_or_replay, disk_cleanup) -> None:\n    pass\n\n\n@pytest.fixture\ndef async_client_test(record_or_replay, async_disk_cleanup) -> None:\n    pass\n\n\n@pytest.fixture\ndef poll_interval(replay_enabled: bool) -> float:\n    return 0.0 if replay_enabled else 1.0\n"
  },
  {
    "path": "tests/disk_gateway.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport argparse\nimport threading\nimport time\nfrom typing import Any\nfrom urllib.parse import urlencode, quote, quote_plus\nimport base64\nimport asyncio\nimport zlib\nimport contextlib\nimport json\n\nimport httpx\n\nfrom starlette.applications import Starlette\nfrom starlette.responses import JSONResponse, Response\nfrom starlette.requests import Request\nfrom starlette.routing import Route\n\nimport uvicorn\n\n__all__ = [\n    \"BackgroundGatewayThread\",\n    \"DiskGateway\",\n    \"DiskGatewayClient\",\n    \"main\"\n]\n\nYADISK_BASE_URL = \"https://cloud-api.yandex.net\"\nAUTH_BASE_URL = \"https://oauth.yandex.ru\"\nDOWNLOAD_BASE_URL = \"https://downloader.disk.yandex.ru\"\n\nRELEVANT_REQUEST_HEADERS = [\"content-type\", \"connection\", \"authorization\"]\nRELEVANT_RESPONSE_HEADERS = [\"content-type\", \"content-length\"]\n\n\ndef get_upload_base_url(subdomain: str) -> str:\n    return f\"https://{subdomain}.disk.yandex.net:443\"\n\n\ndef select_keys(d, keys):\n    return {key: d[key] for key in keys if key in d}\n\n\ndef serialize_content(content: bytes) -> str:\n    return base64.b64encode(zlib.compress(content)).decode(\"utf8\")\n\n\ndef deserialize_content(content: str) -> bytes:\n    return zlib.decompress(base64.b64decode(content))\n\n\ndef serialize_request(request: httpx.Request, response: httpx.Response):\n    return {\n        \"method\":   request.method,\n        \"url\":      str(request.url),\n        \"headers\":  select_keys(request.headers, RELEVANT_REQUEST_HEADERS),\n        \"content\":  serialize_content(request.content),\n        \"response\": serialize_response(response)\n    }\n\n\ndef deserialize_request(request: dict):\n    return (\n        httpx.Request(\n            request[\"method\"],\n            request[\"url\"],\n            headers=request[\"headers\"],\n            content=deserialize_content(request[\"content\"])\n        ),\n        deserialize_response(request[\"response\"])\n    )\n\n\ndef deserialize_response(response: dict) -> httpx.Response:\n    return httpx.Response(\n        status_code=response[\"status_code\"],\n        headers=response[\"headers\"],\n        content=deserialize_content(response[\"content\"])\n    )\n\n\ndef serialize_response(response: httpx.Response):\n    return {\n        \"status_code\": response.status_code,\n        \"headers\":     select_keys(response.headers, RELEVANT_RESPONSE_HEADERS),\n        \"content\":     serialize_content(response.content)\n    }\n\n\nclass UnexpectedRequestResponse(JSONResponse):\n    def __init__(self, message: str) -> None:\n        super().__init__(\n            {\n                \"error\":       \"_UnexpectedRequestError\",\n                \"description\": \"unexpected request\",\n                \"message\":     message\n            },\n            status_code=499\n        )\n\n\nclass DiskGateway:\n    def __init__(self):\n        self.routes = [\n            Route(\n                \"/forward/disk\",\n                endpoint=self.disk_gateway,\n                methods=[\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"]\n            ),\n            Route(\n                \"/forward/disk/{path:path}\",\n                endpoint=self.disk_gateway,\n                methods=[\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"]\n            ),\n\n            Route(\"/forward/auth\",             endpoint=self.auth_gateway, methods=[\"POST\"]),\n            Route(\"/forward/auth/{path:path}\", endpoint=self.auth_gateway, methods=[\"POST\"]),\n\n            Route(\"/forward/download\",             endpoint=self.download_gateway, methods=[\"GET\"]),\n            Route(\"/forward/download/{path:path}\", endpoint=self.download_gateway, methods=[\"GET\"]),\n\n            Route(\n                \"/forward/upload/{subdomain}\",\n                endpoint=self.upload_gateway,\n                methods=[\"PUT\"]\n            ),\n            Route(\n                \"/forward/upload/{subdomain}/{path:path}\",\n                endpoint=self.upload_gateway,\n                methods=[\"PUT\"]\n            ),\n\n            Route(\"/record/start\", endpoint=self.start_recording,         methods=[\"POST\"]),\n            Route(\"/record/stop\",  endpoint=self.stop_recording,          methods=[\"POST\"]),\n            Route(\"/record/clear\", endpoint=self.clear_recorded_requests, methods=[\"POST\"]),\n            Route(\"/record/json\",  endpoint=self.dump_recorded_requests,  methods=[\"GET\"]),\n\n            Route(\"/replay/set/{index:int}\", endpoint=self.set_replay_index, methods=[\"POST\"]),\n            Route(\"/replay/set\",             endpoint=self.set_replay,       methods=[\"POST\"]),\n\n            Route(\n                \"/replay/response/disk\",\n                endpoint=self.disk_replay,\n                methods=[\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"]\n            ),\n            Route(\n                \"/replay/response/disk/{path:path}\",\n                endpoint=self.disk_replay,\n                methods=[\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"]\n            ),\n\n            Route(\"/replay/response/auth\",             endpoint=self.auth_replay, methods=[\"POST\"]),\n            Route(\"/replay/response/auth/{path:path}\", endpoint=self.auth_replay, methods=[\"POST\"]),\n\n            Route(\"/replay/response/download\",             endpoint=self.download_replay, methods=[\"GET\"]),\n            Route(\"/replay/response/download/{path:path}\", endpoint=self.download_replay, methods=[\"GET\"]),\n\n            Route(\n                \"/replay/response/upload/{subdomain}\",\n                endpoint=self.upload_replay,\n                methods=[\"PUT\"]\n            ),\n            Route(\n                \"/replay/response/upload/{subdomain}/{path:path}\",\n                endpoint=self.upload_replay,\n                methods=[\"PUT\"]\n            ),\n\n            Route(\"/status\", endpoint=self.check_status, methods=[\"GET\"]),\n\n            Route(\"/tokens/update\", endpoint=self.update_token_map, methods=[\"POST\"]),\n            Route(\"/tokens/clear\", endpoint=self.clear_token_map, methods=[\"POST\"])\n        ]\n\n        @contextlib.asynccontextmanager\n        async def lifespan(_: Starlette):\n            async with self.client:\n                yield\n\n        self.app = Starlette(debug=True, routes=self.routes, lifespan=lifespan)\n\n        self.client = httpx.AsyncClient()\n        self.recorded_requests = []\n        self.recording_enabled = False\n        self.current_request_index = 0\n        self.server_task = None\n\n        # This is used to substitute real OAuth token values for fake ones to\n        # not expose them\n        # Keys are actual OAuth tokens that will be sent to the Yandex.Disk API,\n        # values are made up values that will be put in the recorded requests\n        self.tokens = {}\n\n    async def on_shutdown(self):\n        await self.client.aclose()\n\n    async def update_token_map(self, request: Request):\n        js = await request.json()\n\n        # We expect a JSON object like {\"real token\": \"token substitute\"}\n        if not isinstance(js, dict):\n            return Response(status_code=422)\n\n        # This doesn't look thread-safe, but it's not important for testing anyway\n        self.tokens.update(js)\n\n        return Response(status_code=204)\n\n    async def clear_token_map(self, request: Request):\n        self.tokens.clear()\n        return Response(status_code=204)\n\n    async def forward_request(self, request: Request, base_url: str):\n        path: str = request.path_params.get(\"path\", \"\")\n        content: bytes = await request.body()\n\n        authorization_header = request.headers.get(\"authorization\", \"\")\n\n        _, _, real_token = authorization_header.rpartition(\" \")\n        test_token = self.tokens.get(real_token, real_token)\n\n        outgoing_request = httpx.Request(\n            request.method,\n            f\"{base_url}/{path}\",\n            params=request.query_params,\n            content=content,\n            headers=select_keys(request.headers, RELEVANT_REQUEST_HEADERS)\n        )\n\n        server_response = await self.client.send(outgoing_request, follow_redirects=True)\n\n        response = Response(\n            content=server_response.content,\n            status_code=server_response.status_code\n        )\n\n        if \"content-type\" in server_response.headers:\n            response.headers[\"Content-Type\"] = server_response.headers[\"content-type\"]\n\n        if self.recording_enabled:\n            # Substitute the Authorization header to hide the OAuth token\n            if test_token:\n                outgoing_request.headers[\"authorization\"] = f\"OAuth {test_token}\"\n            else:\n                outgoing_request.headers.pop(\"authorization\", None)\n\n            self.recorded_requests.append(serialize_request(outgoing_request, server_response))\n\n        return response\n\n    async def replay_response(self, request: Request, base_url: str):\n        try:\n            serialized_request = self.recorded_requests[self.current_request_index]\n        except IndexError:\n            return UnexpectedRequestResponse(\"did not expect any more requests\")\n\n        path = request.path_params.get(\"path\", \"\")\n\n        content: bytes = await request.body()\n        headers = select_keys(request.headers, RELEVANT_REQUEST_HEADERS)\n\n        # Substitute the real token for the test one\n        # Recorded requests contain a test OAuth token instead of the real one\n        authorization_header = request.headers.get(\"authorization\", \"\")\n        _, _, real_token = authorization_header.rpartition(\" \")\n        test_token = self.tokens.get(real_token, real_token)\n\n        if test_token:\n            headers[\"authorization\"] = f\"OAuth {test_token}\"\n\n        expected_request, expected_response = deserialize_request(serialized_request)\n\n        url_without_params = f\"{base_url}/{path}\"\n\n        if request.query_params:\n            url = url_without_params + \"?\" + urlencode(request.query_params, quote_via=quote)\n        else:\n            url = url_without_params\n\n        if url != expected_request.url:\n            # Try alternate urlencode method\n            url =  url_without_params + \"?\" + urlencode(request.query_params, quote_via=quote_plus)\n\n            return UnexpectedRequestResponse(\n                f\"requests's URL doesn't match. Expected URL: {expected_request.url}, got: {url}\"\n            )\n\n        expected_headers = select_keys(expected_request.headers, RELEVANT_REQUEST_HEADERS)\n\n        for key, value in expected_headers.items():\n            key = key.lower()\n\n            if key not in headers:\n                return UnexpectedRequestResponse(f\"request is missing header {key}: {value}\")\n\n            if headers[key] != value:\n                return UnexpectedRequestResponse(\n                    f\"requests's header doesn't match. Expected header: {key}: {value}, got: {key}: {headers[key]}\"\n                )\n\n        for key, value in headers.items():\n            key = key.lower()\n\n            if key not in expected_headers:\n                return UnexpectedRequestResponse(f\"got unexpected header {key}: {value}\")\n\n            if expected_headers[key] != value:\n                return UnexpectedRequestResponse(\n                    f\"requests's header doesn't match. Expected header: {key}: {headers[key]}, got: {key}: {value}\"\n                )\n\n        if url != expected_request.url:\n            return UnexpectedRequestResponse(\n                f\"requests's URL doesn't match. Expected URL: {expected_request.url}, got: {url}\"\n            )\n\n        if request.method != expected_request.method:\n            return UnexpectedRequestResponse(\n                f\"requests's method doesn't match. Expected method: {expected_request.method}, got: {request.method}\"\n            )\n\n        if content != expected_request.content:\n            return UnexpectedRequestResponse(\"requests's content doesn't match.\")\n\n        self.current_request_index += 1\n\n        return Response(\n            content=expected_response.content,\n            status_code=expected_response.status_code,\n            headers=expected_response.headers\n        )\n\n    async def disk_gateway(self, request: Request):\n        return await self.forward_request(request, YADISK_BASE_URL)\n\n    async def auth_gateway(self, request: Request):\n        return await self.forward_request(request, AUTH_BASE_URL)\n\n    async def download_gateway(self, request: Request):\n        return await self.forward_request(request, DOWNLOAD_BASE_URL)\n\n    async def upload_gateway(self, request: Request):\n        subdomain = request.path_params[\"subdomain\"]\n\n        return await self.forward_request(request, get_upload_base_url(subdomain))\n\n    async def disk_replay(self, request: Request):\n        return await self.replay_response(request, YADISK_BASE_URL)\n\n    async def auth_replay(self, request: Request):\n        return await self.replay_response(request, AUTH_BASE_URL)\n\n    async def download_replay(self, request: Request):\n        return await self.replay_response(request, DOWNLOAD_BASE_URL)\n\n    async def upload_replay(self, request: Request):\n        subdomain = request.path_params[\"subdomain\"]\n\n        return await self.replay_response(request, get_upload_base_url(subdomain))\n\n    async def start_recording(self, request: Request):\n        self.recording_enabled = True\n\n        return Response(status_code=204)\n\n    async def stop_recording(self, request: Request):\n        self.recording_enabled = False\n\n        return Response(status_code=204)\n\n    async def clear_recorded_requests(self, request: Request):\n        self.recorded_requests.clear()\n        self.current_request_index = 0\n\n        return Response(status_code=204)\n\n    async def dump_recorded_requests(self, request: Request):\n        return JSONResponse(self.recorded_requests)\n\n    async def set_replay_index(self, request: Request):\n        self.current_request_index = int(request.path_params.get(\"index\", \"0\"))\n\n        return Response(status_code=204)\n\n    async def set_replay(self, request: Request):\n        self.recorded_requests = await request.json()\n        self.current_request_index = 0\n\n        return Response(status_code=204)\n\n    async def check_status(self, request: Request):\n        return Response(status_code=204)\n\n    def stop(self):\n        if self.server_task is not None:\n            self.server_task.cancel()\n\n    async def run(self, host: str, port: int):\n        config = uvicorn.Config(self.app, host=host, port=port, log_level=\"error\")\n        server = uvicorn.Server(config)\n\n        self.server_task = asyncio.create_task(server.serve())\n\n        try:\n            await self.server_task\n        except asyncio.CancelledError:\n            await server.shutdown()\n\n\nasync def main(args: list) -> None:\n    parser = argparse.ArgumentParser(description=\"Yandex.Disk test gateway\")\n    parser.add_argument(\"--host\", default=\"0.0.0.0\", help=\"Server host\")\n    parser.add_argument(\"--port\", type=int, default=8080, help=\"Server port\")\n\n    ns = parser.parse_args(args)\n\n    await DiskGateway().run(ns.host, ns.port)\n\n\nclass DiskGatewayClient:\n    def __init__(self, base_url: str):\n        self.base_url = base_url\n        self._client = httpx.Client()\n\n    def __enter__(self):\n        self._client.__enter__()\n        return self\n\n    def __exit__(self, *args, **kwargs):\n        self._client.__exit__(*args, **kwargs)\n\n    def close(self):\n        self._client.close()\n\n    def start_recording(self):\n        self._client.post(f\"{self.base_url}/record/start\").raise_for_status()\n\n    def stop_recording(self):\n        self._client.post(f\"{self.base_url}/record/stop\").raise_for_status()\n\n    def clear_recorded_requests(self):\n        self._client.post(f\"{self.base_url}/record/clear\").raise_for_status()\n\n    def dump_recorded_requests(self):\n        return self._client.get(f\"{self.base_url}/record/json\").json()\n\n    def set_replay_index(self, index: int):\n        self._client.get(f\"{self.base_url}/replay/set/{index}\").raise_for_status()\n\n    def set_replay(self, json: Any):\n        self._client.post(f\"{self.base_url}/replay/set\", json=json).raise_for_status()\n\n    def is_running(self) -> bool:\n        try:\n            return self._client.get(f\"{self.base_url}/status\").status_code == 204\n        except httpx.ConnectError:\n            return False\n\n    def update_token_map(self, tokens: dict):\n        return self._client.post(f\"{self.base_url}/tokens/update\", json=tokens).raise_for_status()\n\n    def clear_token_map(self):\n        return self._client.post(f\"{self.base_url}/tokens/clear\").raise_for_status()\n\n    @contextlib.contextmanager\n    def record_as(self, filename: str):\n        self.start_recording()\n        yield\n\n        self.stop_recording()\n        recorded_requests = self.dump_recorded_requests()\n\n        with open(filename, \"w\") as output:\n            json.dump(recorded_requests, output, indent=4)\n\n        self.clear_recorded_requests()\n\n    @contextlib.contextmanager\n    def replay(self, filename: str):\n        with open(filename, \"r\") as in_file:\n            recorded_requests = json.load(in_file)\n            self.set_replay(recorded_requests)\n\n        yield\n\n        self.clear_recorded_requests()\n\n\nclass BackgroundGatewayThread:\n    def __init__(self, host: str, port: int):\n        self.disk_gateway = DiskGateway()\n\n        self.client = DiskGatewayClient(f\"http://{host}:{port}\")\n\n        self.server_thread = threading.Thread(\n            target=asyncio.run,\n            args=(self.disk_gateway.run(host, port),)\n        )\n\n    def start(self):\n        self.server_thread.start()\n\n        while not self.client.is_running():\n            time.sleep(0.01)\n\n    def stop(self):\n        self.disk_gateway.stop()\n        self.client.close()\n        self.server_thread.join()\n\n\nif __name__ == \"__main__\":\n    import logging\n    import sys\n\n    logging.basicConfig(level=logging.INFO, stream=sys.stdout)\n    asyncio.run(main(sys.argv[1:]))\n"
  },
  {
    "path": "tests/import_session_test.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport pytest\nimport yadisk\nfrom yadisk._typing_compat import List\n\nimport typing\n\n\n@pytest.fixture\ndef available_session_names() -> List[str]:\n    return [typing.get_args(literal)[0] for literal in typing.get_args(yadisk.types.SessionName)]\n\n\n@pytest.fixture\ndef available_async_session_names() -> List[str]:\n    return [typing.get_args(literal)[0] for literal in typing.get_args(yadisk.types.AsyncSessionName)]\n\n\n@pytest.mark.parametrize(\n    \"name, expected_class_name\",\n    [(\"requests\", \"RequestsSession\"), (\"httpx\", \"HTTPXSession\"), (\"pycurl\", (\"PycURLSession\"))]\n)\ndef test_import_session(\n    name: yadisk.types.SessionName,\n    expected_class_name: str,\n    available_session_names: List[str]\n) -> None:\n    assert name in available_session_names\n    assert yadisk.import_session(name).__name__ == expected_class_name\n\n\n@pytest.mark.parametrize(\n    \"name, expected_class_name\",\n    [(\"aiohttp\", \"AIOHTTPSession\"), (\"httpx\", \"AsyncHTTPXSession\")]\n)\ndef test_import_async_session(\n    name: yadisk.types.AsyncSessionName,\n    expected_class_name: str,\n    available_async_session_names: List[str]\n) -> None:\n    assert name in available_async_session_names\n    assert yadisk.import_async_session(name).__name__ == expected_class_name\n\n\ndef test_import_unknown_session() -> None:\n    with pytest.raises(ValueError):\n        yadisk.import_session(typing.cast(typing.Any, \"notreal\"))\n\n    with pytest.raises(ValueError):\n        yadisk.import_async_session(typing.cast(typing.Any, \"notreal\"))\n\n\ndef test_default_imported_session() -> None:\n    client = yadisk.Client()\n    async_client = yadisk.AsyncClient()\n\n    assert client.session.__class__ is yadisk.import_session(\"requests\")\n    assert async_client.session.__class__ is yadisk.import_async_session(\"httpx\")\n"
  },
  {
    "path": "tests/recorded/async/test_auth_async.json",
    "content": "[\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://oauth.yandex.ru/token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJw1jUEOwjAMBH/TSy+JHSfpIW+pnNiFSKhFrUGC10OFOK5mRnvZebXZXnct/LDrtvc3W9/WuW2iQ7t1/eIuxVGeMGBNkSm4jCwJJo+oCD5UwuH0CyE48PTvDm27WvE5iiySkaAGWrTGmgKD5yVFp9QG0Wdvet6YHjb+5ugBP1eBMxQ=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"274\"\n            },\n            \"content\": \"eJxFjk1TgzAARP9KJ2eZCRSs5ZZGC6WVitgWvWT4CJBGISWBAo7/3eLFve077L5vEKcplZKomtMK2DMwQIIKNCXZBpAjFO66YKpPXv26MxBatT538ErL3PfLCEtcEbYUzxvm9yIAdzNAe8EaKgmb5ua6Nb+HEN54Q/MbLv+fdNv5rLjBhi6JMlmYpLIdmXsd5Ro2j4cl3fbHjYO56dKHJPReRhnFbXqmXaEryU5sxBBG45p87a8Zf9PNQ6G4sgyxkK1YWJf87J/WV/vRwbrQ9q02fLhlrULsZQZGk+ifCFGDoJNNQuOGNuDnF6qFWdU=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoRL2AABuNkGCB-dHYqz0hCn_i9pMIiNxpQ\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://oauth.yandex.ru/token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJxVjk9vgjAchj/NvJHQfxQOHEwXcZjMJU4lu5CW/opYRUYLDj793MHDju+TJ0/eupetL/3UQdqD6cGdSn+z0C7+rRS9kGV2aS1uplEV2tW0bP+QM/kINhD0sE9g83N4y4Sla4jVLv+YXSGH6gxjjbxrjs0swrCYV+V1e9f2E9F97a1nuONu6Dj7Nuf34+r+iL5mAnXBdgimr/Xp5nci11gsF9WlgcfVRqchixNCieKRZDSMidQcJ4gQIBhRxchTdVD14FMUR1obHROGFWUGVKQ4lRhJw6MQWPULADJV4Q==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"274\"\n            },\n            \"content\": \"eJxFjkFzgjAYRP+Kk3OZCVKcwi1EEVqKheIIvWTAfhKaKhhQAk7/e6WX7m3fYffdUL7fQ9uyrhZwQvYMDZiRkkwpXiIsCHkPrtFUV891HMwJcS6hWFNH+/Sy84g5PbHKal79KlRNhB5mCFRTSWhZNc0ZumksMMZ3LuFwx/z/SbfftlG8wdhwE6f16Me3LYQasSGJpxc6pRnVuXuIH1dggib8cFFkV2WmFuF5UMAxTtP18MWCuVJXd3f2gS1T3rOOO7gem4wx+VT2dlceE54P2nYXqLJfXiwn2bT9JPonwrqhgcmmgFyCRD+/2LhZRg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoRL2AABuNkGCB-dHYqz0hCn_i9pMIiNxpQ\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://oauth.yandex.ru/revoke_token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJw1yrsOgjAUgOG3cTNpe3pjYCjEeEMSdHIivRy0wQAKGvXpDYP/9iW/9R7HsZ76Frv0Q2pzMXNuX5HWmFPxqmaudv2xYMZkz7Jd59kybM73L7nmXR2T4bCN5XuoFv4WsZvqGFIidAIcnJJWcKLBBsUSCoDAKHcC/uuI/oFTSrUMoQkaBHNcNOikU9wyahslCQr/A/7tMyY=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"16\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUlDKz1aqBQAv3wVZ\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoRL2AABuNkGCB-dHYqz0hCn_i9pMIiNxpQ\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 401,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"99\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoULGy5suth0Yd/Fhgs7Lmy/sO/CJqDIXj0lHaWU1OLkosyCksz8PKDi0LzE0pKM/KLMqtQUoGRqUVF+EZqwK1isFgCIxiz4\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://oauth.yandex.ru/revoke_token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJw1yrsOgjAUgOG3cTNpe3pjYCjEeEMSdHIivRy0wQAKGvXpDYP/9iW/9R7HsZ76Frv0Q2pzMXNuX5HWmFPxqmaudv2xYMZkz7Jd59kybM73L7nmXR2T4bCN5XuoFv4WsZvqGFIidAIcnJJWcKLBBsUSCoDAKHcC/uuI/oFTSrUMoQkaBHNcNOikU9wyahslCQr/A/7tMyY=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"16\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUlDKz1aqBQAv3wVZ\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoRL2AABuNkGCB-dHYqz0hCn_i9pMIiNxpQ\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 401,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"99\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoULGy5suth0Yd/Fhgs7Lmy/sO/CJqDIXj0lHaWU1OLkosyCksz8PKDi0LzE0pKM/KLMqtQUoGRqUVF+EZqwK1isFgCIxiz4\"\n        }\n    }\n]\n"
  },
  {
    "path": "tests/recorded/async/test_check_token.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_check_token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"135\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxVYbklpSkTchMRRH/3XF1zzmb+zGhYjSdCSKFO2tdyqvfUpnaNy0er3aB2OfO+omjreC8Vgc+FZJw/LfmcG72twddlHuwqIjO4AJcHCRHLGZjZkjIXm/u115VMJdEAi0jJcb3B61VL3w=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth asdasdasd\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 401,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"99\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoULGy5suth0Yd/Fhgs7Lmy/sO/CJqDIXj0lHaWU1OLkosyCksz8PKDi0LzE0pKM/KLMqtQUoGRqUVF+EZqwK1isFgCIxiz4\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_check_token&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_copy.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwVjEEKwkAMRe8y0J02qLuCiKD1At24KmEmZYrTTpikYpHe3bj6773F/7pYaHCNi6osDYBPeQl75LFecQ70qWdSeB8gjPKCQpKX4kkujBrP/1adrtWxfeLNuCNRE7XpfebV7dxEGnOw/8e9M1WaOKGSlQGT0PYDWPwsuQ==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"148\"\n            },\n            \"content\": \"eJwdjUEKwjAQRe8S6E4b1F1BRNB6gW5clSGZkmDaCZmpGMS7O7r6773Nf5tQcDKdCSKZO2tdotVvIce2wuLx1S4o9rmzPvLDFmRai0M+ZZBw/LXmcG72/R0uygOyqIjO6ChXZR8LOqFSR6F/MxszowTy+nm7DqqCc04gqGWCxPj5AlDENIc=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy%2Ffile.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzFESgiAQANC78O+yIglyDi9AsWZS5OBiatPdm2b6fjPvLcZMg3BiZJ4XJ2WZ708fKLd2gnBbIuw+BdogETutm79X7POVWCpUGg2aHhFbVYOpOygcwCe7vXzZ1+kSU1y747ENZ3OQruIv1mixsfYkPl/KJimJ\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader68j.disk.yandex.net/upload-target/20240707T000621.719.utd.an8xwauyvjcknkv9zmxfb7ze4-k68j.40803885\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJxLrUjMLchJVShJrSgBAB9kBNI=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy%2Fnested%20directory%201\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"169\"\n            },\n            \"content\": \"eJw9jsEKwjAQRP8l0FO1oXoLiAhWf6AXTyVktySYJiHZikH8d9eDnmbmzRzmJWzGWShhiVJRUhofV9jq5LqqA+CzC0jy0Utw5S4zlrhmg+WYNNnDlzX7U7O73PSZ/YiFOBDLZGKq7MFlNBRznSj+WOAeof1XbS82YkGyEfjIdRg5Ei7Ja54JNWtf8P0BBwc8Aw==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy%2Fnested%20directory%202\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"169\"\n            },\n            \"content\": \"eJw9jsEKwjAQRP8l0FO1wXoLiAhWf6AXTyVktySYJiHZikH8d9eDnmbmzRzmJWzGWShhiVJRUhofV9jq5LqqA+CzC0jysZPgyl1mLHHNBssxabKHL2v2p6a/3PSZ/YiFOBDLZGKq7MFlNBRznSj+WOAeof1XbS82YkGyEfjIdRg5Ei7Ja54JNWtf8P0BBys8BA==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/copy?from=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy&path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_copy&overwrite=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgjAQQNG7dK20wwBT2Rsv4AUGOhOIQBtajcZ4d1n+t/lfM+2ipjdTKSn31o5LfIYzp7n68BbkXW1S7AtsmPPDxiQ7lzlu2eKlHQCbBjAgOegImQjQD+r0Miozda16V9PI6Mn5WkAbJQ/sJGBw5mRWKVMMx/t2vR9ZZE0LFzlEecny+wNI6TCq\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/395b134413d3701673a77138bf0f9cfaa765f8027ca387082e1f4f781a0ed3d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/395b134413d3701673a77138bf0f9cfaa765f8027ca387082e1f4f781a0ed3d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/395b134413d3701673a77138bf0f9cfaa765f8027ca387082e1f4f781a0ed3d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/395b134413d3701673a77138bf0f9cfaa765f8027ca387082e1f4f781a0ed3d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/395b134413d3701673a77138bf0f9cfaa765f8027ca387082e1f4f781a0ed3d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/395b134413d3701673a77138bf0f9cfaa765f8027ca387082e1f4f781a0ed3d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/395b134413d3701673a77138bf0f9cfaa765f8027ca387082e1f4f781a0ed3d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/395b134413d3701673a77138bf0f9cfaa765f8027ca387082e1f4f781a0ed3d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_copy\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"7136\"\n            },\n            \"content\": \"eJztmWlv20YQhv9KQKD6Utva+xAgFHLsJE6Uw4kTKC4KYY9Zi7VEKuRKthPkv3cpXy3s+GikfBKgi9RydueZdxbEy2/ZECYWvAefdb5ldVnFrJNlG1keYVJnnT+/ZYWZQDpXQB3BP/F5BS6W1dkTnEbBaR7Sdd83MleBiU2QjCDCNpHcROKA4A4SHcJ+R6iDUBpfQV3OKgfDvBnJOBeSY0k6xggrvabKEckoN8aC0CwwjoUNzjNsnTQgODjNmSHEUEIURjQQYTjCLoWelD4P+b0rmJo4SkN8Xh932p/NTvo+SJm1Y/oYunJ61r7K8Pzw1rxdOZlAEVMadYNtWuXzlP3wMr1l5zad2XHuVhQ+FS+eTWEBpVrUaJ7XeVlknRQeEa21YpRihND3jR+rgSxRDZSkn44o4xVjnirrrAiAtQmOQVAKqHeYGGuIR0wTrgUFQBgowigNkr9SDeSRalhCbnep4afDP0QNaboLNZgi5vO8mtXDOpo4S+lnbgymSBfW+dcUBZPH4XHEU4aRwI4QpilO6zYoqZQzYNpaxKiQhhkUREDMKWMJtlRbxT1Qy6W5B89Ph094Ljog5GPYiqfxwbrn9+p+CcnfqfvrFUzyCQwv6hzhNLanY5NfVu18259V4/TnKMZp3Wm3fXlSjEvjodpqmmXrzBQeTreqWXvaKARO2t5zR9J6hTfeC0OlU1wRj1mSmwFqHLZJY0ITSikKQVkFQUspAhcKHHftvAjtt3Zn8/WnATUH71886718ow/Zu77eRX9P4WTWj2J39vFwtzcfH21zezo6nG5jXvQ+fn77fp++exODmG8f6vghL0t0tr0ny8P+9Otos/cb3UmvP2a5717BbjX1a0rZvSxkKyU2Les8JrV382KcF9AamXrUbY3zSR67qOXKIjZCbsB184k5gt/Is7S0o1aiA9XwvxPE42LenTf7w4Vidnaf9T72D7KmcdZ0l0O31Qi2OxgMPrRcVU676Bp3c3LNegWsb0O9Jr0C0reAXnNePuebmNeUl0/59Q3Kr9eUl065f4Nyf015+TvzTcyDNedV3GvcAnpNejV30LehXrP+JfcbT7Pvf20sHIUHYW4O2wQrrIKQ1BrJjHeUaC6IItoLwpD0imrGiFRaM2odt55qToiknFrJlXJtIZQGg3F71hPsbDB1iL85fqdf8OP0jl84sfXwVYGfu53Dl88P3j4lfg+29WzQ++LIyf7J3oCmaWy5j8b1Efu0Z/pVeP/K7kOcMz+D/f8B2sRo3Kjxiu6C3fgVifXCsbgVdlhQxqQ1SqedYYE6RTFwzHQQWlqLvdMEUc8B0dYEfG7OI/vSzRazX5YLojnqBoWBaANaKYu10NpYr4njWid9I4DGTrmK0fhmF1EaK+q8H9a9s4reebR3+y/Hrh4ZwkW6GoFmiWqCLUJAVGtiuAzeWx+YJMoKpD3yMoCAhF0HowO22nLLGUotxrMru3TRvUkKnjcH92vmNmOVa9oYq2kvWKDKOgRtZGUINaTf6PEpN6sro0mbN702Lm8MubYvf2hMIkqDJ4Q5g5mX2kpKQRJKEE+bAAmeooSHKC+wYEpKy6i0Lu1FTAZJdJPuw54IrMi2f6RHv4R07zShfzb8Qzx6dP7E5h9plcsX\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgjAQQNG7dK20taVQ9sYLeIEZZhqIQBs6Go3x7rL8b/O/ato5qUFNIqUOWo9LftIZytx8YCN+NxuLfllNc33oXHgHmfNWdZ98b8gla4wPYzB4IRvAcIiYIhrrTUhtdNyha7EbLWAk8H1HHp0lbtVJrSxTpuN9u96PFF7LAsKHJFgq//5/tTFi\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/8f480d3f10046c60b2d16a0e69bf9b01406f593e7b35b7c1ab9da487d4b31de5?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/8f480d3f10046c60b2d16a0e69bf9b01406f593e7b35b7c1ab9da487d4b31de5?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_device_code_auth_async.json",
    "content": "[{\"method\": \"POST\", \"url\": \"https://oauth.yandex.ru/device/code\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\"}, \"content\": \"eJxLzslMzSuJz0yxNTC1sDQ2MU4yN0s0NTGwME5MMTeyNDQ2TjU2MjRJMjVWS0kty0xOBSktSS0u0YZwtQ2NjAG8WxSf\", \"response\": {\"status_code\": 200, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"154\"}, \"content\": \"eJw9jtsKwjAQRH+l7LPYtGma2p8puWx0QdK4SYsi/rspgo9zmDPMGzzu5HBxq0eYG9BeoRp9LzuLgwmdlX7S00WEAe0otIRTA/hMxJgXitWQQlREsSDv5l6BqnHLyP/JR3BXR0kf6o5MgZwptMZl46MPt1JSntv2Zc68tb8/8PkCLyYweg==\"}}, {\"method\": \"POST\", \"url\": \"https://oauth.yandex.ru/token\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\"}, \"content\": \"eJw1jkEKwzAMBH+TSy6WJVnOwW8JliWXQGlLYgr9fVPaHncZZvey19tYx+vhxfy5NV/b3Xxq183PfrMSOC9IqJIqU8hYTeICiI4RSBmnD1/E2DlZRFCn2kHRsuQldHJNQfAvPLztPgrkZNYtI0cl7iejQjVC7ZKCc5t+X8794ceYv3GGiG9UozdY\", \"response\": {\"status_code\": 400, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"103\"}, \"content\": \"eJw1jMsJgDAMQFcJOTuBe3guoQ02IElJ20MVd5cqnt/nQnY3xxWQesvmclIT01BYk+iOC3xGSFyjS5lw2ltlh0wV1BoMbvDnnGBYd6BSDonvDO8HpfImFQ==\"}}, {\"method\": \"POST\", \"url\": \"https://oauth.yandex.ru/token\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\"}, \"content\": \"eJw1jkEKwzAMBH+TSy6WJVnOwW8JliWXQGlLYgr9fVPaHncZZvey19tYx+vhxfy5NV/b3Xxq183PfrMSOC9IqJIqU8hYTeICiI4RSBmnD1/E2DlZRFCn2kHRsuQldHJNQfAvPLztPgrkZNYtI0cl7iejQjVC7ZKCc5t+X8794ceYv3GGiG9UozdY\", \"response\": {\"status_code\": 200, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"274\"}, \"content\": \"eJxFjslugzAARH8l8rmRQECacHMpoGKUsJQ04WKBMZjdtUmzVP33Qi+d08wcZt43yAihUuJpbOkAzBW4KxhWcFGOQqWFMPa/wiXa3pj1fDakUUWc3o7QRUnlprSMIpv6pJw+K/C0AvTGa0Elrpc5TTU0Q9O2cy9oOdfs/0k11bjo1LxOiD5YMX9JTXEOGfW8wHr0TkF6dMGqlidVEwkFrxmGfkfGyA3Yx+jZiDFFkceG70ZdN+D7YXNp15LxAdJePPdW5J+7PTQdyzm8npC8GmhfvG1Ot2C7K64L6B8Inu6cLjQ5zQQV4OcXsaFZJA==\"}}, {\"method\": \"GET\", \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\", \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoampAAAcj1rSZxVAGKUgGZefRREeLcftqg\"}, \"content\": \"eJwDAAAAAAE=\", \"response\": {\"status_code\": 404, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"137\"}, \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"}}, {\"method\": \"POST\", \"url\": \"https://oauth.yandex.ru/revoke_token\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\"}, \"content\": \"eJw1irsOgjAUQP/Gue3ti4GhAzERFiA6sJA+bgmioNAY/Xtl8EznJMd6j9vWp2XCOf+Q3gxmx5U1mYxpq1e9Z3Fa7P3xE3+la9u9L+ZYnodjh7FpCqx8TM/h4G8jzqkfQ06EzoCDU9IKTjTYoFhGARAY5U7Af93Qr5hyqmUIMWgQzHER0UmnuGXURiUJCv8FS/Ez0Q==\", \"response\": {\"status_code\": 200, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"16\"}, \"content\": \"eJyrViouSSwpLVayUlDKz1aqBQAv3wVZ\"}}, {\"method\": \"GET\", \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\", \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoampAAAcj1rSZxVAGKUgGZefRREeLcftqg\"}, \"content\": \"eJwDAAAAAAE=\", \"response\": {\"status_code\": 401, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"99\"}, \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoULGy5suth0Yd/Fhgs7Lmy/sO/CJqDIXj0lHaWU1OLkosyCksz8PKDi0LzE0pKM/KLMqtQUoGRqUVF+EZqwK1isFgCIxiz4\"}}]"
  },
  {
    "path": "tests/recorded/async/test_download_by_link_error.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_get_disk_info.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1268\"\n            },\n            \"content\": \"eJyNVNFq2zAU/ZXh16ZESuw4zgds7H3vRrUVR1iWjCVn60qhzWAddDDYy2CUlUI/IHTNlrZLvkH6o125XZO1L36xse45555rn+sDryDv4jHjNFbsPfVGGIX90MfDnt/xSsLS+Ek96A+GIYpwD6GOp6UmPFYlSaDiBygKcTAYoGHHq2gWa1bAsddDONxFeBf7b3Aw8vGo199BaISQBwIVUZMHZdBjKnY9vdGYcEWbZ5YWYEGQjKbxWPKUVjFJ04oqFZMkgdsjuFYAefDSjyIcRUMcoX7HU/tK0+KBDfgDT6ZC5pwoJVjOwGLKVD7qmguzth/N0szNnf1sVvbULF7YY7OwM7Psmh/m2qzM2tyaOzO3x1BYAfbWLGGOTMqM05ZKrxrwDtCYUJpkFSlaMl8/4jveNJdCk1y37Wq+mu/gfgUPc3ML1wWIEK1JMtkonIPCCdTW5qphmysYdm1+mYUb1n4BSkEYr+q2Tc+AffMCbkt7BORUvhVcklRt+N+A+dMe2Q/mt3uZXeeqLDlLiGZSbAHP7RG0eWpnDN97T8q8paGX/+AQC5kwwlvy3OAQNioyWm0olwC+Afipm3DRZMI5u3YOwe0cWAnhVKRki3QG6Zk19fteQL4C6gwOFvbEGUvI9twX8Frmzk9TqigVaiL1/4BGbGU/wQgze+rcloCRSld0O1yXrt5EeG7+3FvseofN6lRuL1puLaiVnOzHgjRQNs3FFI5rt7meHwSDMMBhzw0va6GrfTiFxDTrnEwY3+w3lxkTjwqHzxa+rPcgCM8WXXBWMA11UmtZly5QMRVkj9ONdEWnTEGA4I8W9lAQREHQD6MAB/7hX6naRCs=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_get_files.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=0&limit=25\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"36722\"\n            },\n            \"content\": \"eJzVneduI8m2pd+lgNt/5vBWeNNAY0AjWpGi6CRxMCDC0nvPi/Pus1Pdd07NnColCUnV3YUCZEglMyP2/vZakRGR//VlvAvz7Zdf/9d/fTGL3fgw3uy3g+3O7Pbwyy9uFsziyz++bMeX8OVXTCgm//jilvN5WOwGYw9v+a8vq834YHZhsAnb5X7j4H1fGOdCcizJr1xiGRBVCHtGkWSMY8e1VtgYQrXT8L1EMSKpNReUI4JQ4D4qGjD1Nhj47NXezsbukw7/z398WZh5ctDsoNdkhdaClC7PxdGY1fs4+1w7d1oTYmVXLUtj2831XkpjNVzCWYXTOMLVw9+7TYDL93AIgrDMIPiPO1j9yvCvWP4PhH5FCN7/36cPrfbRDTRf+nEcp57BfDwPg915lVysWa2gTc1uvFx8Xbpd2GW2O7iMObwtjmfJO0a73Wr769evfnlczJbGh81/+vF2+p9ns/Dh9J+b/dfkx6+IWYWDRJbB6aGgnPMyGssInLjDyVfrlGY8BMyI85FppbGlXBLtnFL2qxAqBBb118W2XJmG59rCtEqrznmBuuPW+tF0qXsgp1JjsmhMy6NFNpMt9Gq7OM6ykl/HfnF834iH6s6IklkMVs1OrR/FjoeXfWl37PeO/0EL8P9/7sf+t//b5r8kl5j0+m+39PkvcL2r5XactNlvZrczbpRkwS8jsx399stsPB/vfkO/uOVil+RG0s6/fdPK/0GK37bzL9CqYTP4/04rybLfXpPslxG8ohH0uldSB2WdRg5ZZyEALEIqSMHpL/Pgx+b3j/JmZ37ZTReH3w7kl7Azw980YZoGISiRwUkVhRFERsW01o55FJLMMrsRdHXSkb9+vVu4zXkFgfw1v/Tha3a7DXM7O3/N0fm2UUUuO2zh4bxCh6JwoJ3xc7NQZZ1VIXs49Fvj7T43LrbQ1xuT6F8XkJwGXEKCmpEhXCQ5AqEluVQEYxYpFQK5EHgw2AvjtGIIB+QiIjF6SiOJlBjJlGXSJ2nkkgv848ivIQ2f5jn8cEW7bMJhvIVOA+Il8UoZk1Ih+Cf++Y8rMMnQbYwUNnj4hOg8DgFOSBgq4WvkDDJIK0gTDmfII2SJw8xYgS0ijjG4aiS85CmMfPfhv2HkbEgWeTfbx0KYL3txddzhS/7oz3KUOZXUfX/7slwVWIbkyf0HMvIDGujPZKRTKFikjEICIYcddcxRS3SA+CY4MCcA9xxFHaNVTjjOFAS1I1IDPbF1KYzsjpbD8macDZPs4X58V2jQ7aGz77wEdWovBueXCq3c18+H8qh0b02+uRwsNp1plS2x3srOOObTGHlDn/8sRjL0CsgQrHTcWukNiYFTBFTwTnjLoIR6mwJIiCqOmGLCRR9DRJ4TZESgwgWlIlKfAshCqTVGueXdY5W0TWl9X++27w1rnqvZ3hqvOsY2Qm8tmwVb1eLrjen2Jk29hcgiyHGuIWU8QQGxEKTHXCkoOMgiSWMMlDoJeUMFh5DUzFKqmYE8Uj+g6RWN+D2aakGUYlfRlIsbaRpo9KBAogjGOmSgbCrOjTHSKKy4CF5jDVIEU2o8VNioggrIQEpqpJ33aTR97+H/RdNCMyPMU3ZwMuRYrOb948A87Z/anX67KXp1IjrDdbu5eVwUQmvykTR9fwP9mTQNPEqlHOJIBuME4tHRAOAMFiMLNFUKRayNUFogiFtsPQbJ6QTRnnHNTQpNnyV5bLdzu+5Dbj8v8zZfjIrTuShPz4N7w+erzqh3P7lvNLN8DiJi93Juj3vbHn/ITjrkmU2Gw7dpekuf/yyacvFKU4sJRIWHqqqoskQSp4XnTgXisY00vk3T4JUSECiGkygdMdRhGql1IN28R5j9+TS9Md3epCnxUWvsvfAgPhWocoM0CgIAKqUXjFiqDZAW6Em9RMExC0FHwfSYaJni6Ac0vaIRv6tNFWKSXEVTjNhtOIWLA10dBCgYHcNrCQGNTcCWGK68Bt0dA0FSAdCBFpF50NDWec2RsFJHkYLTdx/+XzjN9Q/yZIbTrLmzovkCDX6nmmbUnfn7yM81X28dH0/Cz9ToLns1TnUqTj+ggd7Eqf5cnEqBhODBB0h1pI2hikIUAkujkJpbwhEmHBwVdQ5JT4z2ATs4miNCEsLTxGmnWVx2MqdNhXUu2S42x36tl9np/PNhMr5MHy90Puzvs7y8sS9PpZWuZC+91fJ587AuTLJ0ullk38bpLX3+0ww8Yq88hQTGv9fXCJLecwNtCE1roIsJw9y+zVNuhbMBzCwY1RC0sFxrGwn0ABgE+lfg6Y359iZPLZRxYzR3IEy50CBMuIgQavATiBLPlIP245b6oCSnEHxMeVAoHqy7AGLyH/D0ikb8Dk+1hoPqK3lKbjT7yMEJSDCoAIEIupkwTQjkEhQUD/pKIwfooMzAKQuQLVGAEYRGwskgmiWWpPD03Yf/F0/zq9Z+lGts2CJk/IDtyVYzlekve9mNaDyvouoat2kdS739/cO1PCUolacf0EBv8fSbM/gksw9GK1gQoBBH2FjDqVNCgz4QVmjpJbyMOSHWOQ/lgZAIdgkCL4JdArHKU3hq/H5cP24qT7pebsyr5fqFtJ/M2rJZe1xcq0oz1+1NSOxmQjGfIRexmAxJrTvZrg/4nt89DVLM/i19/vMGRP9w+4ohsJkOM2gmpLFlAFQoVzxpRx7C2zwlYGmENVDTgMeRYWqoZYFwJSOjBtM/n6c35tvbbh8CCqgJLs5gK5FCQhq4UKMJZI10SFDqhSIEhagDAbHqIuBVReM00cDIH/D0ikb8d54qpAhi+kq3f6s+DVFoAbJbeBIgz2LQPjkZS1lgzDpqQowW1DQkpFOSRItAzvjAGfhFgZxM4em7D/8NT0kYMXXoLPHgNNlXc5mX6Z1aWvXsK71CR8/sclfYitMA5x7YfqA7QvdPm1YzlHmn1bjkGo3H3367mrM4lbMf0HBvchZ/LmeZCSC6k2E+UAYuUVbIWAtcZc45o0UQimom4VWtFKM6YI+ldtKCAieYpunWMLo7PO9auUk1MxsX9v0eHvr144zxC/aNXKm3ydc6FbVempdKHtUm2UdydxllqpdSVMX6rltP4+y7Y+H34/+0IYI/NC0iFGnOXUA0Gb32IjCNBUg0ghHwg6eMuIJthpDiYC2YgE8ApwR2GGLQe0J9JH8BBl8a4n5auPAn1KyI/HKS32nXR+v2qJedbp52D7SVQ7lGqbB/ePz6QQn9Jsh5UJyDo+CBGoWiZoFjkD1EJcNfERscpNLBWumspcQ7ip1MzAUF3yZRkD8atk3vie+AHCvGBdZXgVzfKoy15MhzpKAyYdD/cJ0RQepqJTgJDvCE4RrhKk2EcoWtBSvlnOTceqhXktgUkL/78N+M20q1bpBl9IWFHVQ29Uk1iHLpVDh27V3Ap+5TodI/v7QeQ2tlRtv6AGeECAN26bLLICza2B0/FOQf0HB/JsgtdsjBBUQNVcaDxAeZAnIhIgFRHaxjUKSALBYHjAIKAXyiUQJKEIS3Dk6mzSBgbhAaq0Y/2z/dl6prFM7dh9HL5cUVfKd+Mo/lVZ/Gx/wQFWvzXvuMS+djeNlXm2y5nQ+HuceU8dx3x8LPBbn+Q0wjj1wyycQjar1X1oM2ZMEZKPWAApcyOJHoSWkR9R5iD0x1BNlAoRp4IQkLAv3NQP5BCf0myAPENGbKGmhk8C+YIRWcRkRELoIClUVsVJCiRCOswf9SzaFFpTIKqi1D7Acgv6InvgdyzQjh9CqQE3zjDbjAlOOcQBSh5G4SYaAdo6BcE8MFQ4HYgKPlEb5ohCj8CJqNckPB7UtrcZoif+/hvwH58CGOy51xfzSZb6dmeeSP51Hhsabw/DGTbY+XVTS3l0a5vanyx6LK0/rkeB7K+yIfs82a4cktipykK/L3N9ybICefC/KkmEgKFkJ5KhFT0ohINGPYMZYM2iBOHJWMEQ5RD3KDB2GpN5YoymQ0PgXk9hj8fbfeQ83hfau7Pl/KOjds0ruXqixPSy/TWeW+MjHL7nDsp436bMH4/KSnobu4mxbbT4unlJHk98fCzwU5pOUryEkEzwN1UfPIJE5m4UUCgeTBxYWAuHkb5NYDYzBwwnAvqZTaaquYYToEEAfG/N1A/jEJ/fZQNaYhOIoscUZGbowHbY6UCzQaYZNZak5AVHtOuQUn7V0y3wIQriHgqdb4ByC/oie+A3LCEAZ/cN1QNVU3jq04nkhEBBpRIx7BVERIZA+lS4OA9HB2INacsqAzfdTidTyIgc/WykvQdK93Od8i+bsP/83EtCAfHoq6MDOoehxenqrnnfDTI7O5+qQo1+VJsV05N8kO+0XlamKzVGJ/QAO9SWz2yZN3naCIgPSzzsdkXI8TiKzIHbNgJ7gRjhAnQaJQJQNcKU6UIYPLlBGCT6C0iWnIFFx+E0rPubjMrcrzXrazmKFVe/qsF0+j5os9rqrGDbKLB9q5H+3nL9G1W26XK56zUVeLKcS+pc9/2lg15NgrlqOWiMvIoDEFYmBjsATjFUGlRchuj97GsoGCj2UyeVEYoDpRPmF5EERYH6O3fzMs35idb+IXbCIK0gqJrEimxQurpQBUIqQZOGHjjXNEaGORtyQZHKTRa6qEpAp+qX80j+2KFv8OfjnCWPHrBkQwKPLb8AuGgBDpvBSKM8wJqCoNZs0EriS8BWoLAy8cHBh5rzmUDMIBOhyMP44BkzQh/e7DfyOkBz2w06OMeskMd3tXOW62/enuOczK7V2vGVZCZ2r1wWW4f5zZbt4Wjg8T+SCXi2zY0+N08lC7RUinY/kDGu7PxLIE7Y8t6GijJcSZJUAVF4jAVioCX31ANiiGgyIgF6x24BcDxK1k8IoSMW1ou5mZv8x6p8PoNNXVPl00a+1dhuFCf9edt9GBTpqTmJ3l6qK+GhRLk1rt2CqXQqmUU5dq2TfTRkTeHQs/V0gnefmKbIPAhaAIlTqoGKJzAaw1ijKAw0KcpdxflFAxoV5SL6BmMugpEOCU2aAVJzEw9zdD9gdl9JsoN9JGIDLVCJIR6A3w9lb7iCB4wQXHyIRXBAPQsaOgoBBFVIjg4I+oAvz/AOVX9MT3UA7Mp/JKlJNbUR6MEVCeDNKa8kgxmGFHpCHOWUkZtaCmKHFg3pgJkNiCUAwmWeIYDY4u6rQxkfce/ptZdJm2n7cH8/myUhAvg91snN8fM6WKb/h99eSa4+IE0+qZZkrV5WV8HrJOo7ZVZ1vqQZo0kN1nr0c5TUf5BzTcWyinn4xySxnwGmhCEdNGaI4Tl4CIUipxd8BxTY0nASXTBFFi3rEm0UrnkIIkYSko79dnVXnHn2aVc+7RbgbNhdCx1dW11kMo8Z24B5A9lc75+iL7UHek2NzamSaL6rLu17UMPqRMVn5/LPxklJM/UK594myU5FAcFag6FQVSXFFHfMBCpNymVIxgHrUz3tJkboM1QWCnsQ0EaIT03wzlH5TRb8+HlmCAIZadwcEGShlnhhJDEA0O9JcBbeIcS8yjjoxSEF00CCeV98B+zPyPRrfTe+LfUQ6VhBHJ0HVr9fStgyJKOgncERYzCbYfkhj8MgdzRxhmhkSqk3egEEVEBox+cj8VEl2BIcFIubT1Je8+/DeqnILtnrHVoeqwYe3hy6WJJERkubLZr8gEXH1NomNVnNaEFl5y/fN9viznfXR/WHQWuc6Z33Cf8gqUf0DD/Zkoh9BL7pGRJKyxUN5GCqcomYLg9jJiQwNBYDdltBDooCPl67h3Mj0qIOZC2rqTvZ241pK1N7lFpnws2VElexaFLaTffFzblmiG5emmkLm0c9Uzvhf7dbV1P6/29egRsYlbpqnyd8fCz0V5kpevKKeaBgMxgwXR3BpQi9xhqJTg1bRlPm0WNcYaxCTIRgwSPipDFEDCwC8j1xz93WacfFBGvz3AYjCXgTGIcU0lKHNI10g59kowJy113CGBlTBGC58s70eSBe9iMNApIN1/NBU7vSe+h3IF0p3Iq1BOxa0LrxVj5nVGWDCIwRVKYTzWUSGOVOIasHAIu2AhublJluLg6EFWAp245MK5NJS/9/DfjG/T+LSkbdLqcn9hqlMqlcuTOBs3FsV8tY+bjeFwvFgvC26E+lcjW6Qj+/0N9CayxSePb1MTCSfeKe0pdd4LMAnJpOGowQyCMOFwQdHp6ITRcFFWg32AC4OKhHgUJAXZrc0clfP0VO0+5QsqzsKlZMo9vPOnRmEhCo49nXom9Np0uu6cJ6E3L5MOqr5sO6XxoNXRMW3h9Q19/rOwnOTYK5aF4hSkm5ME4AC+TGhHfTLUzaS3WKUsFsTWGS2pZ9ZHqanlMTqKY7JoE2zQqxz8O2H5xux8+/ZiDEozwwKSoJJICOBeLJjaKBUOjCMJ0GSCROadhG8UmMqogoZXiGGW/gi/V7T4d/ArKRKKXDdPhIpbV8KAL5bW6mS+itOg76kXUQgCloArsPzMQtoGbwyxBnxxoCQacNLea6pDMGkzt999+G9mbqPMw6m3Ee37eq44rBwn+mWMm7n+tl+ha7u2Lnsuj059s+sM0dX0TV+o/QEN9CZ9P3mhNkhkbokyyiTbNHgITwZePCiTTFaBFwTlyTRUJDRWYBh99MrB5blkHppDOm1iX5vUe73RqDnZiXxHDp+Lc1Qa7dc4jmTrftLP3JVGxZNpZjfo0qxO2sfavt1Tk7N/qRR3mfqinzL2cUuf/zz6/g5fDKYaJZtdJLcGNMVABYgNgoLCUKDTNgZS4MCRN0CZgGMEjGAOxc8BZYiRyOG/AHxvy7c3eUoFVHdwaTgSHYUl0WtrnA/Yes4C1DMPuaRAChgHioZTHDDI0eQWkQWdIOmPRibSG/G7POWgLNR1IxO3bnyhuMCBODh3jiLSBGSYFEFHycCpMkKYh5de90wCj+oIxBBV4GQpB11uLU5bWfjuw3+7EuZOdiovpxey6JY3s3Kso35H7e/uHk+FyVO5qM/juhJiftDPZewyhd0o98BlElfbWrnUK97fMDDBVLrKfX/DvcXZb87gc+bdwekbbVGyv1BQHkoG1kCGaAOUe2Apwkh4LA2cKcIUJ1PtqMZeWIUZRHjaLA7zcB5tnmoPiIdh7bmDQ+7McEE+s5ywp7tDuSfDfZP3L9XzpdVGhbvnYPfrvhGTjSXusjunzOJ4fyz85IGJP3bLAOMguCcO3AO2FDwz4tyLEOzrsk54U8pqRGtphGqeTPlVIN0iJkkvqGS0Syj5F2DwbSthPiSh317S6CVnMTDFI4qegyF12KCIlfARGhNsh1fJEpVoLKVMc6nBkwjmkJAhuB8OMV/RE/8Gco4RYsmmXdcJY6JuA7nhjCS78iCSmAAvvAXeGGmSTT4QWFNqQVEpbMDdJnMbmIdTNtwzA69ZhtOE8bsP/w3It3KbedL0rtScNOe+VpU8N6pMCmNMeL1xB83la/lMtcLzon4dsAkQMxXYH9BAPwb2/3MGn3NT0EStHQSxQppyy+ALKAkkUSKEpRSYMx8gjqEqJbObXAw2YbZTnIHk4zQF2LHBWq1Nf0dD2D2v8scDcbuCehg891fHPUN63A+5UXk/y+3KVq2l8LNmpzhznSqeZWw5P0oTxjf0+U8TxkS9Qln5ZHNAKNEestOHyHGyA0QkImrMoXy/DWWk4S9BEyJDNWdgVawQYK98svCcUPEXGJUo3I8rL038jNvDsuk/ysqo79WMVGOLl/i+uWjz+ilz1yqux6XwtVDtjprjJ+hVsZA1zp9rhcf+MAwHqo4yVXSQPbI6lHc73tgB7jPFSy3qdtltT3f7bn0/utCGJePmdL/vnc10VBz2y+dlo55fzb7emPZv7/IpIEWTmXoUA7CjlxSMLkhpgxAILaipkBpWGIGsd9TiCF1jYnROgYIHROsfYP2Kvvx3rEPmCUQlv25djLh1pToFLYacC6AWvEMucMeCSrbbUww0hOTWE5zYYS6VBK4p5pRx3GMTQJlSlTYH5L2H/wbrcU/Z8Wnl7+fTTOYxt5jsio+zSxxu/UO7e+qgp3Zg5oBK9/H5aqxfsf7l/Q30JtY/ef2LjRgMuKYgPCJ3xhjsAlE46CCSK0jmsXBNvQpaUWq5AdvhNDKaai+FRCoF6+5hzVTLTea1mr8Q1gC8LdfbR+3kjAxGUub7bMAKx/tYrx1kuY+eWtl2c9a+l0+FpdgMTBrWb+jzn7bGRfx+D5B7iynRgVJlFQLz4izRwlObZDfGKTPzvIouaWOrnWOYAHA8FFTQ7pRiEWL8C2C9tsrkepX8ZIDamC4brNFcrKrLTmFVzfTvZw2x3fXr50y1sOw9fL0xOd+ELwK9lNxSBb0UmHRGcpnclCegr4PTjFHvOMgUocXrugCWTFRiNLntoyBRJfkBfK9o8e/AlwitJblu2yV1q6QmVgupw+tG6jgEqkEb+mQHSWQjuAZOiYOmMCwS7iF5GbMS6o0OHq6Z0LSxkXcf/hv2TnrMtB5mnU5uMBlYFCtT4RaNyWidK+juiSyGLi8DX+NKGN4/li5P/afFoWwOAzJkarJTB0SfK54OZPMwvytOuqX+ne+2pleOl1zF6Q9ozD+T09whSgWCgmIpExZkNXDbOGZiUB60OQvaIoq89pFQjYhTyd64LtnT1mPP0iZymAM/55t7UD/zY+kw2V0GTubu1sVcyw+KDPczmR2q1qcZmZX7JZGYxNPTIIxckRwy6+PzJm3nkM+Jj584gqJ+1+qUIwbN+/vy/2Rb7BAw0TI4JxNbj1MWLkZJiWQMG4Y8cYAaizimAZS+Bsx8zu72tw2gtKJbbAfyodCddu9ke3J6YYuMm+96aJpM9Blmzlv85Mv9+ebua+EwqLWGa5s7NzfT1bRyDPR8bIs6Xo1emoc8vozbD8z2yGQ6Onz9RES8WS0EdJgLkOaQ08QrogIX3mgOvQXfk2SEW7gQkbPJsgSnrSNY4WT6lrFgwH60qdQVXfm9apG8hq6b5HfzCExgXCkM2DLwKRExgrVTQjKQc1p7ABbwTAZBhYCWANNjobBFwZlREa6dhzSp/t7DfzPHr/ocGueJ3io3XrV93jzjSjlWQ2m0L9q7R8jPzmBXWpPx0F+5SR8AmF6xVP3dDfRmCaCfWwKiE1FGA4RXAs6JQHgiFahyGBMr4EwFxchLrpySHCqAkx6UJrMhchApXKftOVJ4eOBns9SPjXbFNIfbYqU7FaCIztFmMs0HOus/dktslfWn3vOxPj273mI2Gfcedq1if58fp+0hfUOf/+wRGK5iYJ4QC21vkqfVQAElERRj8vCXiHXapqfaKxZQMlVBUaxN4ptMVEQI68Hv//lUv3EE5qbkfHuxjPdMy6ggVQIodtBfgEIEv/WWwu8AxxxzUOvcYBBjYDGTDf9csiVQ5BGs6I+m5aW3+HfgyzBVYHM/Z16IABsSJElurTkIJikFNzZYzqShkItIefQ6B4ZConpJQ5RQNZSw3DlvNU4bJ3n34b/R6kOxW7C2MlUZ60u3H+2aztcy4aH94goT0yMkPKpcK+ZXdLfvrAe6e9y3au28u+TEjo4Hp/FknpuvDneF3uVx+bRtqsJj6Gyv1+rpk64/oDHfBPUnT7pmHgIuWig3BsgiQSN4wUEhaC55IimUZMlIeoRLoAgEpUvmoFqspMcUG4XThsrjHRMdvaPZPO9dutljtmwifjkUJqi2GveHojfIti7P4+FxOdvM2kdMu1vXO9xVJwM82D/JNK3+OfHxE7X6f884kRSD4zfOu+C0NMJJiRlUdyMiCjxtYJ2S4AgUBh2dB4nnKVfEcYahNzUx9K8w4+Qmsb475Ip3RZXV2f76qcls+zhxsjEfzU7jwbqe80u+aDe7RzE9P339REa8WS+0T7bZ4cmyJ1Axrw/AsDGAc+eco0AgnXAMBjojuhijcS5hO3SpUyYiyK8f1IsruvJ79YIKgsR18whvXVqpIM+JkmDPEUKWseQRdDG5OOGsY5JoTKS3SHBsEGNUEaq8iBw55T1gInUS93sP/+3d0l6pZdR417/UL2Wsy/l8ccBceF4VV8dqtlte5VvZdenBsgdR4bqVWRZC4Vyrrztr5U0le3hROl8VbLF8XLeCnT/SPPBbfWS5+IDG/DPLBXGgPSOEPhQ4R8Agaqu0FsngpgomKGIgbiXSRCGvKdeJgEqezcEjlESD0+6smu5MVXf0sdlq3odidnJY5cYKb59WGSJ78fgo2GRyuCxKOzVtHO8yyzhBbtirDZq75vjluHpImwrzOfHxE8vFH8svaUie75TciLU6IomoUMoGipPtRZFiKdVCMumCwNBx8MfJ2m0L/ADVIrSXGKm/wp5UN1WL5Xw86M4e7kjM19h+hNu5+6Uarbrzyd2lOhlOx7WXHum4xaG7+fqJiHj7RkBAlAgbBPIx+QNNJQo4Oh044kyAm2fQhZYa5q1Mhus81RGUoqeUYf/Dp4Nd0ZXfqxaQngRd+fwFfmO5YJ5jLUWgOtn9nEZpHfgeboyNlCczhSy4JQaOHzksGZPMsWS6vaDMELiQtAfSvvvw37oLmpvNjzizzl+y3X6u7u8K1aJ7GnRbzexL7ZBb9aez8zx/KLkdDXgvm+FJVwuVnmKX2XNlHu75ZBcuMzJulSfFTdu3SngQX64vFzy1XHxAY75ZLvhnrw/ihCNrlNKIekNB2bhgIfYVdV4lE4JJZAwT7ixUkuAVVDuVRKcH20GZSNto5SXsi6uu2p/sOvfUGZgXIOBa3GXCuTUcRJlvPMXCtlhr7uadneao33nwOXtQInd/1uRpnFYuPic+fuZ6ff57vQCt4ZKnCFoNjSmFSOZogQWNWlqVbGqaMmgUIqZQx020iHFvnRdaYh1lpMn+9n+BJ+XcVi/WJtYAx/X1jndG2/LLBg/RStVp6XE0ndTo89P++HyiB/lQU18/kRFvuwsshFQq8ugDiEEMtpBbS0KUmhmcrP2LyabTICRd0JZSQqB3NFYOCoyPP5yMeUVXfqdeCIK1VteNRt1cL5KnuUUtNE3uiZtkDNMi5zjlHC5KQ1X0QD0VnRIInJbFXBjsNEIJSqDWsZR68e7Df1MvxpYPL7lsub1k7cOluM/d1XLU5vvH4nnvuvqiT2M+Ws8fwr5eXrx4mT3ekXIxhwfyvF9tbWXXCMcDLk/LldW8yMaDWsW1ph9aLz6gMf/MegGnJD2Kwr3OPQmceIGMdsyogBU4bbAdIKM8Y5xpBH5C0JhsBeCloAqBGk7b4VaWhqdnW2wdeq49pp1t+7HZn1Zzi/aRiOyog6fd7GN/vp/tSr3WZelyfjHNTluzxexpxiarYdpo1OfEx59QLwSVwnkLhQIDKahlxie3HLGnLgJ/XMqTKp1QydMbieBEgG8lUPNBkVCMMMSZ+Ss8CeimejG2w8mlbXvbVWieHp9D8cUXhdyN/KaA7/POXh5euicxy+az66+fyIg36wWGfvGBJ3eMsTBURXDqxoGESp4riD1yRpnIpIbUo8macxKSJyRi5pUIICF/+LzM9K78Tr3gyeDllZvm3jrRyCWL8YgKimCabCmGokvKmY8u2SUEiAW2SjvrUbJVJbzLJs+rMSGZkJLMR0nbs/Hdh/+mXCxOzVZ2XOnL1ng5jo1lo3E+bp/6uNe6P9Vys9W5wqa5abP42N7nINLnxQYx5fzdguEmO7UuaMa3hcmeXY6zsSINPevVW2Z+95Hl4gMa888sFwTCTRCBpQpgrY2RUDNcUJIIIpN9M0JM7pcjTnHiKxQTFhGI3WB9slMYS3tScauMrfbPj+fzw0MotZusVjM7ZVX2odW4rIqsmD37GS4ez9vBYjTPPlb2i7uwa48gVyrVOCqmlYvPiY+fP9FIJNtnaijTUJwNlGtP4R+oVZVsJGekTHMXAmNmAw7udW2B4ZEyrBVlmjAv/3b3LpZi1n1uZfn6RZhtr50dzU7tpwMc9HFVqAwOGd/bMTpoNXf48PUTEfH2vW4adCRWS2K5RJproDuOmAMOkg2UCQ2SQwc44hSFFIPagRniXnAWEUH+R2sCrujK71UL+HjFrtuCBt+6mZhWAcqX9ogQ4VyycxRzySTyxANx/7pGiCZbyOOoKChmQQjjBM4/eEIc4COlXLz78N+Ui1mpfRkuWKY2H7hNrSIfUCY3eWCVeru8n592j8NpLxsK+LmR9yqqcXuhl9P6qTtyFO3PY7KZz9rNx1lnpnPVjpq9rMLZiGP3+nKRvlvNBzTmm+Xik3er4ZpaY6NAWkbtiQjBC+oMOGnFoSAgcELMU2led+7QOnpQORDIOnlIiCEmdf3A5tyab3Blu5l25gjnwnJ7RJXVk+qi1vHufP/kBpM6bnf00rafyOrlvCxmm43ZUty1n2npoZ1WLj4nPn6mu/jvHcekdtwxiQXyQUQmRHSYBqccDl6lrewFU8gsFdAxTPAgkwdlJ3OibXAY+kf87erFrJ4v7zedy8P0qfNkJu3M42N+s9iGQf1wv3lpHE+ddv65bLOVbfHrJzLi7S3LkIVaLiJPnqME+ZAsIiJI0Ui0ZCIm0/mSO30EI588QFpwhLiyUDko5JAzP3okxxVd+Z16IVEyZkX++b//8eU1Nr/8Svg/vixj3Ab4Hv3z/wAMTU/T\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FA_VP4DRn2GzXFhi4MZ1AXKyTRj2b7U8oGibUBVYGi8go&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FAlg2nCclufDemoVfpwt1zCwdy7h-xG8LZsYopD4-2C2L&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDP-6aWA_xa2wFJCdQ_aWuWSTZSP6VM26TgqSPrQnDeRj&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FBZv7xagkAaEb6PY68eE8PahUldLf5yKdMRwQx6dl8hEA&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCpRuhBNr4ne-d_4u2s948-ZoVAr6NXpf8UacrRwGVuLO&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FC2eh48vTo1_xjuJB-YkE8ob8XdIVDT9lbotDs6x_1BO4u_9T69ZxrRPeH5TRNzBNNQ%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FD78qN2ofdDnb_IrMjJe6HGxDwUbEe1xUWDIZyYRQeRpahsM_1-66e_4zU4z_enS1cw%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FDgOfiHTiZhjmskaow5QyhDQK81mQ-ASioJ0mbzNHSrJ5QF8C3Mjwyg7LF5i4rq41jQ%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FAe7OOF9Dla0JwgzWJyt6dkw4bBMjF7qHjFSIyP2t1dnI&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FD_VcDdh-8Y-gtucIwrsZktXelHStVPep69-KM_zguQlbUCbDwOj7O7onAeu3wkjOKQ%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FB-SdmS_mmoID6Y_tliCuw-GIdNduJxcPiFj13Jy3-GJoziyg4TNKs8ybGV5a3N0buA%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FD3foBl4pvJc1a4SgYzP07sNJHIrup2jf38K70wJ6xq23DYBZyLCH7mZ0LvnTnBTy5w%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FA3fWo3S2RU5dz48TGGHHjfliNnFCJZ1PNgginqoDch0Z&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FC0-OxVr6SLMBFgIwj9Yi1PBZsZI3qbqbcAyHhxZatTg0&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FC2E7TIYxY2nUHrlHfM0ZT8uEEQxDjWHF9yiM866mv9XH1c-DthBO57PDJ4sKHGVFLw%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDLiIYP1X1SgHaZQ7IhZd8l2JfR5G5uPnS5Mx-ERFqiGe%2FDJUhPiW1l-6n7K55XKDQZgeg_8M0-J0v7V2pvHtt5Nt6%2FC-FzKf9SHcsxEuUMuhz3Nb2iPkuuVyakhFgZHyoNMCpl%2FCs7s-W93EGPjPmdKJ75BhIjDi125MNE149dKC-JI5C6M&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDKp-BVICj_0S13oN4NPnpJoTDpJ-ZLlN6stZMy-JDoVO%2FCfu34wWpdLmk--QBnjtFQlzfgsdOSUxT0WSe4av0GLfX&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDv_KRgqbByPrkpkIwe3ywS6M1phYPvC1ziSO4bV2jkhv%2FCjV4aROlTTB_j_b0fIk6cnNjhqBD9Ux2ngcC7e5q1IegLQGzWZWnvHav_2g48jt8v03XId3_7PvmEFjUGZEdURk%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDLiIYP1X1SgHaZQ7IhZd8l2JfR5G5uPnS5Mx-ERFqiGe%2FDJXeNyj9s8cipSdCaX1IHfJeGhuFbEQpplT_tGq2igdO&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDtvBFEF8A9AZqWP4bSwjc7Nmhlxi_qMBdo5nSPUw6kyW%2FCg6tn4S8aJ7fMocuhtPcdK-eOSYcDjaV22eQ8BRfCp3tuTq_9UwuRKSCczB6t3i_xijmBmpvEDVzQoWsP8DQeTs%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDomi_UlOE2fCK4uh1SBLo8hpUmjEzJjgkiKYV2TcnvUr%2FCsVGRa8itZzMzH19HCCF_4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDqafKe03Mqt5ThsHYr1g0p8M3GQhkjK3XWuwXx3v7OK8%2FCg3Blmw1-qCzAUZBMdEDJFcW_URPAYKvBpZklymCvGct3e1u7PeW9JDIV84zlXImeL5jtezl2iRHjFrSdRG1_fY%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDibgjzSbVspePxQXeFYdF67thdrD1LCcbzOYUx6lACAq%2FCib5gzBAHSo4SvzFuBEKB3bCZwFyucU9z9xi5hqmOeuMHnYd7AwE2HFB1_7yupsbItNewv1HkHIpmF4i_KIcRkY%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDo6lUXRA5qY6asVSAhlxSWv1pTQpDI_v-dVt43_RPt1v%2FCnxPRAiIZ7RioifNoNNywsWZ1VRLxKBlpyI4kBkPFQSuBmsNmFN2aHCEn41P4xRz0l5sDju4zwli82N9lVMRamE%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDlMCHurTzOkWTWajS-QQCrnse_MvLrYNwxTSCXHbAIsF%2FClGSzgn4-Km_crKI7O0-BjO4IMSHumxtQgkVAeD1XNCd8f8iSn9okMxUhc30uyi2rmlSPQlTl9BJT8lYpeya6wU%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=15&limit=10\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15421\"\n            },\n            \"content\": \"eJzVW2dvG8t6/i8Crr/EvJpeDBgBq1gk9iIxCIip5LKXJSny4Pz3vPRJco3AFiXYsnNgAZZYZnfe8pSZ2T9ukjQsdjef/uOPG7NMk0Oy3e9Gu9Ske3jxxs2DWd58vNkl53DziRL18catFouwTEeJhw/8cbPeJgeThtE27Fb7rYNP3TDOheRYkk+GM2IcsogEJKUX3lJFjDSISYIIQ9SaYBU21EROqGQ+YmK4ZwbeswxLuPJ6b+eJe6fh//x4szSLy6D5ndxlBpoW75rT5sLXqpLnJpVpIcGEP9SLmGlfy2eqFZ4XD3BX4TmJMHv4vtsGmL6HIQjCMoPgB3ex+sTIJ4b/DaFPCMHn/+f2IWo/O0CLlU9icvUOFskijNLT+jJZs15DTE2arJa3K5eGNLNLYRoL+FhM5pdPTNJ0vft0e+tXx+V8ZXzY/tMnu9k/T2bpw/M/t/vby5+3PPIoBJZSMWUlDlhhrLEVXnnHNY2KOM+IM1x7JzlSKGKBkTEyuKAQI7dCqBA4JrfLXbkyC4+1pWnfrbunJeol7U2ss3Z7O0xpCOnjOn88EJcWVGP0OFwf9wzpZBhyk/J+nkvLVm2k8PNmtzR33SqeZ2w5Pxn/gxbg59/3if/8vzH/cJniJeuf35LzDzDf9WqXXGL22aSpcZNLF3yYmN3k84d5skjSz+iDWy3TS29c4vz5qyj/g5S+jvMHiGrYjv7PbV167DO02IcJvK48BNY4ErzQyofIMbfCRSKixtxF+mERfGL+upA3qfmQzpaHzwfyIaRm/Blp+CYLFBmqOZMxWCGChzQqhggV/tJXJp1Aoi9p/HRbXLrtaQ1lfJtf+XCb3e3Cws5Ptzm62NWryGXHbTxeVOhYFA60mzw2C1XWXReyh8Ownez2uaTURreFu3aCcqtiq0o65m5z/9Dr3BvWPFWz/Q1ed42th/5GNgu2qsVt4T6pPDXxI+6My2bYkpXJ0Ks5qcY2v+P75rLDH54zxXZpk9yF20K1N2kmA8iqWMoa54+1Qms4DuORekCZKjrIPlkfymnK66m4zWdK51rUnbLbPRf3vYf95EzrliTN2X7fP5nZpDQelk+r+kN+Pb99Y9v/K+iX0EHYL9A4MYSLS1cLaFFLoIWxFjp6SSnhWiGDUHCcc++NssIIZL2jFkdIjYnRORWwVRZpGOu/R/7ShHA1z+GPV+RyGw7JDsrs5hPcsNKUcYG5QFTyPz++AtaJYG+D9UCDQ8i5QA32DrnAHQvKSUYVi9hKbj3BEQnNpZLogg5OGcc9NoExTtUVWP/h4b+C9bin7DhY+/vFLJNp5ZbTtNSan+N45xud3nMXDTqBmQO6u4+Pr4Z1chXWf0KAXoR18s6wDgXGvYVSIkJAIVuDCJSzxYSSGKW00gIqOSgy7KEaqaQCMJ97FyUxmqArsO4aG6babrqo1fyZsDrA22qza2kn52Q0kTI/ZCNWON7Hh9pBlodo0M52mvPOvRwUVmI7Mtdg/Q05/1WwDi32BdYhqpgSHShVViGqsbNEC0/tpbsxDi/DulfRUQ350M4xTABwfLCRe0IpFiHG/wewXltncv1KfjpCHUxXdVZvLtfVVbewrmaG9/O62KXDh1OmWlj1G7dvbM4XwReBXjKKatBLgUlnJJcImo5Ez4PTjFEQJNEroQVAZATVFVBklGHhFDSqJN8B31dE/BvgS4TWkpBXga96q6QmVgup4dpIahwC1aANPZLBIBuZwpwSB6EwLBLuuTOMWQl8owMIsQD9e01S/+jwX2HvtM9MuzHvdnOj6ciiWJkJt6xPJ5tcQfeeyXLs8jLwDa6E8X3r7jwYDpaHsjmMyJipaaoOiD5WPB3J5mFRLE17d8Oi77Vnn38iTv+EYP5OnI6IM0EMsI201HiQhgC7hGljsTYENIcWESrWcRxBh0vjjObRiahs9EBN13DaHPgp39yD+lkc7w7T9DxyMlfclHJtPyoxPMxkUlR9mGVkVu5XRGISnwejMHElcshsjo/b4xWcfp/6gCv+KlRXf2l1yhGjGlkMTA9ggl0ImGjwOA6MXMT4ZVC3UVIiGcOGIU8cQI1FHNMASl8DzITfD+r5dnTL3Ug2Cr1Zryg70+cntsy4RdpHM9desXHmtMMDXx4utsXbwmFUa483NndqbmfrWeUY6OnYEQ94PXlqHvL4nHQazPbJdDY53L4jRLzIFgIS5gK0OfQ08YqowIWH5oBswe8EQJwJFyJyViBjnbaOgLW1CASahS6z32GLV6TyW2xxeQ+hV7HFm1dgAuNKYYAt0GU0guXG2ikhGVFYaw+ABXgmg6BCQCTA9FggNsAMZlSEufNwTar/6PD/ootC9THUT1O9Uy5Zd3zePOJKOVbD3WRfssUW9Gd3lN5tSDL2jVdTAL0u1X88QC9SAH1fCkCaU4k01QYAh/mL71OUgwnVIFOsY0rGL14waA7MQJi3niIF/8FcJCL8CgW0Co0GP5mVbtU7FdMc70qV3kyAIjpFm8k0G3Q+bPXu2Drrn/uPx4fZyfWX82nSb6Tt0nCfT65I9bfk/FevwHAVIaCEWIi94YggjQiJoBiJ8zFi/TKqc6u9YgFBWqiiQMfg/IyJCgyV9eD3fz+qv3EF5k3N+SL4Gu+ZllFBqwRQ7KC/AAoRvOothdcAjjnmoNa5wSDGtKLSSFDhHofIo8HuO+D7ioh/A3wZpkpq8TrwFeht4CvAhgRJmAVpAMUkpeDGBstBilFEHFIeKW0YgAu+LBeFKIE1lLDcOWhgfG2d5IeH/0qrj0W6ZB1lqjI+rNx+kjadr2VCo/PkClPTJyS0VK4d82ua7rubke4d9+1aJ+/OOZHSZPScTBe5xfpQLPTPrdVg11SFVujuXq/V2VWg/gnBfBGo2fsCtRUBZiERptSAj3TcicB1YMpiiljgxEh8WdV3SCLvGENYex4jBefKIlTetaXyWGSiq1OazfP+uZc9Zssm4qdDYYpq62Q4Fv1Rtn1+TMbH1Xw77xwx7e1c/1CsTkd4tB/Ia1r9ferjF2p1COEXWJcUg+M3zrvgtDTCSYkZsLsREQV+bWGdkuAIEIMGQwUSz1OuwGcxjI3XxFD8+2H9bWI9PeRKxZLK6uxwM2gy2zlOnawvJvPnZLR5yPkVX3aavaOYnQa374gRL/IF9AEigiMFQs0pjZ0gNgZw7pxzFIjhCsdgIBnRxRiNcxdsh5Q6ZSLSmn+HL16Rym/xBRUECfoqvpDkbXShsAErIgOUKkKWMQXIFS+TEw6UnCQaJJu3SHBsEGNUEaq8iBw55b30X4jxJbr44eG/3i3t37WNStLh+eFcxrqcz5dGzIXHdWl9rGZ75XW+nd3cNSxriArX7cyqEAqn2sOmu1HeVLKHJ6XzVcGWq9amHeyiRfOA3+pn0sVPCObvpAvFI1YBKi4wbL3lIRoLrIEYJxwkP7BJNNFpeDUyKHJsjbVWg9Kh6lL88trSTm+uqiltNdvN+1DKTg/rXKLwbrDOENmPx5Zg0+nhvLxL1ax+LGZWcYrcuF8bNdNm8nRcN7LXdlbfpT5+IV3AL1+WdoIWRF02Yq2OwMxUKGUDxUF6kBvsCltIJl0QWGkNX2aBQdoYBdUitJcYKfN3Y4vVIhn15o0iifka209wJ3e/UpN1bzEtnqvT8SypPfVJ1y0Pve3tO0LEyxsBAVEibBDIx8sXNNjjgKFVAr+sloKbZ5BCSw14YHlZrvNUR1CKnlKGASG+wxavSOW32IIoMI6v2wjA/I10wTzHWopANSEo0CitA9/DDUAC5TIEZ8EtMeckclgyJhmoSkGioMwQmIi5Qhc/PPzX7oLm5osjzmzy52xvmHvwxUK15AajXruZfaodcuvhbH5a5A93LqUB72UzDHS1UOkrdp4/Vhbhnk/TcJ6TpF2elrYd377Do/j0errgV+niJwTzRbrg70sX5HJgiETFDZhZaxH8C5g44D2NI6gcUEJSQTcAZjGLkFZMgu2VzqEgOY3sCl2Ep7AvrXtq/2w3uUF3ZJ4AATeimAmn9ngUZb4+iIVdqdZMF91UczTsNnzOHpTI3Z80GSTX6OJ96uMX0gU07xe+AK3hOAJTB84uSiEuZ7TAgkYtrUKWX1s0ChFT452JFojeW+eFllhHCQYwBsn+bnyxMbEGcPywSXl3sis/bfEYrdUDvWtNZtMafRzsj4/P9CAbNXX7jhjxsrvAQkBrRB59ADGIwRZya0mIUjODJRcuSlCMICRd0JZSQiA7GisHBOMj899bjbqeym/whSBYa/W61ag384UHOopaaHrZEzeXNUyLnOOUc5iUBlb0gHoqOiUQOC2LuTDYaYSIcsB3nF3hix8e/iu+SCwfn3PZcmfFOodzaZ8r1nLU5ofH0mnvevqsnxM+2SwaYf9QXj55mT0WSbmUwyN52q93tpLWw/GAy7NyZb0osWRUq7j27KfyxU8I5u/kC3Y5oRYNE54hsBWEMmZAyRATnKTOuOANipziiL03giESI7+UqFGKWkPjFb6w8m78/GhL7UPfdRLa3XVazeGsmlt2jkRkJ10862Vbw8V+nt712+eVy/nlLDtrz5fzwZxN1+Nrq1HvUx+/gS8ElcJdzlBZDEhBLTP+suWIPXUR8Me9zBfBCRXB/BHBiQDfSlywoEgoRhjqzNC/G18kdjw9d2x/tw7N59ZjKD35kpDpxG8L+D7v7Lnx1HsW82w+u7l9R4x4kS8w5MUHftkxxsJQFYmDPFFwFtQ57JEzykQmNbTepakcCc5rjplXF8uO0Xf44hWp/AZf8MviJcfvctDIYY4kUUERTKHRFYruQmc+OiMBKRAGW6Wd9Ujyy2FUYi3IYxMoFchK+9dS6At08cPDf0UXy+dmO5tUhrKdrJJYX9Xrp+NuMMT99v1zLTdfnypslps1S63OPgeVvijViSnni0uGm+y5fUZzvitM9+x8nCeK1PW8/9A2i+LPpIufEMzfSRdQlKBfDZQo6FkvPJdMUSFJkMZab8Jlq05gqwgHS+0vdy3grqNn1AHNAN68TBftMrbaP7ZOp0Yj3HWarFYzqbIq22jXz+sSK2VPfo5Lx9NutJwssq3KflkMaWcCt1WpxknpGl28T338+oNGAlPltHaMI2qMvqxZUApqVTkijZHymrsQGDPwhcF9ebbA8EgZ1ooyTZiXf7u9i5WY9x7bWb55EmbX72Qn8+fO4ACDttaFyuiQ8f2U0VG7meLD7TtCxMt73TToSKyWxHKJNNeA7iCqOMCBlzwSCvYbEuCIU1RTAdyBGeJecBYRQf57zwS8IpXfYgu4PBj/17kL9cZnArQKQF/aI0KEcxHwi7mgsL54IO4dih7uzjuNo6KgmAUhjBO4/+AJcZFdO5f6w8N/RRfzu855vGSZ2mLktrWKbKBMbtpglYdOeb94TlvjWT8bCvixnvcqqqSz1KvZw3Nv4ijanxKyXcw7zda8O9e5alfNn9bhZMSx93q6EFfp4icE80W6EO+81y0vT8JcTnAwYRkyxlIH1QwuwxoFt22D0IzBu0bQSDiCefuAIbyMUKjiq88PbE/txRZXdttZd4FwLqx2R1RZD1QPtY/F0/3AjaYPuNPVK9sZkPXTaVXKNuvzlSh2Huldo3ONLt6nPn6lu1B/PW1ApXbcMYkF8kFEJkR0mAanHA5ecXGFL4hnlgpAGCZ4kD44cjkTbYPDkB/xt+OL+UO+vN92z43ZoDsw006m1cpvl7swejjcb5/qx+duJ/9YttnKrnT7jhjxIl9EZIHLBZhtcBA62stDRAQp6BItmYgA9vRyVIpg5EEmSsER4soCc1CPwXrg7/HF9VR+gy8kuqxZkT//8+PNl9qEt9DHm1WMu3D5nf/5X3Mnrag=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDLiIYP1X1SgHaZQ7IhZd8l2JfR5G5uPnS5Mx-ERFqiGe%2FDJUhPiW1l-6n7K55XKDQZgeg_8M0-J0v7V2pvHtt5Nt6%2FC-FzKf9SHcsxEuUMuhz3Nb2iPkuuVyakhFgZHyoNMCpl%2FCs7s-W93EGPjPmdKJ75BhIjDi125MNE149dKC-JI5C6M&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDKp-BVICj_0S13oN4NPnpJoTDpJ-ZLlN6stZMy-JDoVO%2FCfu34wWpdLmk--QBnjtFQlzfgsdOSUxT0WSe4av0GLfX&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDv_KRgqbByPrkpkIwe3ywS6M1phYPvC1ziSO4bV2jkhv%2FCjV4aROlTTB_j_b0fIk6cnNjhqBD9Ux2ngcC7e5q1IegLQGzWZWnvHav_2g48jt8v03XId3_7PvmEFjUGZEdURk%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDLiIYP1X1SgHaZQ7IhZd8l2JfR5G5uPnS5Mx-ERFqiGe%2FDJXeNyj9s8cipSdCaX1IHfJeGhuFbEQpplT_tGq2igdO&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDtvBFEF8A9AZqWP4bSwjc7Nmhlxi_qMBdo5nSPUw6kyW%2FCg6tn4S8aJ7fMocuhtPcdK-eOSYcDjaV22eQ8BRfCp3tuTq_9UwuRKSCczB6t3i_xijmBmpvEDVzQoWsP8DQeTs%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDomi_UlOE2fCK4uh1SBLo8hpUmjEzJjgkiKYV2TcnvUr%2FCsVGRa8itZzMzH19HCCF_4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDqafKe03Mqt5ThsHYr1g0p8M3GQhkjK3XWuwXx3v7OK8%2FCg3Blmw1-qCzAUZBMdEDJFcW_URPAYKvBpZklymCvGct3e1u7PeW9JDIV84zlXImeL5jtezl2iRHjFrSdRG1_fY%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDibgjzSbVspePxQXeFYdF67thdrD1LCcbzOYUx6lACAq%2FCib5gzBAHSo4SvzFuBEKB3bCZwFyucU9z9xi5hqmOeuMHnYd7AwE2HFB1_7yupsbItNewv1HkHIpmF4i_KIcRkY%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDo6lUXRA5qY6asVSAhlxSWv1pTQpDI_v-dVt43_RPt1v%2FCnxPRAiIZ7RioifNoNNywsWZ1VRLxKBlpyI4kBkPFQSuBmsNmFN2aHCEn41P4xRz0l5sDju4zwli82N9lVMRamE%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDlMCHurTzOkWTWajS-QQCrnse_MvLrYNwxTSCXHbAIsF%2FClGSzgn4-Km_crKI7O0-BjO4IMSHumxtQgkVAeD1XNCd8f8iSn9okMxUhc30uyi2rmlSPQlTl9BJT8lYpeya6wU%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=0&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"4067\"\n            },\n            \"content\": \"eJzFlmtvGskShv8L0vJl7dD3CxI6wibGcYiDARPbR0eoL9UwtpnBzIBNovz3rfHeoqPd2FayGzQSM9DT3fXWW0/1p0ZWwbJstP/7qeHyKttm6005KytXbfDHRrgFlzf2GmX2ERptyjhle41QLJeQV7Ms4pBPjdU627oKZmsoi8064LiGkFJpSTVrS001EG4IjYITLYSkQVprqHOM22DxXpOUiLZWKi4JIwRkTIYD5dGDw7VXG3+bhX9o+s97jdwt60m7s+lQ9EY563+8OFpk4t0V7V683U1G18zrc1P0M39+ML3sZ2Ze4K7gIUsYPb4f1oDhR5yCEar3CV50Qk1b0DbVPxPSJgTH/759VO17C7QsYpayJ3ewzJYwq3arOli3WqGmrsqKvFWECqr9ssIwljgsZbf1iEVVrcp2qxWL+/y2cBHWr2JW3rzauTzCw6v1plU/tkAz6qONjEhLPA9EmeTByCi148kxwWwQ3CWgwWhDrFAaQ9OOkMi0MrSllAGQ1Lfy8vjNDVy8zd2ov5rscnKeje7O3DkP79lD//Q6P705XuTd/W5v+rZKWVf04126OsoGp2l7UjnVd/lsNZy8vUqqknC56Vf3V9P7n3gPr/9sstj5Q/NmHWKd9c5Lct7EeFdFmdWadVxVubCoq6C5cOWi07zNllnVIc1Q5FVdG7XOnS9U/okdfalzE1WF9ez/tlVXWeexyJoL/McSzHo02oLxwZJAfPBoAE+IAa0kby4hZu7XpaKrXLO6ybedLWtC5eYdy4TloBRnGoI2STnFdDLCWsxIJFBXlqsWmOo6ke3W6zysdys0cuuwiNDqliUs/e2udcCX5ekJCd35iM6Xb/hc9bZ8kl0Meydisup1t9urUVZuDrKjEWm9sIj+DKDeBoZQo2bhmFR1jQhvtNSGUSoS50qRgE4BR6NywRpBKJCQCEspcp5Y4sxpYbzQsS6jUAf428yPlsbVosSHZ+iyhm1WYtKQeMIay4XQ6F38qM97z8CkIC9jpPIQcYUUIgXADSnHNX4nKQL11gRjJO5QJpFsoMJ5RT1hQQiMmqio5ROM/Obpv2Dk7Zzlh+F2k3qwLKZpdV/Rj4f3cacX+w99M7gqL4tVT+yzQzb4joz8DgL9SEZGEyW6yGvGeLQ0UiG5pzRGQSXzgXAmPE3WJa1DMFQgI7kTJLooldBePsHI80UxP15nXbjubgfZ694pL7eTzeQSzMM4n+0u3/A3g3e77fGiP/DucFjM8vXk5kQU1JZ6kqXDpxj5gpz/W4wU5BGQAF4H6b2OjiWQnCAVYlDRC2yh0T8BSHSVJMIIFVJMkEiUjDgFXAUwJhHzjwCy1x9l5KB4fXbCxq5/N3h3Ph44MdyddKd3dDVx/hSmd3rY8ydWtV5Ybl+lafRBBUaClBZLBvs1EAGgI5XGYMMhnmieEnAeNNYNV9JQaYXn3AqHdWT+hqbPEPGvaGoVM0Y8i6ZSvZCmwFN0XiQFDovLYds0UjqHhw5DjVSAJWgZooRzF7HDJgMGiBOBW2JDjE/R9Fun/5OmveG+ch+6swfH7o9ODuPZzH3YfBhPrsZDNX3H1GR+Nx6uz/IejK6/J02/XaAfSVNm0F8gvRboMOo8cYCg1IhKtF9wnAWmEf4sglBKAWHUQVRIWDwuJy71EzS90OxsPD6ozt8fbJbHcizzxdHNUh3f7GYDJ5eryWI6uB6cDrtyiYeI6nI3zqblVL7vXk/Yhbiez79O05fk/N+iqVSPNPWUoSsidlXDja9FtCrKYIBFisqlr9MUojEKjeIkSzowxwPlifuAR7cYCRU/nqYvLLev0pTFZLGTRxXx8GnwVO6IJaAQoFqj2Zjn1iFpkZ48agJBeDQd1wybvBdGkr+h6TNE/MuzqSFCs8//22s8mqLR5nuNIqUS8JZ8/gWJLuHK\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=3&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"4233\"\n            },\n            \"content\": \"eJzNl/tv4kgSx/8XpOWXC0O/H5HQCgJJIAkhhJBMVivUj+pgXgbbkITR/O/Xnt27He3d5qGZ2TvJP9hWu7rqW1WfLn+qJAUs88rhL58qZlUkuyTb5pO8MMU2vqy4BZhV5aCSJ3uoHGLEDiouXS5hVUwSHxd8qqyzZGcKmGSQp9vMxVUVxrmQHEtyqCwnRoIAi3QA4QhyyjLilTRceR1ICECQVIIo41FgnnlkndccCSt1EHHn9dYuEveDzH8+qKzMsjTaut/JJ/Mwb5qOFYOPQkFHDcz0ZuHPA38+8xfDx6sn4Rdq2mlGr+ApCTH6+L3LIIbvowmCsKyheOERVocMH2L9D4QOEYrr/+V+VO17C7RMfRKSVz1YJkuYFM/rMlizXkdNTZGkq3rqCihqeRHDWMZlIVmUK6ZFsc4P63WfPq4WqfGQffBJPv/wbFYenj5k23r5WJecuOAw8gG4NARRL8BZqbz3isdovBTMCmkkYl547JhEQTNHlWfBBerrIgoNHEN9lZ9253B3tjLDk/XoeYVukuFmNDhOR7WnrMtG++YNNo/3Z+NaoY/udrNkP7/a0+XD/bbJTzP78fZkrbvN/Xid3mWXm/asSefZqvkTbcfr523iG//WvFqGWGa98Z6cV2O86zRPSs0apiiMm5ZdUJ2afNqoLpJlUjRQ1aWrouyNUufGVyr/RI6/1rkaVYVs8ie3yh5rxBarTuN76Qi2DhmHguPMcyOpA6+ixpgwzG11CT4xv23kTWGqxXy1a+xIFQrz0OBWOAtMekEJgBaWa20D8cQIxylmZV+ZYhoTXabxsN5Zuex5Hcu4fpR6qDfzHJZ28Vxv0WXe7yHXfBjih2WXPoj2jo6Su0G7x0brdnO3ux8m+baVHA9RvX0yTFAr7Vz1yLU52Zxf3FyfGzZ47jXHG7weGduH8UYO2ranRf2d/fZHtKXPMd6SSVNDuIjPFvFgjObOE8SFBmO5CNrHxuFGYc+Ui/pxSz0oySk4wpR3HntBpFACeLT1u+Uv1R938zw+vEHEDHZJHvMb0ci00pQxqXU0qsnng7fwlKD38RS56IDEFkUIBMUEYZoQIqSP4WqkNYotpygz0WWhsQsiOBJFwkozboklr/D0m83/wdOj9XA7bfUztoKan7AtyTVTtft03MxE/24d1I1x2fDxZLw9v3wrTwl6laffQaCXePqVBz+EpxAU4hiBQgaMD8758oYYLh1SmCmOqPM0hIgGBREG1HrEnSOBEIoCqFd4avw2uXjMurf64rS/7J1e7Mn1rdlYtrhOjjeqO2jdjGck3NTg+KhG9mI1eyBnN7N8s8PnvHM7eXyZp+/J+d/GU4K+8BQUQ6I8qxi2HGlsWQQqVZT7eMxygJd5SjRxwhoZGYNCYJgaahkQrmRg1GD6v+fpO/vtRZ56pUOkJnHeYCuRQuUJHpjRJHZNrERB4zmvCEEQNBCqjQsRryoYp4mOjPwLnr5BxP/kqUKKIKbZm3jK3zufQhBaBJDCE1AiTmDal85YyoAx66iBECwJUkfkK0mCRYR7D5yBxQI5+QpPv9n8VzwlMGVqN0rx5Gm27bVqH+cdlVp157vj9kgvbFq0c/E0wa1Ltp3okdD3T9lwAKd8NOzvW/3+VaPxZs7iVzn7HYR7kbP4x3KWYmwMBsOIQ4CUihMVI9JiFBRhJp4LXLGguaRBSxeYdoQA83GABRMIkNfmVph2dnfFsDXr1RZJe3s/xg9+c7VgfI99v3Uyzo7ORl21Sc3H7hE6mzWvSGc/rfX2J0EdXxQ3F69x9ptr4Tf7fxeD+e8zLYqHlObcAaJgVZyrgGks4ohGMIr84C8zWBBflhQPQjIRd4h/SsGyWIPeE+oD+T9g8L4vzuftPb9Fg644SmdHhXb3aHM9HTfn2W1xSYct1OqftLeXV/Xv1NAvgpyD4nGcYByoUeWfVyzZOPaQOEdICDh2gFQarJXOWkq8o9jJ8ueC8tiQCORfgPwNmfgvIMeKcYH1518PKl9Kq3JIDyppCDmUt5//CfhcGfU=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=6&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"4401\"\n            },\n            \"content\": \"eJzVl2lvIkkShv8L0vBl3U3eBxJagTG2aXwAxm57tUJ5QhmqCqjCGLf6v09Uz+5OazXjQ+0eaSQkyCIVlfnGG09GfqklZUiLWvNfX2omK5OHZLMtpkVpyi08rLllMFntoFYkT6HW1AQd1FyepiErp4mHCV9qq03yYMow3YQi324czKoxzoXkWJKmlhx5jhSlHgdjA8cRaaW0EpwEF4PG0llnrYlUG2xt8Mo5ybn1WltJLLx5tbXLxP2k8F8PaplJq6BdqdbnJI++m9np6ebsvh/EyfFjdzexRwE/Tm66p3f729EwjFZmXpxN8QchwpQ9TdjTNGRj7HatFqw2PCYRVIG4bhNAFg+hCcLyA4IPvsKqyXCT4H8g1EQI5v93W6DmewuX5j6JyYsrSJM0TMv9qhLBrFagtSmTPGvkrgzlh6KEbaQwLSbLasa8LFdFs9Hw+S5b5saHzUefFIuPe5P58Phxs21Uw4ZGlEnrDWE+IKow1soQEjzyigVLmcXURqSMUdhb7T2xRlJYOZGUkkhMQwgVAie4kRUnp4vw+VNmRserq32GJsloPWRuGs5X53ftu8fBcX+Nwn5yMb99unVdf3X2aIYnqzsah4cz1PuUXo/3+Hi/C7fb/iXLi3Q26wx/oV34/HOb+Nb/NK9XW6zc0PpxL/wWvw5arPIiqfRsmbI0bl5VTn1uinmrvkzSpGyhusuzsqqnKget7zLwC+l9n4M6KB420/9bclWXLSjL+hyeI4+cVth4RK33ynpmNAvOOCWdis7W0+AT89uLvClNvVxkD60HUg+lmbUUElJaRL0H71muI7WUSi+8kIQFUXllZco5mKBKcbNxlLnNfgUWbxzmPjTaRRFSu9w3OjQtzvvItWcjPEtP6Ux0H+hV8vmy22dXq2774eFulBTbTtIboUb3eJSgTn407JOxOV4PzibjgWGX+377eo1XV8aeh+u1vOzavhaNw6dzMVh0n/gNujwVh/n9YandHVqP59ftxeamvKCjDuqcH3e3F8PGOxX075JVGwfRKhjODeECxgExjZmyBkTGlmOGVHAaERG5CEpqQ2xUUKJEI6yJxFRzUFQqo7gLDDGI9Z/I38oL3uY5DF6RiU14SAowSa2JmVaaMqawZoRw+vXgFSAnWLwN5IEpxzkBFyEFeyOMRBsF5ZoYLhgKxAYcLY/wpRGiMLTMUW5oVAACi18A+Q+H/w7ks4uYnFwld/P7tFiYfMeH+3l3+EnhdPihPU7yPkrt0/nJeNPnw546pGf3u/1MDno8YZs1w/fDN4CcvAjydxDuWZCTnwtyxqxjguoAa5M4IBeowEIJSzRHgUdkmMCIezBehCCwS6+5l4LB1gxx7gWQ213wg8nZNbqcDUaT9f7pRHdml/Toti9PFse3i+Xp4PTe5JNZ4hfnZ8uM8fRRL8IkO1r0xjfZTfsFkP+wF/5akENZfgM5HIFgBBQ0j0xCgXMRCRjJs8BCQNw8D3LrgTEYOGEgE1RKbbVVzDAdAhyxxvzdQP4+Bf0syKEfCcFRZIkzMnJjPA8UKXB7NMIKgZwT3ljPKbeBMe9AU/iXaQvztMZ/AvJXZOIPQE4YwpzjV4EcU8XeRnLHqxYRQY+oEY/c0siQ83B0aWggoT0zGkWnLPSZPmoRGaaGBey18tIhx9ELJP/h8L+TvB3kxUVPd5cG9Xezp5v+vhR+sWO2c3bfk+uT+974dH9JSuyz01cTm71I7HcQ6Flis59LbIOQ1QFWqTUyysMdwVodvfdUKLhIkGioRhYL8DN0KQ5p5IkR2jhddeiMvEDsCTJdd7gJx587Me+sTtLr9lW2RKvx4rPObuaXt3a36hs3bWcX9Gow36a30Y1Hruz09u2o+70XiP2WnP9VVK5q7BuWo5aIy8gidwLBPcZhCRevCF1ahOr26HksGzjwsYwI2jgDVCfKVywPggjrY/T2b4blN1bns/iNWqEgrZDIihiRFFZLAahESDO4CRtvnCPgUYu8Jb7CcPSaKiGpgoda/Ql+X6H4H+CXI4wV11//fVD75qFakx7U8hiLAD/F118BpgBUpA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=9&limit=1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1439\"\n            },\n            \"content\": \"eJy1lGuP2jgUhv9LpOZL6cROfImR0CqQwgw7HSgwl3a1Qr6CB3IhMUyZ0fz3ddq9VPulqrQr+UNsnxyf9/F5/RJYp4s26P/2EvDS2ZNtju26ddwd/WIg95qXQS9o7bMO+jBJUS+QVVHo0q2t8hEvQd3YE3d63ei2OjbShwUIY0IxpHFfYsWYADQWDGCDRWIQkAoiwKSkKkWcASNTQXCsDCMGwYQjDRVLFZVAYuCPro9ib+X/lP61F5S86JJmms5mY5bvOZg+bZ7vp2dH1O4JieGHxzE9XD6Ol1fneeygKq98VfqLNV69/1822stXPkUMIH0H/IArmPYR7MfoLQB90Kn4q3xP7b8GVFTKGvvDCgpb6LU7151YXteeKXe2KqNKOu3etc7LKHyYsfsuYutc3fajSFVP5b7iSjcXyra7izMvlf5y0RyjbhpxhZmQLAUxTKGIqUlihIwGMQcMUgK1ZknMOSEQa5IizBTkPMaUAKwlNioiJNUaxzgq28urnX74teSLSb06l+DWLg63gOdy1OjJw9BUw/qyuMtW5R7Uy90DK++380/iqZ5yuc7KWbK63h6LT0YuF9INx+fMsOk4e5PkfvxytGrwN/Owk9jd+uBn7jz0euuqtR2zAXeOy23ngnDL2+0g3NvCugEIZVW6zhsd58F3lN/E4+85h56qbtb/Kqsz2aDzWLj1G4ZRgKlBBksCkBYSUqGVURQbmlAFwkIry7+dpLjjoduVp8EpDrXjmwHnmEBqAFGEIwrjVGntmZOYCGWMEp2xuNv6m+7usR+9L2Vzrn0fR6NK6ShrW12I/TkaJkV7MwUy2yzgprhKNiQ/JSv7MM+naFXn2en0eWHb49COFyDKJwsLhtX7j9N4ySeH6w+3y2uO5udpdneA9YqLG313oPNcTBmJRs835HqXP+N7ML8io+px5Jj8DA7L7V22a+7dLFkMwfBmkh9nH6OfdOc/aDqBHk73hG194xE/N75dNRWEAkGMAZQIRgkTKQAMMYq54lLGhHEBlIiVUDgxiiUpoUnqF1nqc/2Z+atX/GkKd576MfFGn2zru8G/pIilLEEoxQDCFLPX33vB1x7yW72gMqbV/pO9/gGfMryI\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_get_last_uploaded.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"141\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Jt2UW8BEcGfF+jFU1m6W1NMm5DdiCK+u+tpvm/mMB8XCo/Ou6CaxQMMMVVaY57aNy7Er3ZhhecGaJIHFJZUy8ByyKhh/++a3bHZXm54Mu5Y1EQt+jtrH9Gg5piQmNzKzawhkZ1dz52p8pwjqk1+xCj8/QHnfDH+\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded%2Ffirst.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"126\"\n            },\n            \"content\": \"eJwtzEsOwiAQANC7sO/wtaScwwsQGKUFazudJhLj3XXh+iXvLQrhTQRRmLcjSHlu7Rkzkl8gz0eFHteML1iRg3P2zwNHuiNLo4xTXqurnpSxFsw4wskZpkK9tD2VTmpvlOKjLjPuKg319zpjvTYXLT5ffm0pAg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader7j.disk.yandex.net/upload-target/20240710T190233.266.utd.9hryhlqchyr0qlrcamkjieq0c-k7j.42371251\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJxLrUjMLchJVUjOzytJzSsBAC/sBgg=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded%2Fsecond.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzEsOwiAQANC7sO/wKWQo5/ACGKBosRCY+onx7sbE9Uvem+UeE3MsE7XhOD9aqT7EruwK4TI2ePk9xCfskZzW898n8n2NxJVQWqAUJ7kINWuQRsFBAbzN5W6uZiSUxdTlnPsttUe10/aLtUXEWSD7fAGhiihv\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader28g.disk.yandex.net/upload-target/20240710T190234.152.utd.a8hlv5j5sf71l5o9bhrmfpwo8-k28g.48777307\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrycgsVgCikoxUheLU5Py8FIW0zJxUAGVuCHI=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded%2Fthird.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzFsOwiAQQNG98N8BBpoC63ADKNMWq9jwUmPcu5qY+3mS+2Jrppk5tta6F8d52y83HygrXCDEssHTp0APSFSd1urvQ/V5ocpRoBaTFAdpBaoRUFhoNYAZT+U+ydn3SNhS79eo9Plo+rD9xtqi+Ybs/QGhYShq\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader32g.disk.yandex.net/upload-target/20240710T190235.209.utd.85csw71favie2unvvmi34jb8v-k32g.49282822\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrycgsVgCikoxUIM4sSlFIy8xJBQBc9ggR\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/last-uploaded?limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"3483\"\n            },\n            \"content\": \"eJy1ln1vE0cQh7+LJfxPQ7w7+27JqgJpwAUVQnhJUlXW7O5sfCR+ie+cOKB89865lNAKcCKCZNm+3dPszvxmnpmPnaqhSd3p//mxg9OmuqgWy3pUN9gsebGTzginna1OXX2gTh9gq5NmkwlNm1GVef9jZ76oLrCh0YLq2XKR+KWONsY6Ix30KUWhwduCslA03mN2NpWsoEApToLRIHNSEHLx0aGwNrmgkkAdbQ6FD54v41mVfpL5663OFCet0WZcLfJ2s2r4SFpVhV3jzbQg9i3zPgjQD4V7KMVrafsC+sr8IkRfCH7/37txSO7b+8ksV6XaeINJNaFRczVfe0Krpjc/w6qVrVRn7dq4aeZ1v9fLs8vp2QwzLbZzVZ9uX+E002p7sey1j72okpYyFBsNePDFaKGs1kJm0slniTllSsaHlALycnTKOwSJCJ4iYc9aT+TJ96b10+EpHT6b4qsn89dXU/GmenVOTTqHOT55937vZFdbMX9lj0cH1Zv08jgq97hc+azrR9PV+agcPnu7vJxd7sH5HxDfP9q5fPRip758oHb58+uyyoPPUe62LrYiDj5L2GVn5rO6aqrZdIBNg2ncZmx3jPV40D2rJlUzEN00mzZtHrdhG7RBewB767B1OUi0GP3vlLYABgDdMS/7UMASR8aqlDWQzlqqoI2WlBzm2J1QrvAfy3mWluvTm9PpxeACutTgySBRFNkWgzZxhKUPITqjSAElSNalNvGxGbN0rTD93hHu8u9rqptew1+jE2pGZ8h/lvO1nrn3ZQLfHN8a+HSBtojHCMa2a85rwXkJxnCKKpcU8YoVJQRW1ZvgkyrknS8CfVDFOAo56aBdFOiCYVufrK8TjE/MpoXFZq8WdFHVrEunz1EVFpwyxjnjnbveug2A1N0AZJJjbcgjBaNQguZSCzELIUIRjrKPwhVlZeJn0KloJzzflPeKVyDFBgD9sPkbANXECXk3AumNBLoH979LIH3fBFLZeBs4MUGRRmeMJA1MIHI5eGcjFvRApsTsCzAwDWhMRRSbwWpf9AYCHY9Gu7PTvd8P01uF4smRNvuHL1EfDOXuwQ58yHYUns8h779Yjd59uMrDy9XRxVEzP6iSaNwxzDcQ6EbDn4ggtUZQRAhIObZqekc2SqcDosw2oUuBNiOIdSfUXJ06RiW00Emh9pp7kwyagO6OoP+k8EYGOT4jGGetjNokMNx6sgCfuKmoUrBAdNxtuFOiBqFcLDIyYq3OmdNWGvoGg27h1tcYZKQ2Xt6KQdLcjUE2O2Fckaggq0iCuWiN1sRDAXcQpz16rjuTiDEctVagudGiNDFkYJyqDQz6YfM3DCrVom7uhCC1EUH34P13EaTuG0FFJm+cBytJGq+ygxiARJJRxIh8QxTc3dBHntgAsk85GAYoYchtGosNCEr4TD0/v/TD5Tt1nI9pOTw8KU9heHQwfrl/sPvb4vBxpVMIu5PhavK7q0bvzyfDiTkyO3E/Pz6F/e8j6LOEP49A0qwJZHkYcIKrhls7GM+uG0hogsyRKzXjZgJR4RnE8bzAFaq8TcSzRiajmGpB8jh5dwJ9mcAbAYSQidgJtGB9AJMx8CQiMDoN3GjaNggEJRqdCFTWIZRoLfLEBABBqG8A6BZefQVAXAsi+HD911ZnrU2nr67/BnifKJA=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/b3c4119f6b52828f540364401de4c8d1adcdec589cc9a401b7387a21aa28ebea/668ee8e8/nsHIkeXKnaRGpTyn0UiRqetcq2paGWjFgD460pR6Z_SiUcPZb37Cfy8d4sBnxq_fXKVuwowF2qN2bjBAwBOAsw==?uid=455675172&filename=third.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=22&hid=89f26e64463cd42e4d41394541ec7adb&media_type=document&tknv=v2&etag=ceb0d6f5a6c3641899b753e32ec2c67c\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"22\"\n            },\n            \"content\": \"eJwrycgsVgCikoxUIM4sSlFIy8xJBQBc9ggR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/3d5869fa223e4a7551e42440e7d9876bafa82e5fbd8f2a06524acf0f6d2648f4/668ee8e8/nsHIkeXKnaRGpTyn0UiRqZ__DokFJXcV3a0GY45QXPa4SI1DSA2zd6_9Lp2dQOx_WzydIwxYvYtpSic0t7Z2pw==?uid=455675172&filename=second.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=23&hid=ba29aedb9bd087e6b1749aa1d6ca7c9e&media_type=document&tknv=v2&etag=f36ea43e34bb30404c3a4842f2194e2e\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"23\"\n            },\n            \"content\": \"eJwrycgsVgCikoxUheLU5Py8FIW0zJxUAGVuCHI=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/f1c8578261e1583d72b92e0c1b0bba443a0c36a8bb7a22d8cd951c0ea9d5c250/668ee8e8/nsHIkeXKnaRGpTyn0UiRqcaK3Lqw8IuW3ZdZeuIXgfH2IYShPQSDErXCi4c99DmIxmJ7i_jqmIm5Y5AbQdCk2Q==?uid=455675172&filename=first.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=15&hid=647b704582c6258c2552ca591db1b9da&media_type=document&tknv=v2&etag=ef06f76f53a4386cea89de53db991bea\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJxLrUjMLchJVUjOzytJzSsBAC/sBgg=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOwiAURdG9MNZSSim0c+MG3MCH/0gbayEFjca4dzu8Z3K/Yt4RxSTmWnOZpAxrevKZ8tJ8aGO8mw1VvpTkpdxlytipLmkrMtqgXUBrO1hjWzgP+B4DDxR9N/pgR9OPvjWdVzrCaR25V4bs4BTASpzEA3VOfLyvl9uRFY+8UsUhkdaC3x/D3jIQ\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f7c38ce072e7570e8beeb4e6d6afb29bc79549b052b13fe833fd415a7681eed1?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f7c38ce072e7570e8beeb4e6d6afb29bc79549b052b13fe833fd415a7681eed1?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_get_meta.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_meta\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"132\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J12UHcFEcHHD3TjqgzNrSmmTchMRRH/3XF17jmb+3GhYHCNC6pZGqI+psWvOY/1m2ePVz1D6bkhP8qDCiQtpYccMmvY/1u1O1bby41PtluImqihu0O7Ccpu5Qwhefu4nltTxZQjK6wMHAXfHxgALkQ=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_meta\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"597\"\n            },\n            \"content\": \"eJy1kc9OwzAMxt/FVzrNzfKnyZlH2AUhVKWpAxHLUjXZBJr27nhIXLjAAS62FX3+7F98gZHyRPNMM7gL1LI2cAAdpEa5gnt86uCQcuJXgR2UGCtxzeXi2wtL51Rf3fbB33PeU23bxmF8pjZmap6NWmn+wB3XDo4+E7d8V9BbijycBSvVcloDjYm3AamUNqo3wlllxIRWzGpQAXVUMZCJ0s5eahGl8cNOE+7EMFhjvIkD6T5OAW3U6NH2PCSs5NsNEgQKuUGz6XHfayeNk/YO0SGyKpc5xfSj7LfsoeRMx8Y49fa7y5rOvMT4hfnXjMtpOqTwT/Z8nva+0Cf2CrdbnVNN5QiO7VHvELXtrRwGef0AcGeugQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_meta\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"597\"\n            },\n            \"content\": \"eJy1kc9OwzAMxt/FVzrNzfKnyZlH2AUhVKWpAxHLUjXZBJr27nhIXLjAAS62FX3+7F98gZHyRPNMM7gL1LI2cAAdpEa5gnt86uCQcuJXgR2UGCtxzeXi2wtL51Rf3fbB33PeU23bxmF8pjZmap6NWmn+wB3XDo4+E7d8V9BbijycBSvVcloDjYm3AamUNqo3wlllxIRWzGpQAXVUMZCJ0s5eahGl8cNOE+7EMFhjvIkD6T5OAW3U6NH2PCSs5NsNEgQKuUGz6XHfayeNk/YO0SGyKpc5xfSj7LfsoeRMx8Y49fa7y5rOvMT4hfnXjMtpOqTwT/Z8nva+0Cf2CrdbnVNN5QiO7VHvELXtrRwGef0AcGeugQ==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_meta&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_get_public_resources.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=0&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"2605\"\n            },\n            \"content\": \"eJy1lcluG0cQht9lAPNiSdP7TBMgAosSKYlWaEnUYgYB0avYImfRLFxs6JBccslD5BFyyTmvIL9RehRbsg1HtuME4ADTmGJ11f9/Xf06cJVJyqD9w+sgr+XcqcnMrIN2MD6ZHr2qt/lydbDaDpfj2WDM3ej55eBqWe9cFeXAPpvF2zYa466LD3XvfKl6eDxYx0eHwB5LeR0eMJknx+vhQZaO8Fl2ke6Iy04n2AhSkRi/w6AuSuOXZuVs0H59sxEUpszqQpmJ0/47oZRFFEaoraUlRAmkiKHaAmMRkUZEFkAhNUFC6RhqACWHgBMmOIi0oloSYgFnsYV+k7e91cXcZ55WVV62w3AttNsqZ6EOh1ejXQM411cnOX3m45NMO+tMUwcCkG8CuonhCEZtCtsIPAWgDYAPU4UR1WejclFNfYh25awdnkxFYcJ3zassSUxa+Y69B96Cwi18wsk7Jf4nGf6f9N7Bap2bu06LoLFz4UqXpUEbUspJFDHKWRMb32x8RFt6sa3S/tyul/1dvN5b9eXz6fpcXY77CF0UyXJ40Td7s3M43uu68frFcPdymuS7Mx0hhy+6h/AR2j7j/B4eTrqgu5idpvzF5QOdt7/d/v7mp9s/b/9484t/+7l53vz6RbhKxmNorKQ8AiTihhgLYoFiiyOGfBhE1AAFKYPMi4i8yNgKFhEhIxQJIRss6rLKkkleZLkpKmc8HGk9n38KOMQb4HDcBvE9cB/Qi/AmhJuAjxBoU9pG/NNc/mPDX4Pof9D6Y4h+c/pHEGWcU4Yx4jGDAN0hKtLKLVxRl5OyElXt2w/U3Ij0ocq/6dXzp4qeHYRpvjsfXcVdO6hG3dPzHeLi7+txb76SSZge1Gont9fnucmv+vbsaTesh2x/N33F9L+nd3t+ZvfSFTjrXUJ99EBvLysSuLWQH/D62LDC91CU7pXPgCKIHhnISGiCWSyJlFxAyJilDEUaYUG5HwdeP80Yg8pAxCGVBlgGtY2k1UKZ2H5uwD5U81Xz8durenQ+fmt6b0HiEjN5S2BlVlWYz4VreLJubt5zWGfLdJ4JbYqt5nRurUWqzWqrqMNmGTKDGEcQxSzy1TBANSSxr0ZK6t9jrhG3QkArgOFSRdoigYRRAGrClCI4ZP58UKVomJZ7+zNzMUjFcT8frVNw6o6vX8bP3f4qX9RUFNf7k1hND0+H6+OxkMyOiqt6NHz20o3rdIG3T+pJPz07L8e9vZODTBB91Fu+OHqCd/zvu9rpzr1+rabFBs/OOzhbvpc8K13lD2BHVJVQ08br1lSU005r7hJXdUBLZWnVENCo1mk0e4J6d6q1vEammHy0SYNvp6G3NfUfpGVIChMTJmmMAJZGwThCjFg/JQzWrcRoJx5yt6pZuugsUMtU/gBi6M2NjP8/93ZjLx3DVACfBEPvO3vkag/fO4EPe7x1vTllU4Eo82sILZJYEW+pMkziSPgJR6S1llpioNEExpgAYf20YyRWHjaPG/bXMCYRiaPgfqLdIeR309QvvqD092dfRCAGHlqKmL+mb37cCO7kD9p4I8isLY1/BTd/AStKJLY=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=3&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"3970\"\n            },\n            \"content\": \"eJy1l2lPG0kQhv+LpeVLAPd9WLJWhMvG4TbnamX1UY0H47HxjA0myn/fGkIWwiZAjpUsazzTrqqut+qpno+1rIRhUWv89bHm8jKbZZNp0StKV07xZi1cgctri7Xx1F9loTeAOd6kG+Zq533/prW7caaGt8drdKbnre1NerL6rn/y/qwb2Htonx+a4e58c9JJF5vX7ODD2sZ8f+Wiv3FaXNe3lB8PD+a7W6O8y49Hp/mau2g2H/1MJ1fop1+W46JRr89dzJaLQT3W78z4eibczWWx3YMbXJ+7IeDK9k5aYoTaJUqXmF6+y8b4DG6zVGt8/LRYCxNwJURc+LioS0mDigbn7whpEILri+wObSkrDSd0sTaBYjSdBOhl1R+FlEpLqlkjOuO59i6RFMAnlxh1RsooOTE2uUgD8zEKp0WkxgsrNbWGAXVMgbBeoqfhKGYpezWgMBoOIS8xAJTiY208yWa4jd6XwH53VA+5/3/MowrDbAi9cj6uLLvxGH25Mhvl9c9qpewKnmgeRzf51chFmCzHrBgsz10e4XZ5Mq1XP+vRaY/eQLiQArMycUYJEcAUJdF6EmRIMgRuqcOYtXbGUKWYITIA+EjqSlm8DrKeF632AE47uTvYHHfnOTnKDq5TV02Go+2ro9OtzkTcFodbenvkzYpdbQ93Vvda887+xXU+WT8rj6fcrA5383Uti9Osp093/d5J9+YPvoafP6dZbP6bxIVqi1XBNv9brgu4q/GoyKqENF1ZutCvpF/ou6LfXLjKhlnZJAthlJdVQVRJbD5J4R9so7KBKYNJ75nPqqqbD0W90MdnVDqpWHDG6ZSU0IpI7aKUDMVjDujCEGLmPvvAChxjPRQQF8pBPmvO2AKU2KqYbOejYlRzGrUJJHotlOLBcU695lU1ubKPelZqNeqHfTeB+je79NFbhZt//VX92HdMKrzrlUlBB5WSEZp5iCIqTqSDlGwiEZL2hEQuI7dE4JemJCnHhfEqBhIS2nqwf19k6DPKqvVe38QEZlmBCa41qNQSY5dCCau5Vp8W385LO77bMfm0e7a3+mE7XHSLjf5sxYk4DneXreF0Z9KyZ+365UUnN/Hd9npnzqYbl3uDw6wzYO3WSfh5Xp5v0ikcqenKnA7txbd4yZaIepWXuEh2qW0w2yD6GS+11UYT8n1eGsp88l6T6BzBlvVOeplAABcWy476QJOMUUUWdTSJKGxiwQWnXDCZ7mX4Dy+/HdCP8PI3RPUSL3/Z/O/mpRVAmaNgvNRAguY+agVgtFYUQ4sqSJUsQsEAwjJGC8EBwlURSiCJV3h5YG740cmlPij8+T4NrZP1nbXzD+czD63srtstzfXY8pGbZNzovalsnbLu9Ym7ubvYWopjONi9eCsvv5Tr/8zLh6K+56VEDSklVsUkBdOKK6pEtFKCIDrZN/EScUVJAGkN8kskD8oKjXOLWW9kUvI1Xj7p0jfwMimvjSVeERQ0cGaoo8FSC5AkMCtssIYoH0QC4gDHNorsk3CCA0gS3Hd4+YZNfM1LRRDIlEpLlf0RXvK7zl5pVk4mO2qwSrX70B4NuIbxnKnjd7fl7mb98LKYH09Zwr/rm1l/UG6P2kdrN+0duV8cn/88L2flaei8V92iO7mOT3i57QbwkItvU5KJJUKXKKmgRGSD0WeUFNXMeOFMiY+ZJEr7AFaCcozhbPaEYxdiT0OKBgwTgqKOgaA3LEhOsaM5GgAKzxn5/XB+6Ez561G9eKb8VfPPGFnCbVm/XRo+avVjjGRKW0sTJQwiIzJ5qzi2kfU0Wc6VoDZ4i8cP4TlIQRkFmQwP1FgQ0nH5CiNdW58P0sa5yrdtN41XD5Z6rZk7uuxene3fhlXfsyT4fNSZZdPNvfL89s6llY0z1mXl9Q5bD2H/ZUZ+KdGfIGOVOETiY+peION9Id9zMXIitE546PfOGWIj84GrhPqFqEhyT7k4zQc52vwaikQrgWMQlzIcPyoK4oQBSYWiAmcgPIfikyb8CoIPxp8SEAKXAFzjewmNUcaAH+JDYAKHG047xiXDygqgI85b6n2UTujEBcrnPDXfIeAbIn5CQE2NkMYyKvGlxIhPfy/W7tNfa/DF2iilAqrLT/8AaP68XQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=6&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"8403\"\n            },\n            \"content\": \"eJztmMlSG98Vxt9FVWZjg+48qIpKYYTEIARiNqkUdUfUILUadUtIcnmRbLLJG2STR8gm67yC/UY5bfibwYBHsqLUqpK6W+fe/s53fvfqvK8kRejnldqf31dMWiTjZDjKT/LCFCM4WXG9YNLKm0o2sr3EnZyHKZzsm7X9Bs2LWe9AZqtxvTVaOaImXGCH7TTrdUUoujv1Bt1OT08PSKc9E7uXrXaaNFpkP2zI7YvqurBZf2e6tT5I9+jB4Citm9PFxZtxRsMejNMtiiyvVatT45OF/Lzqq+woO4xveweFLgrUgftT0w9wp8l9DRO6MLZwLkySWKm9//Cm4obBFMHDDQQROo/wPNZ7mNSwqGH+GqEaQnB/nswgBpGYvKkMQz4YDV04ScpfMc6F5FiSmrGK+WBdsB4xho3BWGjrSAzRY6UU5o5LizzyAjOnrRXCE0GMsBQ7xiIM0x/4JCYPz4aTL7Nxg34/pAVMAPR/X8mGyRie4eSPif3uWV0L/jzhIQX9pB9OimlWRi7CpKhmPZOUjopJL9zKsR9cpr2B8WG44JP8fGFqUh8mC8NRtfxajUQRpJ0QxjoJo5pIhERcam5wdJ7DIbhEkWlBbITp2BB0IFEGiaSMsSqERtw5UU3z1bXzcLSRmp1mtjdN0X6yc/FOtZK1STYecTO8WDtRrru5vzXdOTZWxL3h2Whva+ldcjxKx/Tt7uikmR4c5seN1d31gWG+07jc7ryidTj+NEr84hf95spHLA26CPZ8RZeuDDoHz5MN8qRIBumiKQrjumW+57om7y7O9ZJ+UiyiOTdIi9IFpXKLpW6vSOOzcnOgUxie3BuotPBi6eC5LlwAAYg1QTFhOchGbXBYSSJYdJgH6uf6wSfmJvZccZ6OF8dkLhRQhhR7QmWA32vINxUgGuUGQRCKJeS3NI0pupC7MjO16m7XDEN1YzTMQ/VOHd6Mcp37sta6hnAB3zGOxFLHRCAugGGkUTgwG2PkkQUcPMOKMmSiDkww5ajhhmuKraZMMiUh1nXkz0aC0TyHL98x+WEYJzmIX4HCkwxTjBBhVEFJfnjz/QxcXZ3krw+qg8FWY/WisT0xw8322ehwp5n2xfJ2WxfLk4393deoPT7eEtbqZqqPtkw2q+63jzd9/+DnGXjWPRqvt3e6WyeDMDu9YeB5mYGFWZI9ikCs5zGZR2oP0xqWNazvIRBTDi/8OAWFxd5KjaH6pGCYWBTKH0C2hFNGGc6h/JkMjiMZSJBWQB61Q55SxK2w9yn4+IR+hIK/YVZPUfCXw9+joMkyGMuU9V+9ytaPoZB76632mnsXKZLROGGNJ4aCjR0hUQEeFVyVUOmSAhQlhNJBhGgVkPFbKNxtbLK8Wc+TZEXWT3sbRND1ZgxTm+q0G1dXLjpndOKTfpOeZ71G6/LtttaXqK/aa2d5HVmx9DQKv7j0Jzh4SznAYRnjcRhee/kzD4MlRhEHojEAiAqwgDAOCwnGznuB4m0egvEysEEe/F0qci2todQbFUo7lIzSQdJAFIc1wIeHqXi7Ju/g8GaYO1DUhrAIS2vU1HoDq6wUXiGsBDOmfAioGKVkdAxzWJqdopoGAX6LOvJAHoPid8z9FhS5hEWDUYY1R4rKH4HiTmeyv9yb9VRm29Wxvpger63aolVPNu24czjIcaNfyHzndX2veqqnk252PCoOe6xJNsdDAvvQn4ViUn3XHJh3rdZ015Ne7/IGih//iRf8wE2eYiLi8xTtIVFjuobkPSbCmiORfhyJzElKuNIS8gaVaTm1jMSosIQsSmlhy+I9ppQwQjwkwlgoVc0x0U5K5PADSHxkPo8xZJz6hUEW0km/FwfDviny+UGMiQvw3KOypBYuB0OfDQcO/Jakp/3ewh9XfhC0v+FZnwLtL4f/cJW0qz8zd53yOFOz0vrhssoABIIjzwjsZWErgkIApFoaOKdGeq98jExZ2EjRspaw14JTpQkTXNgQUTVJAa04HV+c1jvJ+nDaW2r7tcZsYg+X7GTlbLl36GOro1bXp4xno/m9y2nacSed+dny8X7LLbmOGI3JjEVxttzszOutpXCADsdk9+IbRH1VR6/02yub34FqkvaSNDwF1KRvTgOg9CwLpw+y9BqBN/VUX2ks7bf2KiUVXhT+fQrPfV60jo6OdufccJAtohvJy5Mvej+T3g/J/aL2M6n9gNgvWj+P1l9L/aL08yi9+ZXSmy9KP4vSra+Ubr0o/Tyk/lrqoxetn2sP8oDYL2o/3w77Iblf9P6/7UOWKx/+8qMtTyWoQzyCwIzDH34qlHPIC8dlUMhohSNFWnnmg2ExRq9IsJAK7AWJESH0rZbn23fL+cFGUW9ezC5s0h5uNburTT3uzdbql7ydN2cn+7PDA1XfXItLcv7Ar9TPz4fH6+tne+JohZjLnxT7Z7qev9DteaJbetXlumqWcioYd8YiFyAqixIFgjnmhhMOLr7dLP0S+U6rNMoQtNIOKWKsEJQzb7XFwRAkvRHmfi/0VjfqurBeivC5ivBOj/rjvz7++9NfP/73438+/R0+/a18f/pH9VbP9EtnmhhPHMHURioxij4oZiLUHMMmEO8jHExERbGDF3JGQDJwJOAhrqQQ4pHO9HdY5VZnWiKiMZEIY04w0iVHPqtTqdE3FaiCPMBH8eF/4styvQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=9&limit=1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1364\"\n            },\n            \"content\": \"eJy1VNlu20YU/RcC1otlc1YuAojCihK7TlwntuzKKgpilktzLHExOZJFGf6SviT9In9Sh4rrBG0f+tACBDnLnXvOvecMHz1joWi90S+PniitWZtm1aatFXblFj21BFF6Q69eyaVR6QI6t2i6N/YjuRqTE5gvt9fLT9BONjfn+3J/uvz4U2dOyB07Vg+zRRR3gk3hw+n1rVmo3CK4nZ2t5b1/Gsi6uOjOT6tySq+rWTkRt0nyDWfVLB1Obm3djny/E9octgtf+9PbWlyVBlPgN/MjF1+KAlzk8+/PX9Ln354/48Otqd06bEzmjR6fhp5qQFjQLogggg8QPaBoivEI8xGm+wiNEHLxrdm6PC6CMI6GXgNttWoUpKY/yDgPQo5DMgo4goDHFFOEIVAkZJIEGUMRiSkVGaY0wpzxMKYoBp4xHKJMiSDCmgJwnjmkotImM/9MiLBXQqoqCiitI+BkePTqxqxdGemfxP5rVi99/3/SOxUKU0Bqu7rPLOraYQlrqtL/qlZmlvCd3rp6KJeV0NAcatMuDjtRatgcNiu/n/oozgRTnEKMKHG8BI4ySbHGCgFmIs5orDjGgGIUKUR0DI43i2IcC6JUIP0giBF3I79sT35cwOx9KS6O62lXoitzcT+3P4c32w/z6Vl1t0g/XV6u5ttokY4v33C6eZefz2bHx+VkfPT2XuH5+2B8Js/15sAedW9tgO4C+rBHJ+75YWV08trEQV9ib9Zkb4L2jsjujdP+E493E7Sz7sBVWFet6ZuTCGuFynsbDHLR5slgaQpjEzRQVWl7c/QNTb5r5x551+dw7YMm/Qt+7/DkxeCD3O1xShGTIbCYhQqTTGZcgwyFJkyKELFBAdqIrxjOjbXzRgt6YBflOlmTAVh3ZSUhTmSMIhmEkZYCg9AqECqTmnGGcO8sYXOnba/cyL/MRQP+327rN6T+l/OK1d/LXBAe9OeRkrEMsSOMolhmkoveAKGMgIVO4YxGEYEwEjrAlAWAFMZcoZiwTAoaSpfrJf/ObA5Tczf5FwU0sData643wgEOMepdz7HLHD39OvR2kritoVdlWQtuGD/9AWlcodg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=5&limit=2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"2598\"\n            },\n            \"content\": \"eJy1lWlv20YQhv+LgOhLbHPvJQUIhRNHtnwfsmKrKIQ9LUYSSZNLWbLh/96hktR22hxNU4CAxF3yndl3Zh4+tNLg5lWr8/tDS2UhXaRlXY2roEINiy0zcyprbbSKWs9SM566FSzS+4PTEG+/L4/F9C2W6rCfT6l0xYqI4etlONmNLj5Uq2FNPLwu7xaTaTjK+5c7d/1jflYNR7fRvtDF/Hx1sp9nAzrMr7IdddPtPsWpyxnEmYRQVJ0oWimbblXTyEaLcGUO3ohBNShv7Q08n6m5gyeP1NT5dOZgxS1T3+o8PG60TOlUcBa2CSJsE+FNjAY46SDeIfg1Qh2E4PkqvQcFJqkUG63SVXldGjdOm9cY50JyLEnHwjbhSEhtXMKdUIR4LzSizihlnfM2djFhDGOTGATRMEYUO0woCDjc5DXPberT76Zj8vncZQESAPsfWkWZLuAQ48+J/eqsPvn9/8hDDebp3I3DqmiUg1uGaLk5f6rV+uepzja/y2Y5SJdbNq2mWyuVWbfcKuuouY2wjROBsZNSKY0w9c4jojxj2oCjJtGMeOI0llwmgliiGVZcwmmMZB55FgmRIG6MiLJqrz91VweZOt8tBqsMXabnt6ovR1PfG4nsKBn44u355nhvoS4/DGbXZ0vzVo8TZHSWHyzSevc0jJb3ym/3rsmAhNtj8s6Ys1d0B67f6tR2/zKx3RyxadLu5xZtw1mKvEpDmmddFYIyk6bg7YmqJt32LJ2noYvaJs9C0waNdd3GuFek92RdG4xy5fiLSE0nd9eN3J7AjqWISektU1qpGCVgiKHCQ/2MFcir9tzZVH2MUGfTDDTbYZotugvSdgHmEUnBDAbnFLHCCMuQYrHjmAnMuJfr9lFhAgVsytOJng3hkzTsfhJvZm2iCBew5AzlzlFpscHWcmvgQtoYwqSKNbeEcgKdZZy0jHCsteWKSU8ZlE9pHIPWJ/HPAS2Hmx/IuHSLtALrWx0sccx4nBDMBUYxe9z4cQLOVf+yR6twPxvKYs/vH9bvrqhyt3AcvSpmE+HC5HynR0+zm5shOTu+Fxd3h8dZ2jskl+5Anv48AdlV8d6/mQ1DEgI6eyKgqmwHJm9rob/OQLqGTjLApINFB/MvGEgkJl9HoNIxsw5QoC2CmVcKY5HA5MEUWhzHMeaGS40ssmA2DKMWwhJBlNAUG8b83xD4MhtOfgqBvyCrbyHwP8v/EwKLmUqzf00/T2KCEiOE0kZCVOWJkAhQxxX2xnK4BJeAOWCf9pCOdi5xBLpeIsCA/w79ruPDtL8sFjVX5W1/HJvJ0eXJ6nyktPCD8kM9ONm+Tkd1tqBvLurxbjZ8X416exf7uWL2rHd3+h36QXu+otsfG/TnCbh27hvwazp4zT4wgGjlYiY0B9uodgbHkgjmDeaO2ufsa7Rfgo9iAJB08H4C9aYCTKNcIRChWEJ9vwTfxUSVLjqoy8pFL+bwBQabOM8ZiLEnmhomHDEOGgbIhx3T3nvuGXw+LcMxBYL5xDHBYkMVVzyhWCeUSRbLrzDwB5J/xkAhGaa4+XjTGEby8Y+N1roAQIONVu595eAvf/wTXpgduA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=7&limit=2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"7119\"\n            },\n            \"content\": \"eJztmMtS20wWx9/FVfEmgPp+cZVrimAwEDDhTpiaovqKBbIkJNnYTrGY2cxm3mA28wizmfW8AnmjaQU+IAkk+fLFs3LZrpJa8unu3/mfv+XzoRFXblA2Wn/+0FBpFY/iYlielZWqhmGwYRKn0sZCIx/qJDZnl24SBtfXx+XroyjLdtbWr9bejVWx3bsYHu910wFbedeT1cr47eH+a9Abne4wrWU3lSc7Kp9Gh73TbTs4uoo2mc4He5OdzSw9wEfZSdpR5+324zzDIgnz9KsqL1tRNFE2XiovIxtd9E9Gm729/s5Z5qbn4f5UDVy483JYlG5pGudhyI1j32h9uFlomMKpytlwHQEoFyFaBOIA4hbkLShfA9ACINxfxtMQAmIaXnChUbgyGxbGncX1FwmljFPIUYtpaDWXUHnEGYFIA1d/ATrLjFBCUYoYItwZCrhDjmvmLJEGWIwB1UyHmQaZjX383QWZbDBwaRUWEDLwoZEX8Shs4+y3hf3qVd0jn034kIVBPHBn1SSvI6s8D3OpKs7S6C5bPk7ck1Tb7DpNMmVdsWTj8nJpolLrxkvFMKpPI2q11dJKao3HgHtlmFYWKQwQMQh5YSgX4Sp32HJMOeAhlHTMeS08gz5iTAJqDIvScn3j0p28TdVeNz+YpOAw3rvaX9smZbdTxvEq75wnbxHDm13vJjqVad+vr17tXuCxjQddfJkna1vXb95JeQ0GordxUXaAZsuvcCe8/zSMbfsBYrPeYq3T9oNKm2EzeVbGNYe2qipl+nXGm31V9tvNJB7EVRs0TZZWtQ5qdu0n5F6htTpGIOWKsy+mqsXcvtdysx+uOY2UQCZAIxhq4bihhCptIDTWMuCbA2djdTdHEF4eZFA626wu01F7hJquCoVJJdcKY6uEq+XgiYPSceyQoIpY62oRqaof0lgnqRXt91Xhoqc1+ThJ7SkP09TV11eIsjAKpULEQyG8xNoqbyFnVgAoGFGq3kSoGCG4NwRSQawRWGLHgt689NQhHmLdx/8kqTCnpeHkB9ZeuFFcBq7BBCinAhFMoKRAYH6z8OOmuLc7PlxJponIdS8ayavJ6ca6rrY68bYe7R5nJVwbVLzce905iM7lZNzPT4fVcUK6aHtUoODBP2uKcfS+m6n3W1uTfYuS5PrRFG//CZdsZsbf8kRAFzE4AKxFZAvwLzyRSsyBfNkSieEYUSF5yFuoTE2xJsh7AXnIIufaMGYtxBgRhGxIhNKhVCWFSBrOgYHPWOIL63nJQ0apXcpyl44Hic+KgarKxcz72Liw72FdUkvXWWHzIjNBb3F6PkiWfrvyO432F+z1W0b7h8Pf3CXt7of8c6W87Kl5LX13HZFgBIwCSxAkBjoCnAuWqrGjFCturbDeE6Gh4LiuJWglo1hIRBhl2nkQxWmwVpiOrs47u/FmMUmWe3ZjbTrWx8t6vHqxkhxbv7Ur1jcnhObDxYPrSbprznYXpyunh1tm2eyy4QhNiWcXK93dRbmz7I7A8QjtX33HUV91wCv55k7mn5lqnCZx6r5lqPFAnbtgpRe5O3/WS+8t8LGeOqtry4dbB43aFeaEfx3h5qcfrZOTk/2mKbK8DR6R14Nz3jPi/RzuOe0Z0X4G9pz1bFh/jXpOejakt78ivT0nPRPSW1+R3pqTno1Tf436ZM56Vs8gz8Ce057dE/ZzuOe8/2/PISuNm7/83panYNgA6gNgQsMffsyEMcAyQ7kTQEkBPQZSWGKdIt57K5DTIRXQMuQ9AOB7Lc8371fKo7dVp3s1vdJxr9jp9te7cpRMNzrXtFd2p2eH0+Mj0dne8Mt88ciudi4vi9PNzYsDdrKK1PVPwv6Zrucf6PZ8o1t61+W6a5ZSzAg1SgPjQlTiOXAIUkgVRTSo+Gmz9CHyZ61Sz52TQhogkNKMYUqslho6hQC3iqkve6FPulH3hTUvwlkV4Wc96tt/3f77419v/3v7n49/D0d/qz8f/xE96Zk+dKaRssggiLXHHAJvnSDKh5ojUDlkrQ9vwrzA0IQXMIqFZECPgoao4IyxFzrTPyCVJ51pDpCEiAMIKYJA1j7yiU6jhRYaoQpKFw75zf8AefLpKg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=9&limit=1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1364\"\n            },\n            \"content\": \"eJy1VNlu20YU/RcC1otlc1YuAojCihK7TlwntuzKKgpilktzLHExOZJFGf6SviT9In9Sh4rrBG0f+tACBDnLnXvOvecMHz1joWi90S+PniitWZtm1aatFXblFj21BFF6Q69eyaVR6QI6t2i6N/YjuRqTE5gvt9fLT9BONjfn+3J/uvz4U2dOyB07Vg+zRRR3gk3hw+n1rVmo3CK4nZ2t5b1/Gsi6uOjOT6tySq+rWTkRt0nyDWfVLB1Obm3djny/E9octgtf+9PbWlyVBlPgN/MjF1+KAlzk8+/PX9Ln354/48Otqd06bEzmjR6fhp5qQFjQLogggg8QPaBoivEI8xGm+wiNEHLxrdm6PC6CMI6GXgNttWoUpKY/yDgPQo5DMgo4goDHFFOEIVAkZJIEGUMRiSkVGaY0wpzxMKYoBp4xHKJMiSDCmgJwnjmkotImM/9MiLBXQqoqCiitI+BkePTqxqxdGemfxP5rVi99/3/SOxUKU0Bqu7rPLOraYQlrqtL/qlZmlvCd3rp6KJeV0NAcatMuDjtRatgcNiu/n/oozgRTnEKMKHG8BI4ySbHGCgFmIs5orDjGgGIUKUR0DI43i2IcC6JUIP0giBF3I79sT35cwOx9KS6O62lXoitzcT+3P4c32w/z6Vl1t0g/XV6u5ttokY4v33C6eZefz2bHx+VkfPT2XuH5+2B8Js/15sAedW9tgO4C+rBHJ+75YWV08trEQV9ib9Zkb4L2jsjujdP+E493E7Sz7sBVWFet6ZuTCGuFynsbDHLR5slgaQpjEzRQVWl7c/QNTb5r5x551+dw7YMm/Qt+7/DkxeCD3O1xShGTIbCYhQqTTGZcgwyFJkyKELFBAdqIrxjOjbXzRgt6YBflOlmTAVh3ZSUhTmSMIhmEkZYCg9AqECqTmnGGcO8sYXOnba/cyL/MRQP+327rN6T+l/OK1d/LXBAe9OeRkrEMsSOMolhmkoveAKGMgIVO4YxGEYEwEjrAlAWAFMZcoZiwTAoaSpfrJf/ObA5Tczf5FwU0sData643wgEOMepdz7HLHD39OvR2kritoVdlWQtuGD/9AWlcodg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=ZShQzuB9wxJxB%2FwZkKZ9iTLgKjwuDjrsKfAk8Bf7Z3Ci8MdFWwcF3ZKy8QM0fRbbq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=nXBcnGlfywGE3yHxGbLhyWcgZG22XrmwOXGeHkW1ZHCiZyPOEghmpEkd72i3XCM1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=dl%2Bc5VJ%2FnpElTj8CfKtTCUWD4i8NuZFlxbm%2FnJucDpfqWpepjGfV%2BC%2FuO6IEnz6dq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=1F8lNBhwHOFY6mxVD1v7yHMG1WC%2BhWBYTc2BeIZS8mOyGrKfgGq2RLDFyQAghFXsq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=9pzN8nuTYPCLMcgTsFhvAa4dpczjHmuNrH9YI%2FjgKn8d%2BMEKy2uFjPkSiKk2IHWcq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=3zKPt8AWrN6kC17aLIok37epy26V%2BxtOG%2FSjsyVu2fcle7wvhktMoIUDwIN5QsVZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=maIUF3stzlV7pHfJLuEX3aeq1c1byplh6ethRDF3PnggV2QNz6SwLNniFL2UeK7Pq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=HHxs%2BV%2FooOFHqFPxarMNjuWRGnm6CPN9tCxKUS%2B0NvZO6bb9Gn9XOapz%2FUNZMdmVq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=RQxUClzl8pbN%2Fv9qyZIHbtLDiMbvQWos1Fmt7sR%2BDT%2Fg9yxhpZutWl4G2Mvr2iteq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=iyCtP2UB2HeZlzVlQesDxYO%2Bb%2BTlPNyiH2j4GcwXk89ya4TeLJVgikcht0egXMvbq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=3zKPt8AWrN6kC17aLIok37epy26V%2BxtOG%2FSjsyVu2fcle7wvhktMoIUDwIN5QsVZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=maIUF3stzlV7pHfJLuEX3aeq1c1byplh6ethRDF3PnggV2QNz6SwLNniFL2UeK7Pq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=HHxs%2BV%2FooOFHqFPxarMNjuWRGnm6CPN9tCxKUS%2B0NvZO6bb9Gn9XOapz%2FUNZMdmVq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=RQxUClzl8pbN%2Fv9qyZIHbtLDiMbvQWos1Fmt7sR%2BDT%2Fg9yxhpZutWl4G2Mvr2iteq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=iyCtP2UB2HeZlzVlQesDxYO%2Bb%2BTlPNyiH2j4GcwXk89ya4TeLJVgikcht0egXMvbq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_get_upload_link_object.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_upload_link_object\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"146\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1F1BRNB6gW5chTGZmto0CZmJKOLdHVf/vbf5H+ULjqpTnjlTp7UNqbo15Kl9Q3T4aiOyfm60m2jWBSnVYpEOGdjv/63ZHZttf4WT8IDEIixj7sim5pDAmTDF2aTbAy2rlVqQfXLyeDkPooxLDsAoZYRA+P0B9WQ0BQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_upload_link_object\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"639\"\n            },\n            \"content\": \"eJy1UcFOxCAU/Jd3tZsFWkrL2U/YizGGUHgobilNYTeazf67b028amL0wpuQYXgzcwGDaULv0YO+QMlbBQ3QQKyYCujHpwbmmCLdCtZADqEgYYKrrS9E9bEc9f7B3tM8YKn7Sod5xmpO65ytN3NcjiZPr+gqydZc7Uzvrw0sNiEJfM/HtxhoMaJvWPJpc2gibQqdlL2SXAktej8EgtwPXgyj97YfpFMcGZNSTYoms9yJTg68G3Eag2AtCt9PrrUOA33iNrT1FgAIJrodUzvOD4zpVuhO3hFgjFgp+xjij7Tf5eJySrhUMlduPaxbPNNK5sv0XzteT9Mc3T/JU1n1fcXPEDa4NXeOJeYFNMmzXqqxl3JkomXXD70OwNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_get_upload_link_object%2Ftest.txt&overwrite=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"242\"\n            },\n            \"content\": \"eJwtj81ugzAQhN+Fc2PWf9jmKXJIz5VhdwuF2Mg4IlXVdy+RepxvpG80P03eqMQ65/QxY9M3wFJpZIzEeuRB8TBaCRE70NYMQaEDtsEHjmzBhzgY9KQkWgMcOsnNWzMV4tM01brtfds+tjVHpNLJL4HzvojvmJCeIlHtjdH//aXG8km1VaAMOClvoLUyToB04lFR+N0nxTnxcyyHyYe3HnTKx3JZXmLtTOicPNfvVKf8enJ9v52x0n1bY6WTcFx3+v0DrUZLNw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0f123dfdaef3cfb2fbc510ad60354b92d70f5989faf5089ab4d8e21d540f961f?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader61j.disk.yandex.net/upload-target/20240711T033247.017.utd.8s8n2fonfxcrw4ow85803nowk-k61j.3749671\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrSS0uUUjLzEkFABHSA4E=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0f123dfdaef3cfb2fbc510ad60354b92d70f5989faf5089ab4d8e21d540f961f?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_upload_link_object&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNjUEOwiAQAP/CWQuCZaH3xg/4AcouaWNbSFmNxvh3Oc7MYb5iPiiJQczMpQ5SxjU/8RzK0n3CjvTudmL5ukhc6kPmQkfgJe9Vpp5QBZPQJudAKweTN9pEA73XYEC3PClw0fcQbTIE6mqQ0E/W2eStOImNeM7Y3rfx3pBpK2tgaiaFtdLvD3oeMQw=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f5ed0a3fd6f8872087b9323c375927372ed0b078c957c6f3e7043ded9b686f96?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f5ed0a3fd6f8872087b9323c375927372ed0b078c957c6f3e7043ded9b686f96?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_is_file.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_is_file\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"131\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1F1BRNB6gW5claH5IcG0CZmpKOLdHVf/vbf5HxMqvOlMECncWTulvLotldi+aXF4tQvEPnfWRX7YCs5rncCnQhKO/9Yczs2+v9NFeQCLiuiMkUcfE8zGzJCQnV7croOqYC6JBFo8Jcb3B+Z3Ldk=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_is_file%2Fzeroes.txt&overwrite=true&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"126\"\n            },\n            \"content\": \"eJwtzEsOwiAQANC7sO9AKR/pOXoBkhmsUhHpkGiNd9eF65e8t1gbJTGLlbnus5S9bveI1MwV8LJneMWC9IRCPBsz/Xng2M7EUittlFdu0XoMkwXnPXRGoIdzR08lJ8qtIh63zYZuxz7k32uUOoWgvfh8AXSXKJw=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader4j.disk.yandex.net/upload-target/20240706T221935.677.utd.eq66zufnkfekrpddzml59u51u-k4j.40089927\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJztwTEBAAAAwqBK65/OEL5AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8BjCrLQE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_is_file%2Fzeroes.txt&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_is_file&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNjUEOwiAUBe/CWkulAm33jRfwAh/eJ21sCyloNMa7y3JmFvMV88FBjGIuJeVRSr/GJ86UluZDO/jd7Fzk6yKx5IeMiQ8qS9yzVBR04MEoQm+BToXOWPRGK9t6BOd7fXUtHDk4hKHWwXkosLakDFpxEhuXOaK+b9O9YuEtrVS4mkBr5t8f8mYy+A==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/2af5fe962ad87dd32f367d865270cdfbc854b0dbabdbdf9f369bcd2de57a26d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/2af5fe962ad87dd32f367d865270cdfbc854b0dbabdbdf9f369bcd2de57a26d0?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_issue7.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_issue7\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"130\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1IVQEBGsXqAbVzI0vySYNiEzEUW8u+Pqv/c2/2N8wWQ640Uyd9aOMVW3phzaNy0Or3aB2OfGusAPW8CplhF8zCT+8G/N7tRsLzc6Kw9gURGde2Cu2JuVmSE+OX249oOqYM6RBFomiozvD7NwLV4=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=any%20value%20here&offset=0&limit=500&path=any%20value%20here&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_issue7&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_listdir.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"131\"\n            },\n            \"content\": \"eJwVjcsKwkAMRf8l0J02qLuCiODjB7pxJaFJmcFpZ5ikooj/blzdc87mfiBUGaGDYFa0QxxSXnhNJbZvmlle7SyGzw1y1AdW0bzUQfRQyML+35rdsdlebnRy7kXNxXzuKapxrLCCSSxk9ovruXc1mUoiEy8jJZXvD+tELfk=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjcEKwkAMRP8l0Js2VG8FEUHrD/TiqYRuyi5uu8smFaX478bLzLx3mQ184Qla8KpZWsQxptXtKYf6Q4vjd72w4qtBF+SJhSWtZWQ5Z1J/+rvqeKkO3YOutnsWNVCrIQZRF4qhZQM7mFl9cvZ0v/WGynOOpGxmoij8/QEssDAG\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjcEKwkAMRP8l0JttsN4KIoLWH+jFk4Ruyi5uu8smFYv478bLzLx3mQ/4whN04FWzdIhjTKurKYdmo8Xxu1lY8bVHF+SJhSWtZWQ5ZVJ//LvqcK7a/k4X2wOLGqjVIwZRF4qhZQs7mFl9cvZ0uw6GynOOpGxmoij8/QEs1DAH\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjcEKwkAMRP8l0Js2aG8FEUHrD/TiSUI3ZRe33WWTlor478bLzLx3mQ/4wiO04FWztIhDTIvbUw71m2bHWz2z4npAF+SFhSUtZWA5Z1J/+ruquVTH7kFX2z2LGqjVMwZRF4qhZQM7mFh9cvZ0v/WGylOOpGxmpCj8/QEs+DAI\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1529\"\n            },\n            \"content\": \"eJy1k91qGzEQhd9Ft3XwSJrR33UfITclFKOfERX1es3uJqSYfffKJYXmJraJe6NB6OgwR9/oJJZfRxZBlDaJjdjxkLgULiKcRFt4mEV4OolDHN40sov4tdV+vm5EnjguZ7FQoPAB7IOER2kC2qDwC0AA6PqJ5/F5yrxrZyUSGUvSqkAxVeW0IusTOMRckzIoCVyEpJ2VlQpHWy0p6YxDzhJlBrI2euUzduthLK22ix0c4/LjT//zz7D9Fr/2+sjzsl36stu3eenJtm/p8jgMfFh6s/P5EY5Te+kZd39D3DvB8TntW/5P9h3RO7wTv7S5jQcRuj0YDYBIrt+mdfMvZXU1ZbpI2bribM0yRjDGV6VdrsZnbzVZBBulyTEVjzpzjEZKMAmUKzUhl1olXaJMN1NWN1K+Q4KPKH/a/grKJD2ice8p6ztS9r06KJ4ty8qV+0jpiCqDtT7LmmxVSBGgt62oaEyqD2l2kjU6jOTvT1nfSPkOCT6i/Gn7ayhT//oW1u9dOi5xL4LeiH0b2iICAWzEWOvMfQPr+hv/zLPT\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir1&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"72\"\n            },\n            \"content\": \"eJwNxzEKgDAMBdC7/DlDFpdcRUSUpBBoqNgsUnp3u703kN9jEKi/IJwWt6maQgY8LTpkPwjZ8qoQJlQPT8jGy62Ubis85w9RhBb8\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir2&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"72\"\n            },\n            \"content\": \"eJwNxzEKgDAMBdC7/DlDFpdcRUSUpBBoqNgsUnp3u703kN9jEKi/IJwWt6maQgY8LTpkPwjZ8qoQJlQPT8jGy62Ubis85w9RhBb8\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir3&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"72\"\n            },\n            \"content\": \"eJwNxzEKgDAMBdC7/DlDFpdcRUSUpBBoqNgsUnp3u703kN9jEKi/IJwWt6maQgY8LTpkPwjZ8qoQJlQPT8jGy62Ubis85w9RhBb8\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgjAQQNG7dK2UMoWO7I0X8ALTdhqIQBs6Go3x7rL8b/O/ato5qVFNIqWOWoclP+OZytx8aIv8bjYW/TI6zvWhc+GdZM5b1cZ0dLHGk0c2NiSHFh0ADj0GsK6FCDxA6DERd13rvUFMAB4uNg2ujeqkVpYpx+N9u96PFF7LQsKHJFoq//5bNzC0\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/112a941bab8e14cf78487338658c34703d3e63c58fae220bb188f33b394f670d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/112a941bab8e14cf78487338658c34703d3e63c58fae220bb188f33b394f670d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_listdir_fields.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1F1BRNB6gW5claEzIYNpEzJTUcS7O67+e2/zPy5WCq5zUbVI5/2U8opbKNy+YUF6tQupf+48sjx8JclrnUhOBTQe/605nJt9f4eL8UCiJmozJhZFrmNgSihu42bSmNGebtfBVGkuCZSsBEhC3x9L2zDP\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02VHcFEcHHD3TjqgydCRlMm5CZiiL+u+PqnnM29+NipeB6F1WL9N5PKa+4hcLtGxakV7uQ+mfnkeXhK0le60RyLKDx8G/N/tTsrnc4Gw8kaqI2Y2JR5DoGpoRi1aRzGzeTxox2eLsMpkpzSaBkJUAS+v4AoRIy3A==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02WHcFEcHHD3TjqgydCRlMm5CZiiL+u+PqnnM29+NipeB6F1WL9N5PKa+4hcLtGxakV7uQ+ufOI8vDV5K81onkWEDj4d+a/anprnc4Gw8kaqI2Y2JR5DoGpoRi1aRzGzeTxox2eLsMpkpzSaBkJUAS+v4AoTYy3Q==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields%2Fdir3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02aHcFEcHHD3TjqgydCRlMm5CZiiL+u+PqnnM29+NipeB6F1WL9N5PKa+4hcLtGxakV7uQ+ufOI8vDV5K81onkWEDj4d+a7tTsr3c4Gw8kaqI2Y2JR5DoGpoRi1aRzGzeTxox2eLsMpkpzSaBkJUAS+v4AoVoy3g==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields&limit=500&fields=_embedded.items.name%2C_embedded.items.type%2Ctype%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"158\"\n            },\n            \"content\": \"eJx9yzEKgDAQBdG7/HqLaLDZq4hIJCsEEiNmGwm5uxYWNloOj6mYJS3ivXhwRVBJBTxW6LkLGD4cIGwuPdGh0Sf2f2jRJoJmdRFsCTGkoODBGEJe1yJ3mEbvvV2pBjGI\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOwiAURdG9MNZCKfyWzo0bcAMfeE0bayEFjca4dzu8Z3K/Yt4xiVHMteYyShnW9Ixnzkvz4S3i3Wyo8tXKuJS7TBk71yVtRbreKky6cwqxszGE0PaDdkZRBx88MZQCEznHA4KPRlmQNtYr0kww4iQeqHOKx/t6uR1Z8cgrVxwy8Vrw+wOcKDGb\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/9750ef2390ed35dccc178294063ebcb6ae00ea6699a8ecbd405e6245b062a6e4?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/9750ef2390ed35dccc178294063ebcb6ae00ea6699a8ecbd405e6245b062a6e4?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_listdir_on_file.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_on_file\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"139\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1F1BRNB6gW5chaGZkOA0CZmpKOLdHVf/vbf5HxMbBjOYKFJ5sHamsvot1NS/IXt89RnFPnfWJ37YhlzWNiOfKkg8/lt3OHf78Q4X5QlZVETHUWLxqbmSXUiEZmMWlFi8Xt2uk6rgUgkEtQQgxu8Pf6MxNA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_listdir_on_file%2Fzeroes.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzFEOwiAMANC78L9SSsMm5/ACJEVZNtmyFXUa725M/H7Je5uy5YuJpqiue7S2rfOSJG/EC8i4T3CkKvkJNWtk9n/vNG3XrJaQGHsMZyI3kAdChqYCp9fYqjR+1HsI6cDbjIMU10o3/WLuKZDzzny+rMQogg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader24o.disk.yandex.net/upload-target/20240706T221823.204.utd.9ziundu4wnv66ay0ml08dh1uh-k24o.47262131\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwzMBgFo2AUDHcAAK0au4E=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_on_file%2Fzeroes.txt&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_on_file&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgyAQQNG7sG5FEBTcm16gFxiHIZqqEJk2bZrevSzf3/yvWE6KYhQLcy6jlLilZ7hCXpsPHIHezUEsX0qGtTxkynQCr+kocnaIs1HOGYed69Ba7U1rMLZae2V7FQeoDN56ja51ceiHTmm0gLH3SouL2ImXFOr7Nt0rmfa8AVMtEbZCvz9L5TBb\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/b8ccb418848c383c5529404cf02291561f7a04cd9592c808f767312c5acf6912?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/b8ccb418848c383c5529404cf02291561f7a04cd9592c808f767312c5acf6912?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_listdir_with_limits.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"143\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxVUIzJYNJEzK3PhD/3XF1zzmb+zGh0mQ6E4AinbVjzItfu8Lt282eXu1MsI+N9Sx3W0nyUkeSQ3EI+39rdsdme7m5k3JPAhXoDJEFnuvwZASVxBCzMokQste767lXBaUSHUjL5KLQ9wdblDMF\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"150\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2VG8FEUHrC/TiqYRmSxbTJmSn/iC+u+tp5vvmMB8TCk2mNQHI0lo7xrT6rctcv93i6VUvBPtorGe520KS1jKSHLNDOPxdtT9Vu+7mztp7EihAY4gs8FyGJyMozAzRSU1jNmYmhOT19XrpFUFzjg6kZnJR6PsDwEU1Eg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"150\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2WG8FEUHrC/TiqYRmSxbTJmSn/iC+u+tp5vvmMB8TCk2mNQHI0lo7xrT6rctcv93i6VUvBPvYWc9yt4UkrWUkOWaHcPi7an+qmu7mztp7EihAY4gs8FyGJyMozAzRSU1jNmYmhOT19XrpFUFzjg6kZnJR6PsDwGk1Ew==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits%2Fdir3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"150\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2aG8FEUHrC/TiqYRmSxbTJmSn/iC+u+tp5vvmMB8TCk2mNQHI0lo7xrT6rctcv93i6VUvBPvYWc9yt4UkrWUkOWaHcPi7qjlV++7mztp7EihAY4gs8FyGJyMozAzRSU1jNmYmhOT19XrpFUFzjg6kZnJR6PsDwI01FA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"567\"\n            },\n            \"content\": \"eJy1kcFuwyAMht/F16UqkAQC5z5CL9M0RQkY1VppokC7TVXefW7VHXbaZbtgwJ9+/b99hfI5IzgItEAFPaYRQ8AA7gpUMGVwL1c4DenBSIbwgyL31wr8gkO5waCEajbCbITeS+tk55R5EsIJwfyCeTovHnu6kU3batNKo5yVwWo/GkQUoUWjrdUh1LHB6G03tqqxXayjVl51Wns5jI1CqcaOv3TtLUunKVCkXx3MQznc/ec3t30edlz3mMu28NEfKRdO1r9TOfAjUcnbR1I/pYSnwsbzbSDzQhfO238H+us083k8kv8neV7Xj1UveKFM0wkcywtl61YYxbKmXl8ZncpwBFdXcJ8IQxVMMWbkq1jXL1pMpvY=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits&limit=1&offset=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"567\"\n            },\n            \"content\": \"eJy1kcFuwyAMht/F16WqIUBaznuEXqZpiiAYDa00UaDdpirvPqfqDjvtsl0w4E+//t++Qv2cCCyENEMDPWVPIVAAe4VUKRewz1c4uXxnJEP0kSL3lwaGmVxdYZAo1Qa7DZqD2Fuxs7J7QLSIzM9UxvM8UJ9WUmltOi06aSNS1Cj3rVTSO0TjvNNShNCZVhnhFToTFTFihkj85YPCuN+FNpBvW8HSeQwppl8dTK6+3vyXN7t9co9cD1TqtvLRH1OpnKx/T/WVHznVsr0nHcac6VTZeFkHMs3pwnn770B/nWY6+2Ma/kme1/Vj1TNdUknjCSzLr8IaO6O1kGp5YXSs7gi2beA2EYYaGGMstF6X5Qu4U6V3\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits&limit=1&offset=2&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"567\"\n            },\n            \"content\": \"eJy1kcFuwyAMht/F16WqIQESznuEXqZpiigYDa00UaDdpirvPrfqDjvtsgnJgPzp1//bF6ifM4GFkBZoYKS8pxAogL1AqpQL2OcLHF2+My1D9JEi99cG/EKuXmGQKLsNmg3qnRis6K3sHxAtIvMLlem0eBrTleyU0kYJI60IvVDt3hGfwakgZRQiKqM7L6TBTmoRQic9Yk89eRSEeqBWUdSmJdexdJ5CiulXB7Orrzf/5c1un9wj3zsqdVu5jIdUKicb31N95U9OtWzvSf2UMx0rGy/XgcxLOnPe8TvQX6eZT/tD8v8kz+v6seqFzqmk6QiW5VEOrcJeCmG0Xl8Ynao7gG0buE2EoQamGAvxU67rFwUqpaQ=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNjUEOgjAQAP/Ss9IWpBTuxg/4gd3uNhCBNnQ1GuPf7XEmk8xXzQdHNalZJJdJ67CmJ50hL80HduJ3s7Pol9W0lIdOmQ+QJe1Fu468QbSI6DAO7Ug9gG07dMHbPjrnwQZPZgjDZRx9qCGY2COaQKZm6qQ2ljlRfd+u94rCW15BuJoIa+HfH7wrMhU=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/63d80bb1bbb6bf729d5aa123b6c815f668a1c8d07c74998c1bba0f5bb0cd023b?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/63d80bb1bbb6bf729d5aa123b6c815f668a1c8d07c74998c1bba0f5bb0cd023b?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_listdir_with_max_items.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"146\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1F1BRNB6gW5chaGZksGkCZmpVsS7O67+e2/zPyZUnExngkjhztox5sVvoVD7htnj2s4o9rmznvhhK3Je6oh8KiDh+G/N4dzs+ztclAdkUREdF4nFU3UvkuASrI4EE5uNSSghe328XQdVrSWCoJYJIuP3B/7cNDo=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2VG8FEcGfF+jFU1iaLVlMmpDdakV8d9fTzHzfYT4mVJxMb4JI4d7aMebFb6FQ+4bZ49rOKPbZWU/8sBU5L3VEPhaQcPizZn9qdtc7nLUPyKJDNFwkFk/VvUiCS7A6EkysVmFnNiahhOz1+HYZdKosEQSVTBAZvz9sDzZH\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2WG8FEcGfF+jFU1iaLVlMmpDdakV8d9fTzHzfYT4mVJxMb4JI4d7aMebFb6FQ+4bZ49rOKPa5s574YStyXuqIfCwg4fBnzf7UdNc7nLUPyKJDNFwkFk/VvUiCS7A6EkysVmFnNiahhOz1+HYZdKosEQSVTBAZvz9sMzZI\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2aG8FEcGfF+jFU1iaLVlMmpDdakV8d9fTzHzfYT4mVJxMb4JI4d7aMebFb6FQ+4bZ49rOKPa5s574YStyXuqIfCwg4fBnTXdq9tc7nLUPyKJDNFwkFk/VvUiCS7A6EkysVmFnNiahhOz1+HYZdKosEQSVTBAZvz9sVzZJ\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir4\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02+FgVRAQfP9CNqzA0UzKYNCEz1Yr4746re+85i/sxoeJoOhNECnfWDjHPfg2F2jdMHpd2QrHPjfXED1uR81wH5GMBCYc/a3anZnu9w1l7jyw6RMNFYvFU3YskuASLI8HEahXuzcoklJC9Ht8uvU6VJYKgkhEi4/cHbHs2Sg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir5\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2qHgpiAj+vEAvnsLSbMli0oTsViviu7ueZub7DvMxoeJoOhNECnfWDjHPfg2F2jdMHpd2QrHPjfXED1uR81wH5GMBCYc/a3anZnu9w1l7jyw6RMNFYvFU3YskuASLI8HEahXuzcoklJC9Ht8uvU6VJYKgkhEi4/cHbJ82Sw==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir6\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2qOChICL48wK9eApLsyWLSROyW62I7+56mpnvO8zHhIqj6UwQKdxZO8Q8+zUUat8weVzaCcU+N9YTP2xFznMdkI8FJBz+rNmdmu31DmftPbLoEA0XicVTdS+S4BIsjgQTq1W4NyuTUEL2eny79DpVlgiCSkaIjN8fbMM2TA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=0&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"70\"\n            },\n            \"content\": \"eJwVxjEKgDAMBdC7/DmDk0OuIiJKfiHQULFZpPTu4pveQL43oTB/IDgYF81o0AFPRoduuyBbnhW6CqqHJ3QRtFI6/875ASfcFp0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUnjZm3U/IpqoqhGFQUI1tGZKmivzvJVG66KqbdgNIHF3dM3OF8rkgaPBxhQYMpgG9Rw/6CrFgyqBfrzDZ9GBohfASQ/3fGnAr2nKDgREmdqTbkfZAe02V5vKJEE1I5VfM82l1aOKNFFK2naQd014owlH0wbPB0oH2yikllPe2J461olWCM97RgTNPuVWkQxKIcFa1Aw1S1Og0+xjirw0WW473/vld71/sc70PmMu+1MOMMZdqZj5iOZpkL+buvX/IujklnErtnm8zWdZ4rsrm2+mvhZbTMEb3T/F1Yz+2veI55jhPoGs8YT2XVPZKdUpsbxWdix1Btw2MMcVSoQbmEDLWJ9m2L+DgpV8=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUnjZm3U/IpqoqhGFQUI1tGZKmivzvJVG66KqbdgNIHF3dM3OF8rkgaPBxhQYMpgG9Rw/6CrFgyqBfrzDZ9GBohfASQ/3fGnAr2nKDgREmdqTbkfZAe02V5vKJEE1I5VfM82l1aOKNFFK2naQd014owlH0wbPB0oH2yikllPe2J461olWCM97RgTNPuVWkQxKIcFa1Aw1S1Og0+xjirw0WW473/vld71/sc70PmMu+1MOMMZdqZj5iOZpkL+buvX/IujklnErtnm8zWdZ4rsrm2+mvhZbTMEb3T/F1Yz+2veI55jhPoGs8YT2XVPZKdUpsbxWdix1Btw2MMcVSoQbmEDLWJ9m2L+DgpV8=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kUFuwyAQRe8y2zrKGGywWfcI2VRVhTAMCqqJLUPSVJHvXhyli666aTcMEk9f/zE3yJ8zgQIXFqhAUxzIOXKgbhAyxQTq9QYnEx8MKxBdgy/vawV2IZM3GBiyZodyh+JQ96ruFBdPiAqx8Aul6bxY0mEjm7YVsq0lU9YKU/dOysF7yRpkVqBznGPLBieZqzs/mIYaHLgo0xNy5J3rPLXoeteX6Di54MOvDWaTj/f+6V3tX8xzmQdKeZ/LoceQcjHTHyEfdTRXfffeP2TtFCOdcumetj+Zl3Apyvrb6a+F5vMwBvtP8WVjP7a90CWkMJ1AlXhkPW9rwUXf8H59K+iUzQhKVDCGGHKBKpi8T7Rd1/ULBBiosg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUnjZm3U/IpqoqhGFQUI1tGZKmivzvJVG66KqbdgNIHF3dM3OF8rkgaPBxhQYMpgG9Rw/6CrFgyqBfrzDZ9GBohfASQ/3fGnAr2nKDgREmdqTbkfZAe02V5vKJEE1I5VfM82l1aOKNFFK2naQd014owlH0wbPB0oH2yikllPe2J461olWCM97RgTNPuVWkQxKIcFa1Aw1S1Og0+xjirw0WW473/vld71/sc70PmMu+1MOMMZdqZj5iOZpkL+buvX/IujklnErtnm8zWdZ4rsrm2+mvhZbTMEb3T/F1Yz+2veI55jhPoGs8YT2XVPZKdUpsbxWdix1Btw2MMcVSoQbmEDLWJ9m2L+DgpV8=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kUFuwyAQRe8y2zrKGGywWfcI2VRVhTAMCqqJLUPSVJHvXhyli666aTcMEk9f/zE3yJ8zgQIXFqhAUxzIOXKgbhAyxQTq9QYnEx8MKxBdgy/vawV2IZM3GBiyZodyh+JQ96ruFBdPiAqx8Aul6bxY0mEjm7YVsq0lU9YKU/dOysF7yRpkVqBznGPLBieZqzs/mIYaHLgo0xNy5J3rPLXoeteX6Di54MOvDWaTj/f+6V3tX8xzmQdKeZ/LoceQcjHTHyEfdTRXfffeP2TtFCOdcumetj+Zl3Apyvrb6a+F5vMwBvtP8WVjP7a90CWkMJ1AlXhkPW9rwUXf8H59K+iUzQhKVDCGGHKBKpi8T7Rd1/ULBBiosg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=2&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUHgbbrPsJ2VRVZQEeFFRjW4akqSL/eydRuuiqm3YDCI6u7mGuUD4XBANDXKGCHpPDYcABzBViwZTBvF5hsunBSILwEgO9bxX4FW25wSCYqHes2TF94J3hrZH6iTHDGPEr5vm0euzjjayV0o3ijTCe1cEjl7JpLbaaKdc4Z0PnO8cHG0ITlMBW6tqF4JxW0nZ0rV1jFQrJA0WneYgh/tpgseV475/fzf7FPtN+wFz2hZZ+jLmQWf8Ry7FP9tLfvfcPWT+nhFOh7vn2J8saz6Tcfzv9tdBycmP0/xRPE/sx7RXPMcd5AkPxTHRScd0Jrmu5vRE6FzuC0RWMMcVCUAVzCBnpKLbtC9USq6w=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUnjZm3U/IpqoqhGFQUI1tGZKmivzvJVG66KqbdgNIHF3dM3OF8rkgaPBxhQYMpgG9Rw/6CrFgyqBfrzDZ9GBohfASQ/3fGnAr2nKDgREmdqTbkfZAe02V5vKJEE1I5VfM82l1aOKNFFK2naQd014owlH0wbPB0oH2yikllPe2J461olWCM97RgTNPuVWkQxKIcFa1Aw1S1Og0+xjirw0WW473/vld71/sc70PmMu+1MOMMZdqZj5iOZpkL+buvX/IujklnErtnm8zWdZ4rsrm2+mvhZbTMEb3T/F1Yz+2veI55jhPoGs8YT2XVPZKdUpsbxWdix1Btw2MMcVSoQbmEDLWJ9m2L+DgpV8=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kUFuwyAQRe8y2zrKGGywWfcI2VRVhTAMCqqJLUPSVJHvXhyli666aTcMEk9f/zE3yJ8zgQIXFqhAUxzIOXKgbhAyxQTq9QYnEx8MKxBdgy/vawV2IZM3GBiyZodyh+JQ96ruFBdPiAqx8Aul6bxY0mEjm7YVsq0lU9YKU/dOysF7yRpkVqBznGPLBieZqzs/mIYaHLgo0xNy5J3rPLXoeteX6Di54MOvDWaTj/f+6V3tX8xzmQdKeZ/LoceQcjHTHyEfdTRXfffeP2TtFCOdcumetj+Zl3Apyvrb6a+F5vMwBvtP8WVjP7a90CWkMJ1AlXhkPW9rwUXf8H59K+iUzQhKVDCGGHKBKpi8T7Rd1/ULBBiosg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=2&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUHgbbrPsJ2VRVZQEeFFRjW4akqSL/eydRuuiqm3YDCI6u7mGuUD4XBANDXKGCHpPDYcABzBViwZTBvF5hsunBSILwEgO9bxX4FW25wSCYqHes2TF94J3hrZH6iTHDGPEr5vm0euzjjayV0o3ijTCe1cEjl7JpLbaaKdc4Z0PnO8cHG0ITlMBW6tqF4JxW0nZ0rV1jFQrJA0WneYgh/tpgseV475/fzf7FPtN+wFz2hZZ+jLmQWf8Ry7FP9tLfvfcPWT+nhFOh7vn2J8saz6Tcfzv9tdBycmP0/xRPE/sx7RXPMcd5AkPxTHRScd0Jrmu5vRE6FzuC0RWMMcVCUAVzCBnpKLbtC9USq6w=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=3&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kUFuwyAQRe8y2zoKYAyYdY+QTVVVCOOxgmpiy5A0VeS7dxyli666aTeA4OnrP+YG5XNGsNDHBSpwmDrse+zB3iAWTBns6w1OPj0YSRBe40DvawVhQV82GAQTcsf0jqkDby03ttZPjFnGiF8wT+cloIsbKZtG6YZrYesGe9Z6zZWQnDNe061WptHccyGDaUzHh0F5qTvfBtN30nRaoBFKh05zTtFp6uMQf20w+3K898/vdv/in2k/YC77QosbYy5k5j5iObrkr+7uvX/IhiklPBXqnrc/mZd4IWX37fTXQvO5G2P4p3ia2I9pL3iJOU4nsBTPRLsFSsqs5fpG6FT8CFZVMMYUC0EVTMOQkY71un4BGvCjvg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=4&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnWU4WGIWfcTsqmqysL2oKCa2DIkTRX53zuJ0kVX3bQbQOLocg9zhfI5EzgY4gIVtJQ6GgYawF0hFkoZ3OsVjj49mJohusTA92sF/UK+3GCQKPUG7QbNXjRO7JyyT4gOkfmF8nRaemrjjdR1bWwtrHRdjUIZ2w1dTUKj2Cltg25QWYWdUA0FFFh3tkcVpGkCSmFkoF4aHbRRnqPTNMQQf20w+3K498/vbvvin3nfUy7bwks7xlzYrP2I5dAmf2nv3tuHbD+lRMfC3fPtT+Ylnlm5/Xb6a6H51I2x/6d4ntiPaS90jjlOR3Acj7JR/MxOC6VxfWN0Kn4EZyoYY4qFoQqmEDLxUa/rF/z0o3M=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=5&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kUFuwyAQRe8y2zoKxgzGrHuEbKqqQhiDgmpsy5A0VeS7dxKli666aTeAxOPrP+YK5XPxoGGIK1RgfOr9MPgB9BVi8SmDfr3CZNODkQT5Swx0v1XgVm/LDQbOuNixdsfkoe50rXSjnhjTjBG/+jyfVudNvJECUbZYt1xzNQjfhA4VOkTX1j3nwbIeXcCeC47cSReE4ME12GDNRaPaXnQ1SpTSKYpO8xBD/LXBYsvx3j+/6/2Lfab94HPZF1rMGHMhM/MRy9EkezF37/1D1s0p+alQ93z7k2WNZ1I2305/LbSc+jG6f4qnif2Y9urPMcd5Ak3xjHf0RjUosOu2N0LnYkfQsoIxplgIqmAOIXs64rZ9ATOXpHg=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgjAQQNG7dK0U22Gg7I0X8AJTZghEoA0djcZ4d1n+t/lfM+0ymt5Mqrn01g5LevKZ8lx9aGN5V5uofV0sz+VhU5addE5bsVhjg8AOxqELMWCHjt0g0bMXIgDfQhMRiNsWxHWBXZSIGLyHGsmJOZlVdEp8vG/X+5Eqa15I5ZCRliK/P3h9MR4=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/606564d24fc89b96862d2ceb3d3eaa443745b64ad774e289d2beb66933406a2e?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/606564d24fc89b96862d2ceb3d3eaa443745b64ad774e289d2beb66933406a2e?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_makedirs_with_scheme.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"144\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiKD1B7pxFYbmloQmTchMfSD+u3F17zmb81ER4pJVnbpdB7VRrmCq4EQyd1qPIa12S9m3b1osXu0C0Y+dtp5nXcBpLSP4lEnc8e+aw7nZ93e61D+ApYLUMZFmWF/YPL04w6NDRK0JYg4kqP2JAuP7AxBEMz0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fdirectory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"325\"\n            },\n            \"content\": \"eJy1jk0KwkAMha8yzMaNWNSd67oXdCMIZehEO2h/mARUxIXtynN4AVFEEdQrpDcyileQkLxAXpJvo8H73OueDh3OB4aSMAfMqL9ySNj/zpraAsbeFeTyTJzDAmI3dWBVIX410VZWe8HYfE6MACkgKVFq5mCdx2jpKIkwTiCFoDAeMmr/tPPTbrAAM43EDTHlfj3Ryn4wGqTgC9ISiBQQzQwEgA985yNfJR8STz7zU/GrruqSb3/ikT8XVe/kx54voiWf6kq6sqW3b+suiaM=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"295\"\n            },\n            \"content\": \"eJytjk0KwkAMha8yzMaNWNSda7sXdCMIZehEO5T+MAkoiAvrynN4AVFEEaxXSG9kKh5BQvICSd6XrQbvC69HeuwwnRhKxgVgTuHGIWH4nXW1BYy9K8kVuWxOS4jd0oFVpeyrhbZyOgrmprWYAVJAUqLMpGCdx2jtKIkwTiCDoDQecur/dPDT4UIr23I7pOBL7gk1A0SzAiHyiZ985rvkS6LmK9eK382hqfjxrwfE+KaavZge+SZa8aU5SFf19O4Dh7F9rQ==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"279\"\n            },\n            \"content\": \"eJyljU0KwkAMha8yzMaNtOjStd0LuhEKZehEO0h/mAQUxIV15Tm8gCiiCOoV0huZFm8gIXmBvLxvq8H70uuRHjtcTQxl4xKwoGjjkDDqbn1tAVPvKnJlIc5pBalbOLCqEr+KtZXXUTg3bcQMkEKSkeRmBdZ5TNaOsgTTDHIIK+OhoMFPh7FWtuX1SEFHDISWA6JZgpD4xE8+8136JfXmK78Vf5pDU/PjX7AE3lSzl7Aj30RrvjQH2epA776aanfV\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"154\"\n            },\n            \"content\": \"eJwVjs0KwjAQhN8l0Js2VG8FEcGfF+jFU1maKQltmpDd+oP47q6nmW/mMPMxEeKTM625XTqzMb5gVPAimVtrhzmtbks51G9aHF71ArGPxrrAky3gtJYBfMwk/vDPqv2p2l3vdFbfgUVBVPpIE1wo3D+D+J4HjwjtMhUs0uiuIOaZBPpkpJnx/QEdxzaV\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"164\"\n            },\n            \"content\": \"eJw9jjsKwzAQRO8icJdY2OkMIQTyuYCbVGaxxkjYsoV2nQ8hd8+mSTVvZpr3NhHiF2cacz23ZmN8xqDFiyRurO2nZXVbSqF80ezwLGeIvVfWBR5tBi9r7sGHROL3v63YHYv6cqOTcgsWLaLRRRrhQubuEcR33HtE6JcoY5bqT7UaCGKaSKBOA02MzxdMzznu\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"174\"\n            },\n            \"content\": \"eJw9jssKgzAURP8l4K41qDuhlEIfP+CmK7mYkQSNCbnXPij996YbV3NmZnM+ykNsMKpVt0undsomjLlYkcit1sMcVrOn6Mo3LQavcoHoR6WN40kncFjTAD5GEnv4b0VzKurrnc6ZO7DkIjl6TxOMS9w/ndieBwuP/EVKWKTaqN6oyS4CH2cSZLuRZsb3B51mPUg=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"191\"\n            },\n            \"content\": \"eJw9js0KwjAQhN8l0Js2tL0VRAR/XqAXT2FJtiQ0aUN2qxbx3V0vnuabGQbmrRKyX5zq1e0yqJ3yBUcxnjlTr7WNy+r2kEO9wezwVc/I+tFoF2jSBWlZi0U6ZmB/+GVVd6ra6x3OwgMSi2ERk2BCFwqZZ2BvyHpMKF2GgjM3f2r/1AlFhNHICi0vZZNzjClHYJS7I0TCzxfrV0Ox\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"397\"\n            },\n            \"content\": \"eJy1jkFqwzAQRa8yaF1i2u6yTvaBZlMIGGFNapHaMtJAG0IXtVc9Ra8QCmpDcZMrjG7UcXBzgyI0X+jPzH87hd47r6ZqZsNmoalcOFtTWLr5sw2ENc2sx4Kc387PjVfKYCi8bci6WsbuGizs2qKBRoZhpYzsmWb3eti3xEAZSckrvUFjfcifLJV5KEqsMGu0l4DrUW9Gvc0eUa9z85e7UtCcmYAc4EgFF3siSBWGoB9QcPidj5A6/uY9f8n9kXPkPnXAp9Sllg//hCiZnxwhvUrKG0fRlj/kM6ZWooXkNDCJD2Ls5X3gHobCURAj9xP18gtWxbLw\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"194\"\n            },\n            \"content\": \"eJw9js0KwjAQhN8l0Js2tL0VRAR/XqAXT2FJtiS0aUJ2qxbx3V0vnuabGQbmrSKyT0716nYZ1E75gqMYz5yp19rOaXV7yKHeYHH4qhdk/Wi0CzTpgpTWYpGOGdgfflnVnar2eoez8IDEYljERJjQhULmGdgbsh4jSpeh4MLNn9o/dUKwJPZYjAzRciqb/GOMeQZGeTzCTPj5Ar/qRQo=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fdirectory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwVjs0KwjAQhN8l0Js2qLeCiODPC/TiKYRkSkKbJmS3ahHf3fU0M98cZj4qgUP2qlP3a682KlQMEgJzoU5rN+XFb22J7Wpnj3c7g/Vzp32kUVdQXqoDnYrlcPyz5nBu9reHvYjvQSyBRUyyI3ysZF6RgyEXkCCdIDjOdZVlRiqTZciXwU6E7w+UhTev\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fdirectory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwVjkEOgjAQRe/StVLa6kDZGy/gBYZ2JhCBNnQ0GuPdrbv/kpe8/1EryZSiGtT1clMHNe3EFSaRXAatw5Ie8Yh5bt64RXo1G4l+Gh3nctcp044yp61o5s4Rk+Gx7dG11oPpwhksnXxkCOB7Gl1vzWgZLIZgCNx/QPTRVr2Whda8oFD9wrgU+v4AfRYxqA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/ff73efe1fb08a3029617c562e49df6c698eb3821b2f62acc1e6362ac6d9d2029?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/ff73efe1fb08a3029617c562e49df6c698eb3821b2f62acc1e6362ac6d9d2029?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_makedirs_without_scheme.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwVjs0KwjAQhN8l0Js2qLeCiKD1BXrxVJZmSkKbJmS3/iC+u+tp5pvLNx8TIT4505jbtTMb4wtGBS+SubF2mNPqtpRD/abF4VUvEPvYWRd4sgWc1jKAT5nEH/9bdThX+/ZOF+0dWBREo480wYXC/TOobpWeB48IFQpinkmgF0aaGd8fszY0lQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fdirectory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"331\"\n            },\n            \"content\": \"eJy1jkGqwkAMhq8yzMaNWNSda90LunkglKET7aDtlElERVxYV57DC4giiqBeIb2RUbzCIyR/IPmTb60hBB90R3cdTvuG0q4HzKm3dEjY+87q2gImwRXkfC6bgwISN3ZgVSH7aqStWDvRn/mcGAJSRFLizEzBuoDxwlHq5xRjkkIGUWEC5NT8aeun7WgGZhyLARLyYTXSyn5IaqTgy9IQjgwQzQSEgQ985yNfJR8STz7zU/Gr2lUl3/4PSV5dVLWVN3u+iJZ8qnbSlQ29eQMpwoxT\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"301\"\n            },\n            \"content\": \"eJytjk0KwkAMha8yzMaNWNRd17oXdCMUytCJdpD+MIkoiAvblefwAqKIIqhXSG9kFI8gIXmBJO/LRoP3hdehHjhcjAylgwIwp+HaIeHwO2trC5h4V5Irctkcl5C4mQOrStlXkbZyGgZT87GYAFJAUuLMLMA6j/HKUVosKcYkhQyC0njIqfvT3k/7kVb2g26Rgi+8I+AMEM0cBMoHvvORr5IPiSef+an41dRNxbc//iDeF9XsxHfPF9GKT00tXdXR2zd3zYBd\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"285\"\n            },\n            \"content\": \"eJytjU0KwkAMha8yzMaNtOiya90LuhEKZehEO0h/mEQUxIV15Tm8gCiiCNYrpDcyikeQkLxAXt630eB96XWkBw4XI0PZoAQsaLh2SDj83rraAqbeVeTKQpzjClI3c2BVJX4VayuvUTg1n4gJIIUkI8nNAqzzmKwcZeWSEkwzyCGsjIeCej/tx1rZD7JDCr7QQIA5IJo5CIyP/OAT36SfUg1fuFH8avdtzfc/sCXzqtqd5B34Klrzud3LVgd6+wZhgnqF\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"157\"\n            },\n            \"content\": \"eJwVjssKwjAQRf8l0J02VHcFEcHHD3TjqgzNLQltmpCZ+kD8d8fVfS3O/ZgI8cmZ1twundkYXzBq8CKZW2uHOa1uSznUb1ocXvUCsY/GusCTLeC0lgF8zCT+8O+q/anaXe90Vt+BRYOo9JEmuFC4fwbFrdLz4BGhc6aCRRpFC2KeSaBnRpoZ3x/OKTft\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"167\"\n            },\n            \"content\": \"eJw9jr0KwzAQg9/FkK2NSboFSin05wWydApHrGCTODG+S38offdel07SJw3S20SIX5xpzPXcmo3xGYOCF0ncWNtPy+q2lEL5otnhWc4Qe6+sCzzaDF7W3IMPicTvf1mxOxb15UYn9S1YFESlizTChczdI+jcKh33HhFaJ8qYpfq7Wk8IYppIoLcGmhifLwqwO0Y=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJw9jrkKwzAQRP9F4C6xsN0ZQgjk+AE3qcxijZHwJbTrHIT8ezaNq3kzU8x8zATxizO1uV0aszM+oVfjRSLX1nbjsro9xZC/aXZ45TPEPgrrAg82gZc1deBjJPGHf5ZVp6y83ums3IBFjai0Ew1wIXH7DDq3SsudxwStIyXMUmxUblTpHcEURxLowZ5GxvcHaLc+oA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"194\"\n            },\n            \"content\": \"eJw9js0KwjAQhN8l0Js2tL0VRAR/XqAXT2FJtiQ0bUJ2qxbx3V0vnuabWZaZt5qRfXKqV7fLoHbKFxzFeOZMvdY2ptXtIYd6g8Xhq16Q9aPRLtCkC1Jai0U6ZmB/+GVVd6ra6x3OwgMSi2ERM8OELhQyzyB1KxuyHmeUc4aCCzd/av/UCUWE0cgjWk5lk32Mc47AKItHiISfL82ARQk=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"403\"\n            },\n            \"content\": \"eJy1jsFKAzEQhl9lyFm6qLee23vBXoTCEnanbqi7CclIK+LB3ZNP4SsUIVpkbV9h8kbOltU3kJD5Q/6Z+b8nhd5br6ZqZsJmoalaWNNQWNr5zgTChmbGY0HWP87PjReqxFB448jYRsZuHBZmbbAEJ8OwUqXsmWa3eti3xEAZSclrvcHS+JBvDVX2gfJQVFhj5rSXjMtRr0a9zu5Rr/PyN3qlwJ2xgCzgCAZ/9kSoagxB36EQ8RsfIXX8xXv+lPst58h96oBPqUstH/6PUmI/OEJ6kaBXjqItv8tnTK2kC8xpwBIfxNjL+8A9DIWjUEbuJ+r5B1QPtaA=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"197\"\n            },\n            \"content\": \"eJw9js0KwjAQhN8l0Js2tL0VRAR/XqAXT2FJtiS0aUJ2qxbx3V0vnuabWZaZt4rIPjnVq9tlUDvlC45iPHOmXms7p9XtIYd6g8Xhq16Q9aPRLtCkC1Jai0U6ZmB/+GVVd6ra6x3OwgMSi2ERE2FCFwqZZ5C6lQ1ZjxHlnKHgws2f2j91QrAk9liM/KLlVDaZyBjzDIwyeoSZ8PMFphtGYg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fdirectory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"159\"\n            },\n            \"content\": \"eJwVjs0KwjAQhN8l0Js2qLeCiODPC/TiKYRkSkKbJmS3ahHf3fU0M98cZj4qgUP2qlP3a682KlQMEgJzoU5rN+XFb22J7Wpnj3c7g/Vzp32kUVdQXqoDnYrlcPyz5nBu9reHvYjvQSyBRUyyI3ysZF5R5hY25AISpBYKx7muMs5IZbIMuTPYifD9AUemOQc=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fdirectory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzk0OgjAQQOG7dK2UavkZ9sQLeIFpZyYQgTZ0NBrj3WX5Vt/7mpV1SmQGcxvv5mSmneWISTWXwdq4pCedMc/VBzfid7Wx2pezNJeHTZl31DltxfaBHQAHJAzghCJSDRSkFiGPbRRk5+s2QCDX9Nhzd714hq6NTecI8JCV17yg8vEiuBT+/QHcxzMo\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/8be199ebadab91fdcad09dbf0ffd4a6cfae1406b9bd158a8e7324e976c571d9a?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/8be199ebadab91fdcad09dbf0ffd4a6cfae1406b9bd158a8e7324e976c571d9a?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_mkdir_and_exists.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"140\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxFJbuloQmTchupSL+u+tp5r3DzMf4SpPpjBcp3Fk7xrziHkpo37Agbe1CYl8Hi4FnW4nzWkfiSwHx579rTtfm2D/hpn0gFgXRcGnGUJ1OONoCC5udSSQ+o3497oOiUCoRhNRMEJm+P7RRMaY=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN9loTdtqN4KIoI/L9CLp7A0WxKaNCG7lYr47q6nme87zHzAV5qgBy9SuDdmjHl1eyyhfePiaGsXEvPqjAs8m0qc1zoSnwuKP/1dc7w0h/sTr9oHYlEQDZtmF6rVCUtbYGH1KjrYQSLx2enl4zYoCqUSUUjNhJHp+wMPeDOz\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir1&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Jt2sd4KIoI/L9CLp7A0WxKaNCG7lYr47q6nme87zHyMrzSZ3niRwj3AGPPq9lhC+8bF0dYuJPA6gAs8QyXOax2JzwXFn/6uOV6a7v7Eq/aBWBREw6bZhWp1wtIWWFi9is7sTCLx2enl4zYoCqUSUUjNhJHp+wMPnDO0\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir2&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Jt20d4KIoI/L9CLp7A0WxKaNCG7lYr47q6nme87zHyMrzSZ3niRwj3AGPPq9lhC+8bF0dYuJPA6gAs8QyXOax2JzwXFn/6u6S7N8f7Eq/aBWBREw6bZhWp1wtIWWFi9is7sTCLx2enl4zYoCqUSUUjNhJHp+wMPwDO1\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir3&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir3&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir3&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_move.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_move\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwVjEEKwjAQRe8S6E4btLuCiKD1At10JUPzS4pJEzLTooh3d1z9997if4wvmExrvEjm1toxpNXtKc/1mxaHV71A7HawbuanLeC0lhF8ziT+9G9Vc6mO3UBX5R4sKqLziGmD2ZkI8cnp//3WqwpiDiTQMlFgfH9YkCy1\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_move%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"135\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02VHcFEcHHD3TjSobmlgSTJmSmRRH/3XF1zzmb+zG+YjK98SKFe2vHmBe3pRLaN80Or3aG2LWzLvDTVnBe6gg+FhJ/+Ldmf2p21zudlQewqIjOI+UVyi7UzmxMgvjs9OZ2GVQFqUQSaJkoMr4/kREuwg==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/move?from=disk%3A%2FYaDiskTest%2Ftest_move%2Fdir1&path=disk%3A%2FYaDiskTest%2Ftest_move%2Fdir2&overwrite=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"135\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02WHcFEcHHD3TjSobmlgSTJmSmRRH/3XF1zzmb+zG+YjK98SKFe2vHmBe3pRLaN80Or3aG2HVnXeCnreC81BF8LCT+8G/N/tR01zudlQewqIjOI+UVyi7UzmxMgvjs9OZ2GVQFqUQSaJkoMr4/kTUuww==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_move%2Fdir2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_move&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNjUEOwiAQAP/CWcsClbK9Gz/gB7awpI1tIQWNxvh3yZxmLvMV88FRjGKuNZdRSr+mZzhTXroP7YHf3c5VvpQMS3nIlPmguqS9SHbRR+MtgeZBAfLUk7VWGWqYyTiPhjT4HpVxqPwQcQLUCM5fjAUQJ7FxnVNo79v13rTylleq3EqktfDvD3fwMKY=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/e8fcf3c6a02e7109eb4a66613a3a33b38c93a20c4913891c7f9b092908c53600?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/e8fcf3c6a02e7109eb4a66613a3a33b38c93a20c4913891c7f9b092908c53600?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_none_args.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 410,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    }\n]\n"
  },
  {
    "path": "tests/recorded/async/test_operation_error_triggers_retry.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"154\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxFYbmtgm2TZiZikX8d+PqnnM292MCozeNCapZGmu7MS1+SznWK80e73qG2tfO+ihPy5C0cAc5ZdJw/LfqcK72twddCrcQLaJlXMpg0phmB+bETjkOA1gcQ3k1GzNBQ/Ll+X5tiyqmPJKilJ5GwfcHzvU3sw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Ftest_file.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"127\"\n            },\n            \"content\": \"eJwtzEsOwiAQANC7sC8MPzv2HL0AKdgipuIwbazGuxsT1y95b7FQuohBLMy1DUpt9XYPMZE7X2XMrcgjrDE95Zp4cM7+veNAc2JlwHgwYEcAjw6kRi83jvKY9vLS0/7I1PqCnmaqpxhyV36vsYi9Ry0+X5NrKMw=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader49j.disk.yandex.net/upload-target/20250203T005840.185.utd.ycvkz1cvqirs7k85rgrp6dai-k49j.23887581\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrSS0uUUhJLEkEABG+A3s=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/copy?from=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Ftest_file.txt&path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Fcopy.txt&overwrite=true&force_async=true\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOwiAQQNG7sNbCEDpA940X8AKUGdLGtpCCRmO8u13+t/lfMR+cxCDm1kodpIxrftI1lKX7hJ343e3c5AskLfUhc+EjtCXvVUJ0gKw8GsegjY0m9KjBJQKfLExRKT953Rv0ngFtryMaIlTBTtpZEBexcZszne/beD+z8VbW0PiUFNbKvz86xjAu\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/1c816e09648e1247c4a56218fd19f71bc009b9254699e16752c64dd60a7b2871?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/1c816e09648e1247c4a56218fd19f71bc009b9254699e16752c64dd60a7b2871?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/copy?from=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Ftest_file.txt&path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Fcopy.txt&overwrite=true&force_async=true\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUsOgyAURuG9MG5FhIuPuekGuoGL/ERTFSK0adN073V4vsn5ivlAEIOYS0l5kHJa49NfOS3Vh3ePd7WjyJeSfskPGRMOLkvcs9RW09TAgEzNdQiuNZb7tiEOREY3rfLoLMEzOuegnK6tNT1Isw4TlLiIDWWO/nzfxvuZBVtaueCUwGvG7w+QeTGd\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/3635c2e4e540a0ffb746a9725af5543271de865edae8bbe1b306649e53a3fce1?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/3635c2e4e540a0ffb746a9725af5543271de865edae8bbe1b306649e53a3fce1?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/copy?from=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Ftest_file.txt&path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Fcopy.txt&overwrite=true&force_async=true\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzU0OgjAQQOG7dK0U+gMte+MFvMB0ZghEpA0djcZ4d1m+b/O+at55UqOaRUodtcY1P+kMZWk+sBG/m41FvzpNS73rXHgHWfJWNZH1aDhiTDSYkAYcHFrbsnO2S6FvAckjIxnnUwhdyz5FkyD4OJFPvTqpB8uc6XhfL7cjhR9lBeFDJlgr//660TID\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/dd35c2e9c9bd728b7c74c330e4431b860acd5cecd245b8810e5b92ba859fd5b6?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/dd35c2e9c9bd728b7c74c330e4431b860acd5cecd245b8810e5b92ba859fd5b6?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Fcopy.txt&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUsOgjAURuG9dKyU0geVuXEDbqDl/g1EoA29Go1x7zI83+R8xbQjiUFMzKUOUo5LftI5lLn5hI3wbjawfClJc33IXLAHnvNWpYk9uaRGr4y++NQqGHSw40XZ5ADfWq+j9uS6EHXrHSWiXunYW2OJohEnsYKnTMf7dr0fyVjLEhiHpLBU/P6OzzF9\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4b7d6f1c814398f01e4e2e5c915f6ee80583b38d62ab3086dfdd713b7545ddb4?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4b7d6f1c814398f01e4e2e5c915f6ee80583b38d62ab3086dfdd713b7545ddb4?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_patch.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"129\"\n            },\n            \"content\": \"eJwVjc0KwkAMhN8l0Js2qLeCiODPC/TiScJuSorb7rJJRRHf3Xia+T4G5gNSeYAOxKxohxhSXuKayti+aY78amc2fG4wjvrAypqXGlgPhUz2f9fsjs32cqOT957VHMzj7oMgsIKJTXL0g+u5dzSeSiJjNwMl5e8PhkItDg==\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVkouLS7Jz40vKMovSC0qyUwtVrJSqFYqSS0ugYlVAkWUPNVzFRIVyhJzSlMVlWprAVjPFBg=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"537\"\n            },\n            \"content\": \"eJy1kTFvwyAQhf9KytKhiXIYY2zmLt2zdLIIHApqsBHgqFGU/95L2g6durTSSUinp/e+e1zYZCIyzSqWOiZT7YGtGb4Hz/TlumYZy7xki2NwJGql7JTkqtGAvpe8db0E56VAKW0rHdhWDcp4b73r98p3nUFlwDcOwInGDp3ojLHKcwqxS6lzHFOeE+YasFDiF8bn6kyJL49xZVYnc1zwgRGPzWgq3lgaaNoNqA3nO95rICTxBKAByDrOLvjwq4zOPZDEhfKmt6/mmd4d5W9/dGHnGHGqVMAdMOVwIoLxu5i/biUt+2Ow/2RPBdZzwvvNmd1+9xRKmCemyR5ohkYIoST01w9wTZ+l\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVkouLS7Jz40vKMovSC0qyUwtVrJSqFbKK81NSi0CMk2MamsBDR8NYw==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"549\"\n            },\n            \"content\": \"eJy1kTFvwyAQhf9KytKhiXLGYDBzl+5ZOlkYDgU12BbGVqMo/72XtB06dWmlk5BO7+5997iwwSZkhhWcSzfZ4o5sy/A9BmYu1y3LOI9LdthFTyIhZaNkpbgBDFpWwmsJPsgapXRCenBCtcqG4ILXvQpNY1FZCNwD+Jq7tqkba50KFZm4ZS5j6qY8TphLxJkcvzA+W2dyfHlMG7tZ7WnBB5oZltRjZkZwYnMZbcEbFwcudqB2VXWotAHCq58ADACNpNHHEH+V0elHkvg4v5n9q32m90As+x+5uDElHAqFcYedclyJoPsO6a8Tmpb+FN0/racAy3nC+82Z3X56jXMcB2ZoPVC1vFZSgNbXDzhfo0Q=\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVkouLS7Jz40vKMovSC0qyUwtVrJSqFYqSS0ugYlVAkXySnNydBSU8kpzk1KLoPzaWgDlExcB\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"509\"\n            },\n            \"content\": \"eJy1kc9qwzAMxt/F17VU8Z848XmP0MtOwbVlapbExnbKRui7Tx1ssMNuGwh00Cd93w/tbLULMsMa1jZl29yVHRi+xcDMfj+wgjVtxeEUPYmkUr1WneYGMAyqk35Q4IMSqJSTyoOTetQ2BBf8cNGh7y1qC4F7AC+4G3vRW+t06MjEbbWlZcolZSwtYmVm3eaZBgVtw4cfBy6PoI9dd+4GA2QrngAMAK0vyccQf5HJbxkhXUniY301pxf7TP1MqKcfvC4tC66NICnEznKJN0owfcH/NXneLnN0/3SentbeM34yF/b44C3WmFZm6DxQjVwKDVyI+weUQJZA\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_permanent_remove.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_permanent_remove\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"140\"\n            },\n            \"content\": \"eJwVjUsKwkAQBe8ykJ1mUHcBEcHPBbJxFZrMCxOcH9OdoIh3t129qtq8j/EVk+mMFyncWTuGvLgtlbl9U3J4tQli1511Mz9tBeeljuBTIfHHf2sO52Z/e9BFuQeLiugMBTVSQpKhIuYVZmMixGenX/drryqIJZBAy0SB8f0Bt5YxtQ==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_permanent_remove%2Fdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"146\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxVYbmlgSbB5lpUcR/d1zdc87mfoyvmExnvEjhztpxzovbUgntm5LDq00Qu+6sC/y0FZyXOoJPhcQf/605nJv97UEX5R4sKqIzFNRICUmGiphXaHehmo2JEJ+dPt6vvaoglpkEWiaaGd8f5AUzkQ==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_permanent_remove%2Fdir&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2F&offset=0&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"72\"\n            },\n            \"content\": \"eJwNxzEKgDAMBdC7/DlDFpdcRUSUpBBoqNgsUnp3u703kN9jEKi/IJwWt6maQgY8LTpkPwjZ8qoQJlQPT8jGy62Ubis85w9RhBb8\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_permanent_remove&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_public_listdir.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02aHcFEcHHD3TTVRmTKRlMm5CZiCL+u+Pq3nM252MWlJC86c3tMpiNCQVnhSCSubfWxVT9FjK1b1g9vtoVxT531hM/bEFOtTjkYwYJh79rulOzv45w1j8gi4LoTLneI7kpEounoh3BJUcQ1PIMkfH7A93CMNc=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwljsEKwjAQRP8l0Js2qLeCiKD1B3rxVNZkSxbTJmQ3ooj/7oqnmfcuM28zo4TkTWcu58GsTCg4KQSRzJ21Lqbq15CpfcHi8dkuKPaxsZ74bgtyqsUhHzJI2P9cszs22/4KJ+0DsiiIxpjrLZIbI7F4Kmr/QgcF5xxBUC9MEBk/X6GcM/M=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwljsEKwjAQRP8l0Js2qLeCiKD1B3rxVNZkSxbTJmQ3ooj/7oqnmfcuM28zo4TkTWcu58GsTCg4KQSRzJ21Lqbq15CpfcHi8dkuKPaxsZ74bgtyqsUhHzJI2P9cszs22/4KJ+0DsiiIxpjrLZIbI7F4Kmr/QgcF5xxBUC9MEBk/X6GcM/M=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"768\"\n            },\n            \"content\": \"eJy1UtFu2yAU/Rdem86ADcRIfdhWtVvauttkp02mKcIGLyi2sQ2O4lX59+K02x4nTdsL3HM53HvugSfQCrcFHEhtdzxYiUu/p8q6wPll0w55pYtNpa2Tug9eIJgBN7bqdKn3oBH1BH4dFr0STkmfwhCTc0jPEU0R5iTkYXgGIYfQs2ojdan/SHtVsFOjJ3bp2SK5S24/Pd4ncv2xuL3avb1q3w3lzUMSZoebrVkmXbcibJ1cd6v1+7tsRT/U45DFhzyCDnXBguZt/WW8X5gmDZfmsbkU3y8ufvcZ+sr32TrXWh4Eo5D6jd0FMsjwPmyvlw9pkY0/Pnv+RtW5knLS//R3Hla61g5wDGfAlKVVPvahNb0PwOSxcaI65bRTtQX867fjDPTKmqEv1EZPzkWEUEYQw1zNJWZRjAmLwjIPKWEIMlTQXMR5TuJ4LhiN4gIJFAlUwgJHNGYsx5AgGM2ZAlPpvbbaNIAjRiBk8wiFFFGMkH9TU9eqcb6rPQ38MtNPMf9aSdvrvf9C/6m+d1EddOnnOB6fAfmN5io=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Ffirst.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"130\"\n            },\n            \"content\": \"eJwtzEEOwiAQAMC/cO/CsgUi7/ADKKsoTdvQxVSNf/eg98m8VWl8UVEVkXWLWvd1WlLm5v1jSpBvW4VnmjPvMLPEcaS/GCS1K4u2xjrj0R/ROSIH5Am6ZEB8Gaa7nO3SMVDNaT/VMhs31F8d0NpDUJ8vA3ApMQ==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader66vla.disk.yandex.net/upload-target/20250616T155335.363.utd.11z0e3jtc2ou173kdaxbkhn05-k66vla.712297\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJxLrUjMLchJVUjOzytJzSsBAC/sBgg=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Ffirst.txt&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"159\"\n            },\n            \"content\": \"eJwljssKwjAURP8l0J0mqLuCiODjB7pxVWJzQ4JpE3KnUhH/3Suu5szZzLzVSAjZqVZdz51aqVDJSwlA4daYIeXZrW2J+mUnR4ueCOa5MS7yw1TiPNeB+FAswv7nmt2x2V5u9iTcEUMKJPoy31Mc+hQZLlaxfyHgY2VoLJBx0FiSBckdbxPT5wsrwThG\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Fsecond.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzEsOwiAQANC7sC/fAQzn8AIYRoo0tYFpKzHe3Zi4fsl7s7nhnQU2E209CLFvyzMmbMo+eCq98hHXhC++IgUA8/eJYstIQkttpVPuqqw1xnPpgO+UONpy3HKhQ0L35zlGH7maRY+p/mItLwAeFPt8AblfKRo=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader15j.disk.yandex.net/upload-target/20250616T155337.064.utd.e5ivbgitv04s7wwyysygk3l2y-k15j.20844741\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrycgsVgCikoxUheLU5Py8FIW0zJxUAGVuCHI=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Fsecond.txt&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"160\"\n            },\n            \"content\": \"eJwljs0KwjAQhN8l0JsmqLeCiODPC/TiqazJlgTTJGQ3UhHf3RVP8813mXmrGdlnp3p1PQ9qpXzFSYpnLtQbY2Nubg0l6Bckh4tOyOa5MS7Qw1Sk3KpFOhRgv/+5bnfstpcbnIQHJJbCEmNp9xjsGAOxC1XsXwgQ2pyc5oVlnXEuERjlzwSR8PMFY484mg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Fthird.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"130\"\n            },\n            \"content\": \"eJwtzEsOwiAQANC7sO8A5SPlHF6AhJE2VEA6Na3Gu7vQ/ct7s7njjXk2E7XNc763tYaIXZu8JojLluEMJeIBBclrrf5ioNATEh/FaISV9iqNUcrBZCzsFMHWWrH06UyP0I6l6mfseXzd5ZB/9UU64TT7fAEu2iqO\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader45klg.disk.yandex.net/upload-target/20250616T155338.956.utd.6oooenr9ygqapxio4vdrk2zm1-k45klg.718084\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrycgsVgCikoxUIM4sSlFIy8xJBQBc9ggR\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Fthird.txt&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"159\"\n            },\n            \"content\": \"eJwljsEKwjAQRP8l0JsmqLeCiKD1B3rxVGKyJYtpE7IbqYj/7hZPM/PmMPNRE3BIXrXqdu3VRoUCo4TAnKk1xsVU/dZm1G87e1j0DGxeO+ORnqYApVoc0ClbDseVNYdzs+/u9iK+B2IJLDLk+ojohojEHovQP1jrgMVrXljGGaYcLYPcGW0k+P4AKp44OQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=500&sort=modified&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"3976\"\n            },\n            \"content\": \"eJzNlmlPG0kQhv/LSPGXAO77sGStICTckBBMMKuV1Uc1nhiPx56xwYny37eGJSEbJUCu1Ur+MD1q13RVv+9T9T6rlyVknSzms2wlG8DYQ4wQs877bJJSBXXWISvZZT7O8UkSfK4ntbvMOnwly2sYV1nnz/dZ6eohBmmnfFbVa/V1jbFuA6f8EnBVuPE/q7sNYQaubj6VMcLkKlGrVJ1Q1pG8w+VTQjqE4K7xJOYpf3Bblb/D+FTiH/IxDG4/XsN13S4vXV40kaLEV5CISlolyZ3gRgVwxkaQPHprqQfXxBo6JhXudSwCCO2dYspYJqOzWkvivBbMu6R0IgxY8lIEYDwKa5NXyklPGGOWcIxVzv1lHgYjWGK86cnT3cODw/2XZ0eH8Xwn7L8Yrb8oN+Zp780h713vDSenh9NpX+rzw61p//zZQa+vtsfLec9ee0FqOm3vKl+Oj5dHu5PihJ9OzopNd9Ht3n1nPsOryYZ1XVaddnvpYr5WjdqxDaQsrw6uSnJxMn673hQDYu4+lilOwnwMRXMpM6gm81mAQd5UXEiptKSadbSUnAYSXKJWWy4E9ZwoqxlQDp5rQSJLNgFYSZmJlnNtpTCEEG0VS+4m9CKv8kmB14RFJNoIqlQTl6EWJuPmAPjVqpHebTYfD/OrT1LO8gVK7zfF/7CSwXWeMA98ckWdL/LZvBpUtavnmF0WLsE1erxxxt1lxclVcTlxEWZrMa9Ga0tXRLhem83bzbIttQqB+UR01BwMI4IILUB576KLyboUrJTW0KBIDAT3BREJ9dJZEaRwbWUkEYGKdlFt74zgbK9wx1vlybIgvfx4erah034+LY735Invbw/fPYPno9DbIQdXcrs3FOurO+UkFycm8sXzql73VW/Et/aqHXYU9vcX4uIJ38TfH/M8dkmrSa1xfPeT31uYRDmp8hoF0HV17cKwufDW0FXDbuuGL/i/MCnqRgaNLruNeZ+wFzf2bWFxYDa4jd6YvUtla4hLhf7UREjDgmLSBCYlC05aGj31NrrWndK7H3XeqkfForvgLajRPo8gwiKHq2oQJvOi4eGHlTviVYBnjvch71877mOefhzz9BfMY/xB5iWuAHMDLjxqGYUTMFUjWGLUCmDwOfM0ri2KTVEvJFYzCBoJM8FrzlNyiXkdIiQUumCEa5+wykIqEWM0nkr4/zBvuFwutlzfzcPBu4OLH2Ce1CRxpoBQaZOCwJUjQrhIqfCSaULQrMYFaUiUAEpiQWw0xNJkHBWUf515RnDLuPgu5v2Ck9zLvJ+O/3uYp4JzOI8oY9DdnqN8RYLELXfUhuRZsEYolXiiIiDqvGKNsLmOCiVq0kPMO+cbR4d7dnt/dP72+dgNxxd1LI8OBrtuYzboJ6ur4dVb/4rR1+Pp+Wx0sruzerb/xpwdmn75qjc4X/868+4M/+uhx/gN9Lxj1gECykdiNDYBqoV1jmLiTgcLD0PvEUj4NvTqYT67l3mfb7gPefZxyLNfIo89iLwAnkRkulMoZjSdtV5LTJdBwEahw+fIi2hLbAG4wskN5RM44BtFkrWoKoNNNfAERptEsDXwJDXYGITFzkMcNv//D/Iuit5eGh1tvtnrX4x/BHkqIemZ9sYrh/OESIyBjpFpSq21zCjOPabd8B87Jo4dSH/Ui5WgbKKOfR151nLC7PeNeb/gJPci76fj/x7kMWo8kRwbKpcIP2OVwekOmA5BOo2TnpAsRsE9WM8Yl0IKhdOK0lyhb6x/AHn9ndezEX/L3Jvj45fu2C9fWrmxeRq929gcx2HfbK76s9OrTbM1NbR8l29tLi+WcgqGLy6L7XP9DeR98vtvIB67IZ6xCfuTEkLxEAUDEbHt4OAhKATton+YeI8gwhfE++u/8vWHD38DFDTGgg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&path=%2Ffirst.txt&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&path=%2Ffirst.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"505\"\n            },\n            \"content\": \"eJxFkVtvm0AQhf+LJfNWwy67C46EKjuJbQzGlQWp7Zdo2UtZYZbb2sGp+t9LkkqVZqQ58zD6zpnfk6ITcvIwKYxp+gfb5vWbvtSUi27GVV/O7lRzMcy6q/0hbeEAzubAc6jHEJWUQ4dIyQiFyJ8LBriPMfR9KIAkwCUSiXGGAmOKxibUJj52EAPI1v0mLMUx0vSwbtK7djJ1aI9LT8aq1YcIp/lpU7w/iueSZaGze8ObrECLb2FTK5T63L0992aR91nprqM+hHsWxzf0a+o+jfX9qnjgWFJdhKaVCKTqejMzg7FGE03dK6NqHVBjKCsqoY1V0L4I2nQKl9tkl8Q/jvuEn0MWr8rFqlleZfQzcbMhKuqXpG1P2Dsn6/Z0ftxlJ7Kp7tdsPuTIMaC1tyRvqsN9v6116r7UR/1E/zFN3YX9n+OiKmVGRFZrMwK8mnsjAiMGM4Wr5kKVtsY/iO71w8iYHPEw8KAle/UuAoCtYlwT5OWeg7APGYHYZ3BMnlE8BzwH+ZxTqxJc0a/LvGbXT6Om1Lfg5k7+/AUcW6YT\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/e01dc9170a7c4afad206ffc6a2489ec1d8552882e1f6136f4e82e2e55a455a6a/68504c14/nsHIkeXKnaRGpTyn0UiRqXB7fLiqnRK5TbYHhzCeEkcUI0Mw5HUh4A-Ipoi4T8d3vEstAbsUk3GKsI2OcLLv4g==?uid=0&filename=first.txt&disposition=attachment&hash=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D%3A%2Ffirst.txt&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=15&hid=647b704582c6258c2552ca591db1b9da&media_type=document&tknv=v3\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJxLrUjMLchJVUjOzytJzSsBAC/sBgg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&path=%2Fsecond.txt&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&path=%2Fsecond.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"507\"\n            },\n            \"content\": \"eJxNkUtvm0AUhf+LJbOreQwwTCRU2U0dG9u4cU0CbNC8CBPM8BoSaNX/XtJsKp3NPYur79P5vSg6ni/uFoVSTX+n66x+l7caM96tmOjL1YQl4+OqG/SPU3cd7iEDEsAQYLlLAUSI2iZhnFHHBDkgnDpObpDcs6BhexBQC+c2NE2OPciY7nqOYVPT0WW/25c8Pkh8eWiukzQicWlTsDmHB7Q7lunr9woX1YtizfmUBXjTZUmOYF+8v5JHy/xZtWlXXoP9l/j47MWhlzSPUZaul+B+ztdBMN/QcnHjElfc7zmtJVupUWmzRVP3Qola+lgpTIuKS6UVuC/89rq0NkF4Co8/4nPI0j09bsv1ttkM+eE5BNF4KOqnsG0TB6bhQ5uk305R4u6qaYjQSGxDma0euKSpLtM5qOUVPNWxvMcvn1BLsNb/A7mJSqgZci7UTJCpqeG+4qNaWtvmhoXU5iV4l32o2I7jQseElpb34hf3LaAVc02whTBnBBFmeJC7xIQ2wthkLsWQIq5VnAn8+ZnVdPhnqkr55r+BxZ+/zYao3w==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/65e8907b3d93df6c3799c41bdedc513f3bec55f0bf82704873c2af4711ea87dd/68504c15/nsHIkeXKnaRGpTyn0UiRqZ3BONK9HLkZjEmahmgtdpOM_JaBr_Yf97shwjbQ21SmqZrkTJI-XLW8XN8YpQU_ZA==?uid=0&filename=second.txt&disposition=attachment&hash=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D%3A%2Fsecond.txt&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=23&hid=ba29aedb9bd087e6b1749aa1d6ca7c9e&media_type=document&tknv=v3\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"23\"\n            },\n            \"content\": \"eJwrycgsVgCikoxUheLU5Py8FIW0zJxUAGVuCHI=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&path=%2Fthird.txt&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&path=%2Fthird.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"505\"\n            },\n            \"content\": \"eJxFkUtvm0AURv+LJbOrgXnAEAlVdpGfCbGo7RhvohlmCFNgeA0OpOp/L2kWle7mfourc777e5a1Ip09zDKt6+7BNHn1roqKctEuuOzyxUgVF8Oi7c3P1UREMAoBJ5wx4AKXAYywxxILpB5HNvGg7ToOEwwBaAPEUsiEC1OPIZsSwT3TIdhCie2YqtvucnE9KBpt6tOorLOMmnj3s83hL0BfouhIIzYePbwKLpzRVVDyLCbBN3a9vAdk0xC7/pCbYHwbcSMIvBdqe3OXcxhM872X3LeMVBZC0VL4OpMtX+hBG5NEXXVSy0r5VGuaZKVQ2shol/nNaQ5W+/ApfDxen0N+2yWP63y5rld9engJ4Xk4ZNUlbJoYu7dw08S3H0/n2NmWY3/2BoYsbTfm3mF1GY3P+0qd4KW6qoC+fTHN4dL8z1HIUuoJMamUngBe9VhPmGLQc7CuCyqVMf1BtK+fIghjx8W2C4y0kx/CB8DIpph4KXCEg5ADE46AQFP/0EMY2SJxKWdGKbikX5d5lfT/RHWu7v4dzv78BfYPpjI=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/48eba32d8dbb2727b25459bc02f9d418931766beb423124bf3be73f9b41a8ed9/68504c16/nsHIkeXKnaRGpTyn0UiRqYISrk3j2aWRRPaRbyP95BDVdbaBDmdhY8D-bXVwD8Gq81pziGDygy5qe83vlnHZ7A==?uid=0&filename=third.txt&disposition=attachment&hash=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D%3A%2Fthird.txt&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=22&hid=89f26e64463cd42e4d41394541ec7adb&media_type=document&tknv=v3\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"22\"\n            },\n            \"content\": \"eJwrycgsVgCikoxUIM4sSlFIy8xJBQBc9ggR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/unpublish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwljsEKwjAQRP8l0Js2qLeCiKD1B3rxVNZkSxbTJmQ3ooj/7oqnmfcuM28zo4TkTWcu58GsTCg4KQSRzJ21Lqbq15CpfcHi8dkuKPaxsZ74bgtyqsUhHzJI2P9cszs22/4KJ+0DsiiIxpjrLZIbI7F4Kmr/QgcF5xxBUC9MEBk/X6GcM/M=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=qT%2BJNMNLPXONdZIcLFkAFpBufKWN3UxKhoVNqqY57ZNGqYZCMUY6HmyuU9xb40t1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzk0OgyAQQOG7sG7lR0Bwb3qBXmCAIZqqEJk2bZrevS7f6ntftiHNJbGR3aY7u7D5wHzGTFTbyHlcyzNdoS7dB/aE725H4i/J09IevFQ8gJayNy5MECEIK70fYlK+N5iyMypY6YSXfYzOWqu9wayUFhqCttGgi944QDOcMuFWVyA8XzKsDX9/Pn4wwg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/05b0bb061997cd2935edf852b6180913cc8666495ef22404ab46c5e8c958ae57?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/05b0bb061997cd2935edf852b6180913cc8666495ef22404ab46c5e8c958ae57?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_public_settings.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"309\"\n            },\n            \"content\": \"eJyVjcFKAzEQhl9lyFnae8/tvWAvQqGsu2Md1E1IRlDEg7snn8JXKEK0yNq+wuSN/LfoA0iYyZDJ/31PjmP00c3cXNLNstLrpZdW08ovHiQptzqXyLX6+Lg4fTxzDac6SlDxLWLngWu5Em4oIExr14Azm15UI2/FSaeKtgn3l7dSbxKrSrtNa0fh5CH1xL8mav5UE2juOKVqy1DYmx2o9PZlO/tEfeMcbCg92bH0pbP9P7TgfFim8oLkq2Xcnb3jMZcOONCPowd7wmKHeW8Djc0ytNmGiXv+AcSZkZg=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_settings&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"139\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4btLuCiKD1At10VcZkaoJpEjITUcS7O67+f2/zPmpFdsmqXl0vo9ooV3ARcMyZeq1NSNVuIfv2DdHiq43I+rnT1tNDF6RUi0E6ZmB3+LumOzX7YYKz/BGJBVhmzvUWvJkJmX28k4QY1xyAUdILBMLvDxFuMU0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"770\"\n            },\n            \"content\": \"eJy1kl1v2jAUhv+Lb6GL7Th2sNSbtqOobJoS0YlpqpDjDzDgJIsNLVT89zqs1a6maVJ7Y59z/Oic97zyM2hFWAEOlPUbnvwQN/GeaR+SEI9Fu6u2Vi68DsHWSw+GIBxafca7mNTC9clfUNlpEbSKAIY4u4D0AtEZQhxjjtEAQg5hpFyjrLH/xF7bb/Qhgvlk+nVdHMmEbNCcfK5NcSznUzJt92xcfhkkq8o83rpysL7SY2sqd7Uuyokl1+T+flw8CfYruaNV68rDt7umnqXfm3l9I5aXl3/m7LptnLMKofU8SQ5C2U9+k6hk+TgZm9vjkrRlyIvIL7SrtFK9/uf/9XJrnQ2AYzgEjTHxAfAY+qaLAei9boLYnms2aOcB//lwGoJO+2bXSb2wvWckyyjLEMNcpZWiTFImUjMaIShTpHRKCcKM6BQRMpI6yw2jKs8kNblMRYUgNCJlglI5An3rvfW2qQFHLIOQMQoJozlOowTZOKfrEKf686q/t3kT895K2s7u4+f5oP7RRf1kTdzjdHoBW+jqiQ==\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/public-settings?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVipILC4uzy9KUbJSUDI0MjZRqgUAR9IGGA==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=https%3A%2F%2Fyadi.sk%2Fd%2FgwHFfGzg4pRt8Q&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 403,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"122\"\n            },\n            \"content\": \"eJyrVkotKsovUrJScskszg6uzM3JzMsOSCwuLs8vSglKLSzNLEpNcQUr0VFKSS1OLsosKMnMzwNqgKlSKIIqA6rITS0uTkxPBcpeWHSx4cLWCxsvNl/YerHpYuPFfoUL+y9sAAruu7D7Yo9SLQCU7TbL\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/public-settings?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVipILC4uzy9KUbJSUDI0MjZR0lFQSixLzMxJTMpJjS/NK8nMAUoZ1gIAHrUNXw==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/public-settings?path=disk%3A%2FYaDiskTest%2Ftest_public_settings&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"21\"\n            },\n            \"content\": \"eJyrVkosS8zMSUzKSY0vzSvJzFGyMqwFAFhtB9Q=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2FgwHFfGzg4pRt8Q&offset=0&limit=20\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/unpublish?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"139\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4btLuCiKD1At10VcZkaoJpEjITUcS7O67+f2/zPmpFdsmqXl0vo9ooV3ARcMyZeq1NSNVuIfv2DdHiq43I+rnT1tNDF6RUi0E6ZmB3+LumOzX7YYKz/BGJBVhmzvUWvJkJmX28k4QY1xyAUdILBMLvDxFuMU0=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_settings&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_publish_unpublish.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"313\"\n            },\n            \"content\": \"eJyVjcFqAjEQhl9lyLno3bPehXopCLLdndZguwnJCC3Fg7unPkVfQQpRka2+wuSN+q/YByghkyEz//d9GA7BBTMyYxtX00KWU2driTM3ebNRuJaxDVyKC++T6+KdqTiWwXqxrkbs3nNpnyxX5BGmuanAGQ0fip434yhDQVn49eOLjcvFur51c0P+aiJxxDcXVX+yAUSvHGPxzJDol54pt3rSnR5wf3DO2uWW9JLb3OjxX2KQ9poob5H91IS30W98ptwACP6lN2FOGOzQH7WjvmiCOGk3MJtf0MSTWg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"141\"\n            },\n            \"content\": \"eJwtjUEKwjAQRe8y0J02qLuCiKD1At24KmMzJcE0CZmJKOLdHcHVf+9v3hsWEpcsdHA5D7ACV2hWcSKZO2OmkKpdY/btC6OlZxtJzGNjrOe7KcSplon4kFHc/vc1u2Oz7a94Uh6IRUV0xlxvwbMba/yTpoSWHFBI4zMGps8XeWMyLg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"776\"\n            },\n            \"content\": \"eJy1Ul1v2yAU/S+8Np0Bgz+Q+tCtVSdHU6UmqtZOkwUGOyzBOICzulX++3C2qk/TNGl7gXPR4Zx7D7yAgYcNYEBqv2XJA7+K+1r5kIS41MModtpv6rH/hcAChGlQpwsuFj03c/FbcuMUD0pGCoaYnkNyjss1IiwtGCRnEDIII8tYqVv9R9pJtqm3apr9p1Qgere/pujT9dYd3t84gp3pVpJWT2e9fF49fljux/30QL/d6wo/ysofOnMJl930kaNhn1SZGMzddFvZfp3e28/9Fe8uLt58RreLPpsQBs+SZOJSv/PbRCYdv7nV9arW3eWy/B75tTJCSTn3//L3ee600QEwDBfAtq1XEUforYsAzHnbwHenMx2U8YB9+XpcAKe8HV2jaj2nRijNcopyzFpU4qJETZujLM0aSQRqIOSZJC1XHCFEJS1yJVrCyyIrsEBKkDJNcwgF4TIDs/RBe217wFBOIcyLFCMEcUZQfE9rjOpDdPWnYX8m9drMv+5kcPoQv89/0o8pqifdxjmOxx/vfe64\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=dy3b15RqE51MEkrvBGr42rmgSd5Jx%2BndzSZCKquqyY5jViJ2ZdJsvgmA0KgyHa1pq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2FgaGOi_S_igAK9w&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=dy3b15RqE51MEkrvBGr42rmgSd5Jx%2BndzSZCKquqyY5jViJ2ZdJsvgmA0KgyHa1pq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2FgaGOi_S_igAK9w&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/unpublish?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"141\"\n            },\n            \"content\": \"eJwtjUEKwjAQRe8y0J02qLuCiKD1At24KmMzJcE0CZmJKOLdHcHVf+9v3hsWEpcsdHA5D7ACV2hWcSKZO2OmkKpdY/btC6OlZxtJzGNjrOe7KcSplon4kFHc/vc1u2Oz7a94Uh6IRUV0xlxvwbMba/yTpoSWHFBI4zMGps8XeWMyLg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"624\"\n            },\n            \"content\": \"eJy1UctuwyAQ/BeuTRTAvMy5n5BLVVUWmEVBNcYyJGoV5d+7jtpjVVVqLzC7zO7OLFeyuHYiloRUX+3hyT3ifYTaDg2PYTn7KdXTcJ4/EdmR9r7AvWDFYHZ5C74ljyu4BgEpnHK5p2LP+yMTtjOWigdKLaXIyiWkmH6kDZA9hLDxrr/XPaWcGrGc7kiJsQJihLWsCMjmqzQ33XOpQa7EPr/cdmSFWs7rCEPa1AkplZZMcxtZz03PxqiZ6tQYhGcjpU4FER04xpgM0mjwUbjeKMM9Ay/6rtOUeuGCIlvrS6qpzMQyLSnVpuP43CtucG8lZ5gbTq13s5uLcfgS89dKljVd8Jv+qT9uEd5SRB+32weON7tc\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=dy3b15RqE51MEkrvBGr42rmgSd5Jx%2BndzSZCKquqyY5jViJ2ZdJsvgmA0KgyHa1pq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2FgaGOi_S_igAK9w&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=dy3b15RqE51MEkrvBGr42rmgSd5Jx%2BndzSZCKquqyY5jViJ2ZdJsvgmA0KgyHa1pq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2FgaGOi_S_igAK9w&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_remove_trash.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_remove_trash\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"136\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02aHcFEcHHD3TTVRmaW1JMmpCZFkX8d8fVPeds7sf4gsm0xotkbq0dQ1rdnvJcv2lxeNULxG4H62Z+2gJOaxnB50ziT/9WNZfqeO/pqtyBRUV0hoKYNgxSiL3ZmQjxyenP49apCmIOJNAyUWB8f+cvMA0=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_remove_trash%2Fdir-to-remove\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"152\"\n            },\n            \"content\": \"eJwlzc0KwjAQBOB3CfRmGtRbQUTw5wV68VSWZkuCSRN2t0UR390VTzPzXeZtAuFkOhNEKnfOjaks3kKN7Qtmj892RnHr1vnID0fIZaER+VhBwuFnzf7U7K53OGvvkUWHaAyEuaw4CAEHNR/JSrF/NRuTUULx+nu79DoFc00gqDJBYvx8ASNYNbQ=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_remove_trash%2Fdir-to-remove&permanently=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2F&offset=0&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"696\"\n            },\n            \"content\": \"eJy1ks1qwzAMgN/F1zVUcSy78XmP0MsYI/hHWc2apjhu2Sh596ldN+hg7LKBsTH6JH3YOonytidhRUxZLERHg6cYKQp7EqnQMAn7eBI7N1yZqoxVpmE8EtP0mnoG54UImVw5ZwkJUlVgKtDrurW8ZHMHYAGYj7Slnyj1RY05Paddt3dlc+k5vdjlg7vnc01TWRbeug+FrmQ3bZbftYYxpj792ifTNB5yoC6dSYWoDdZG2gYp9Bj6FeoYAAxidMb0jVakGIhOrWqNvpYK27hyUXpEdLFdSQWc03Lpq/tFz976dRFB1xC9Q+18Qz40XgdyzoPTKE3PAe9NjFwmjMNAu8KC0/k/9jkd+ZW7T/E/tz74bQr/VJ6H5GbSMh3TlMadsFweZNugVlo1Wpr5idGxuC2HFmKbhlSERQCejL6fiC8wz+82K8sg\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir-to-remove_d50610dba56ab3ebc3b6ceaab0a6527fba5bb7dd&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir-to-remove_d50610dba56ab3ebc3b6ceaab0a6527fba5bb7dd&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_remove_trash&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_rename.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"130\"\n            },\n            \"content\": \"eJwVjUsKwkAQBe8ykJ1m0OwCIoKfC2STlTSZFyY4P6Y7ooh3t129qtq8j/EVs+mNFyncWzuFvLotlaV9U3J4tQlinzvrFn7YCs5rncDHQuIP/9Z0p2Z/HemsPIBFRXTuFYkizMZEiM9OH26XQVUQSyCBlpkC4/sDtpYtdg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir2%2F&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4bqruCiKD1At24kqH5JcGkCZmpKOLdHVf/vbf5H+MrZtMbL1K4t3aKeXVbKqF90+LwaheIfXbWBX7YCs5rncDHQuIP/9bsT81uuNFZeQSLiujcKxZKUHOhdmZjEsRnp0fXy6gqSCWSQMtMkfH9AfReL4M=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/move?from=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1&path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir2&overwrite=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4brLuCiKD1At24kqH5JcGkCZmpKOLdHVf/vbf5H+MrZtMbL1K4t3aKeXVbKqF90+LwaheIfe6sC/ywFZzXOoGPhcQf/q3Zn5puuNFZeQSLiujcKxZKUHOhdmZjEsRnp0fXy6gqSCWSQMtMkfH9AfSCL4Q=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzU0OgjAQQOG7dK0U+kNa9sQLeIFpZxqIQBs6Go3x7nb5vs37iuWkJCaxMJc6SRm3/MQrlLX7wIH07g5i+RokrvUhc6ETeM1HldhD9BhdSNiTGq0ZE4TkndIAUUGEBM7YocdgDBrvnR6s0075QForsuIiduIlY3vf5ntLpr1swNQkwVbp9wfWITH9\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/d0ac9dc8bfd0e26546fabf9823aac2acafa84510db44d499831583829be332e5?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_restore_trash.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxVJZmyxbTJmSnooj/7nqaeY+B+TgpPLrGCZC18X6IaQ1bylP9piXwq14Y/rnzYdKHL6xpLQPrKRPk+HfV4Vzt2ztdrHesMIBFb1Okwj0KqbiNmxmSgh3drp0heM6RwGZGisrfHxzpMIM=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash%2Fdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"143\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxVJZmS4JtE3anooj/7nqaeY+B+bgoPLrGRaBo4/0w5TVsqaT6TUvgV70w/HPnQ9KHF9a8ysB6KoR4/LvqcK727Z0u1jtWGMCitymycA8hjSZDErdxMyPmYHe3a2cInstEYDMjTcrfH0IsMl8=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash%2Fdir&permanently=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2F&offset=0&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"667\"\n            },\n            \"content\": \"eJy1kstOAzEMRf8lW1rVzuQxZM0ndIMQGqWJAxHzqDJpBarm33HLSywQG8jCUeTjm6srn0R92ZNwIuYiVqKjYUcxUhTuJHKlYRbu7iRGP3wx9JwTt5eVCIV8PbNCglRrsGvELVqn0Em8AnAAzEfq6SdKflJTyQ957Pa+Pl5+mp/c5tbf8L2luW4ql65wmQp1tfj5cfPmZphiTvlXeR6dDiVQl8+k0tpYjVY68JYPGYnGQtMgWU9SGalCUgZRq0gesPXSAxiKqK3yCKh000opE7H0u+WLKXd21bVWshoEHVTCRBoshsYno4IPlKIyprXG28DDYRoGGivbms+R70s+cqTdh90/93rY9Tn8kzxvxLdlKnTMc55G4VieM7g2rWykRQPLPaNT9T23VqLPQ67CaQBeg5Rm4gcsyyvFkbyC\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir_8726700c5c4f1fe5071c3af64cacefd466876a7c&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir_8726700c5c4f1fe5071c3af64cacefd466876a7c&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir_8726700c5c4f1fe5071c3af64cacefd466876a7c&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources/restore?path=trash%3A%2Fdir_8726700c5c4f1fe5071c3af64cacefd466876a7c&overwrite=false&force_async=false&name=%2FYaDiskTest%2Ftest_restore_trash%2Fdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"143\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxVJZmS4JtE3anooj/7nqaeY+B+bgoPLrGRaBo4/0w5TVsqaT6TUvgV70w/HPnQ9KHF9a8ysB6KoR4/LvqcK727Z0u1jtWGMCitymycA8hjSZDErdxMyPmYHe3a2cInstEYDMjTcrfH0IsMl8=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash%2Fdir&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOwiAQQNG7sNbSAezQ7o0X8AKUGUJjW0hBozHeXZbvb/5XxIODmESsNZdJSr+mJ51dXrqP24nf3c5VvkDSUh4yZT5cXdJepFI+kEUwaBXAMATCcfYMaC+NI7FRpE0wI3vdQ7AEFrBHPbNmVNaJk9i4xkTtfbveGytveXWVWwluLfz7A19PMMA=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/22cfd87147821166fd79bce17851169de42d34f49ec301f8d1817073be3e728a?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/22cfd87147821166fd79bce17851169de42d34f49ec301f8d1817073be3e728a?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_save_to_disk.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"136\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxFJZmSoppE7Lbooj/7vY084aB9zUTJCRvGvO4d2ZnQsGgEEQyN9b2MS1+T3msPzR7vOsZYteD9SO/bAGnpfTgSyYJ522rTtfq2D7ppr0Di4JoOKYVTpLbPmoRTDmSQL0DRcbvD3lAL/k=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk%2Fpublic_file.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzFESgiAQANC78O+ygKByji6AgZk6pLCm1HT3ppm+38x7szGFgVk2Eq3Zcr6vy8P5kFQzgb/nGYqLPpwQA9m6Vn+vyKVbIC5RajTCXITWCiWotoOdPPQeY9zMoQf1Ojrsy7SU5/XEXM2/WGKjjRYt+3wBr0wo0w==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader37j.disk.yandex.net/upload-target/20250616T155302.389.utd.bd0nnq6w5f3zw90byjlyvcx0s-k37j.20756518\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrSS0uUUjLzElVSM7PK0nNKykGAEGtBw8=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk%2Fpublic_file.txt&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"154\"\n            },\n            \"content\": \"eJwdjsEKwjAQRP8l0Js2WG8FEUHbH+jFU1iTDQmmTchuSkX8d6OnmTcMzLzFjOyiEb0Yb5PYCZfRVnDMiXopdYjF7CH59gWLwa1dkOV6kMbTU2akWLJGOidgd/plzfHSdMMdrtVPSFyBqyiCFRVH9e90QyqP4LWyPmDLG9ddxjkFYKxPLATCzxcZ1jai\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk%2Fpublic_file.txt\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1317\"\n            },\n            \"content\": \"eJy1VNtu2zgQ/RcD1cs2Fi/iRQaEwk3Sxk6LNq6dNnkxhiJZs7YukWivtUX/vaR3swHah760gCCJw+FczpzDr6MW/GY0GWnXbyfpHVyE79L0PvXhte7hYNa+WcfdtN2rnSvX1u3M2B/96PnID60JZ6MlrGqo4upnt7Iz4I0OewQRdob4GeZLTCaMThD9C6EJQsGrarSz7pduvfsnZMEyHHBVKO7fErw5+rTdgatjJM2CSeZYlZoKhDjOwTLMsLI5U5Jya3OFY6wNEMaDb5lZyLkEkTEmuQUARBFiWThlFS7BamZyMIRZ4ApTASXPhBCYWV1KfIr1X9tbM4R49auttdXifkXb6WU1r/rSCHK8w/10GHL8/nh9eZN6fp4ed+rt51m5Zeevb7OVWNwOL2eof0Me0jlXbbUY3s2beklvm0/1BXwuiqc8+24X8my8b/tJmg6g3TiMSKdvb6+/3Eyby1k1vTyfRjCMdvAIk27KfWXqOJTO9M2+K83aRcRD31wwLMhESk2JAQ4ZkUwRymSpGSISFCdgFWEZVkCIUbkEEiBGQhAOBqEMlRIhcwp9cL1r6jAmwRASkkoqcpxTErjQVLGAkLUfTb4+dvNYzO+upO3cIVDvD8X/9nxkjs6GPsIf1N4dXLfv170Hv+8jq3YGIh9P+ngalm7+rncNaNONo67GA9TaHMfdPj3JTBNQJuQOqAFCSltNQVOjNGCiAwuVDC0ISjKCMZc5Z0hwxiXV3GBtSppyyVCmjE3r/mq2NZ+ua1i8bpdDjVZu8aCG1XrLVsN7sXn3hXRX/CPc0dl0mC/4xTDF9/TGftgt5+YoluXx5fkZ2WbTh6Gefbx/qIcrc33zjF6E58Xe6eJ/LJPYYtR/8YP6k9BS2/TOBzoU4D2Umzj+ZAP9pkh2rnK+QEnZ1D6SIrK0iFJ+Rl6dxJwEqEy3/iFXvAIKLJNNMKs8ZzgAhogwyFqriaY5YnmGgVhjUPLE/+KR/Ynf1ofiQBPjg6h+eU98+w4iwZWH\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk?public_key=https%3A%2F%2Fyadi.sk%2Fd%2FMVKjQAoEImAECA&name=saved_public_file.txt&save_path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"160\"\n            },\n            \"content\": \"eJwdjsEKwjAQRP8l0Js2WG8FEUHrD/TiKazJhgTTJmQ3pSL+u6mnmTcMzHzEhOyiEb2430axEy6jreCYE/VS6hCL2UPy7Rtmg2s7I8vlII2nl8xIsWSNdE7A7rRlzfHSdMMDrtWPSFyBqyiCBRVH9e90w4ZGpfIMXivrA7a8cl1nnFIAxvrHQiD8/gBxTDkU\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk%2Fsaved_public_file.txt\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1183\"\n            },\n            \"content\": \"eJy1U9tu3DYQ/RcB0UtiixeRFAUIhVujtZOH1M4aafIiDMlhl91daS1xN6sG+feQmzgFihZ5aQFB4oyGZ27nfCz2ENdFW7gwb9rqHVyn7wrnWMX06mc4Yh/HPv+tsuH6/cFsg+192OJlPMXiRRGXPSaE7EnWALts/VuwnRAiuhTBCBMXRF5QuaKsFbwl9XNCWkJS1G50wYfvhs3hz5SLNulC2KVCvxQS8RSr/RbCkJGcSK5GU2MdV4RIqsELKqjxWpiGS++1oRlrDUzIFGtrD1o2oGohGukBgHBCRJ1ueUMteCdQAzLhQRrKFVhZK6Wo8M429Iy1QxfgqRw32sMOh9z8hPN4mCz2IXeW8KUSVLGWUEYbbS1rLOEgnTFUKMmQGeWN46I2KQnRTnDNGQWJHF3DXO1l7Ujq4Ax9DHMYhzQOJQhRDW/qmjDFWZr5uMsFpKxz0X4svi7lqZj/upL9FI5pxf8T/qcXBZ6CT32kEwwxHMN0mPs5QjzMeXtbhLz3MxvbYh3jfm6ryo0fhu0IDqfLzOXLBQaHp8vpUJ2p7RMzuGMNSEWMkgYNYWAVEKpQU2iI19JzqqRTWvM0VyE9VQ1Sa5jzyCrZCFIbT6phvrnd4G+vBrj/Zb9aBvIQ7h/N8tBvxMPyq1q//oNNN/ItvOO3V8vLe3m9XNH3/M6/2a5e4kmt7OnHny7Ypr56XIbbt+8fh+UGX90949fp+eEQXPdtlmVuMaut+0etlamx/TiHmEjRQYxg15kE5RrmdVduwy7EjpR2HGKmRuZql4XzjP18lk6ZBoZT/7eMWXAdbcp1chutBQWDiWRIvPeOOa6J0DUF5hFJ+ZcKuicNlHEzHLsjLzHC7913VfnpM95abC0=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzkEOgjAQQNG7dK20tIVB9sYLeIFpOxOIQBs6Go3x7rL8q/e/aiWZclKjul3v6qSmnfiISaTUUeu45Gc6Y5mbD26J3s1Gol+tTnN96FxoR5nzVjVANN5Ajx1BsD6R6bwL7tIaiGxd54cAFgyyDSmCd0ObjOPes/U92yEcstBaFhQ6XhiXSr8/NyIwpw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/77c04076a5e7b24de0543b39107cf23548b7270af2bdc74381d03f64f246f28b?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/77c04076a5e7b24de0543b39107cf23548b7270af2bdc74381d03f64f246f28b?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_streaming_requests.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/last-uploaded?limit=10&fields=items.type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"171\"\n            },\n            \"content\": \"eJyrVsosSc0tVrKKrlYqqSxIVbJSSsvMSVWq1Rlk/NhaACXZOPU=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_upload_and_download.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"143\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2qLeCiKD1BXrxFJbulhTTJGQ3/iC+u9vTzPcdZr7GF5pMZ7xI5s7aMaSKW8hz+4GI9G4jiX3uLM78sIU41TISnzKIP66uOZybfX+Hi/aBWBREw9UcEqDTDYfpFVcwG7OQ+IR6d7sOikJLDiCkZoLA9PsDUgsyzA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download%2Fzeroes.txt&overwrite=true&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzEsOwiAQANC7sO9AB+R3Di+ADramhiIdYo3x7mri+iXvJeaWLyKKmbluUcpeb2ui3LRbga7bAs9UKO9QMkdj9N8HTm3KLFGhUU7ZI+LoDw6809CZwHmyLbQ0ns5f7QVDpUe6T/uw/GITAnpjrXh/AJa0KB8=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader37o.disk.yandex.net/upload-target/20240706T221857.873.utd.78d6r9ra1bc706un29pdwaqgx-k37o.49928466\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJztwTEBAAAAwqBK65/OEL5AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8BjCrLQE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/download?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download%2Fzeroes.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"450\"\n            },\n            \"content\": \"eJxdUNtO20AU/JdI+K3xXryXIFmoBZpSIBJpQ+kT2t1zHC+xd117czGo/47bvlWalzkjzcyZt1ndYzU7n9UpdcN5nkM8hiYawH4OftjNRxMAT/N+n/+h+QIL5oAYC4ZUFpVlrlC8QqoIqRypOEUEJzlIRSwS5owVihmula0E1yKXUi+AIMvD8OVmh0+3wayX3fcxkI1f//rW/Nge7+D6ugG/Wn8ij6cbitvNoXtcbnC3PIwf/NPtw93HKFYv98c6/mztlR1fVvHr5YOqLu+PZ/xqwsXeQ1kIIZWgimWVbzCYFstX7CMO83RK2fRNFweffAylScm4usWQstoMdZk1vvWpJJmLIU3X5zR2WCY8pTP2uWuMD9m0EvbP/8UM/hVLSgotlMzqSVPccUOp0Y5XUvJCcqq0YsBQOGqZzloEb/7ZQ3T7vxXSLhzKA8swmW0JGgrHgDqNhSUFLKR1hk02AoiiTsx+vwM+YZNF\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/9e42cd0abda0fbe7b2c473fe1700fc0f31eedc63d670be02cab572a387bf5385/6689d0e2/nsHIkeXKnaRGpTyn0UiRqSlWgwLdEEldiNRB0VxI1egUvpVGUekGvy-iXKQLAo5NjMwhoYmbDbyjNoJCQ7fCMw==?uid=455675172&filename=zeroes.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=1048576&hid=73c3a11a8c3f66346317872d2e5c1b28&media_type=document&tknv=v2&etag=d8d4c2d1c8e4b04d96bca23175d071c5\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"1048576\"\n            },\n            \"content\": \"eJztwTEBAAAAwqBK65/OEL5AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8BjCrLQE=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNjUsOgjAQQO/StdJQ+2HYGy/gBYbONBCBNnQ0GuPd7erlvc37qvngpEY1i5Q6ah3X/KQzlqX74E787nYW/eo1LfWhc+EDZcl71Tj1ITIbGiymRB4ALUUfDHgmNzQa8gzgfAoGwQL5i52AoHfRsQnqpDaWOVN73673psJbWVG4lYRr5d8ft9wxqQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/ab17cee2d84affd699a4dc67296ed587292d6e9956f72a949d634b9d915c5e27?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/ab17cee2d84affd699a4dc67296ed587292d6e9956f72a949d634b9d915c5e27?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_upload_and_download_async.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download_async\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"149\"\n            },\n            \"content\": \"eJwljc0KwjAQhN8l0Js2qLeCiODPC/TiKSzZLSmmSehu1CK+uyueZr7vMPM2YabBdCaIFO6s9TFXXEMZ2wUS0qtNJPaxsTjy3c7Euc6e+FBAwv7nmt2x2V5ucNLeE4uCaLhaYgZ0uuEwP9MfeEnerMxEEjLq6fXcKwpNJYKQmgEi0+cLnjw1SQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download_async%2Fzeroes.txt&overwrite=true&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"126\"\n            },\n            \"content\": \"eJwtzEEOwiAQAMC/cO9CWdZS3uEHiNBiwNrA1ojGvxsTz5PMW6QaF+FEYt6bk/LYy92HWFGtEK4tQ/dbiE/YIjtj8O8D+7pGllppoyZ1Oms9zkoDGoKDA9hXsaO1E10shRv17HtZWnrgkH8xzkRI4vMFOuInaQ==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader30g.disk.yandex.net/upload-target/20240706T221902.345.utd.8zl818875c85dm5ykaylfshv3-k30g.395535\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJztwTEBAAAAwqBK65/OEL5AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8BjCrLQE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download_async%2Fzeroes_from_generator.txt&overwrite=true&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzEEOwiAQAMC/cO8Cu4gt7/ADVKgoTVvpkhSNfzcmnieZt0glTsKJxLztTsq6zasPsehhhXDfMzS/hHjAEtkZQ3/v2JdbZIkKjTore0HUgyKweILKAWjk/KpJP44Zr0y1+ec0civU5V9sbK+17Ul8vr5RKUM=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader19o.disk.yandex.net/upload-target/20240706T221903.625.utd.3btkzuh1jxl2ct3uyaqfbtyr3-k19o.46811683\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJztwTEBAAAAwqBK65/OEL5AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8BjCrLQE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/download?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download_async%2Fzeroes.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"450\"\n            },\n            \"content\": \"eJxdUMtu2zAQ/BcD5tEiKb5sgCjaqk6DugnsOEVzMvhYRYQlShXp1HbRf6+a3ALsYXcGmNmZP7NmhHq2mjU5D2lVFL7/HdveeBgXPqTj4mKih/NiPBX/z4ICAHMlw1Q4ZWvhl04YbCmUzsppAQ5cCq+ks45LIgnjVmHDagEgLZWFEGrpMagipq+3R/j5LZrdzbC/RPwYdr/sp7v1vtp+rHL18HS3IZdILX++ivOPzYn7KJrB5M3nwGLFdil9j114ZDfr/VaNT1/u5UO7nZfVNB9OwWvGuZCcSIrq0EI0HegrjD2kRT5nNKUZ+hRy6KM2ORvXdBAzakxqNGpDF7LGyPUxT+ghXwbQGc55TtdDa0JEU0swHt7ZpHAFTTBTUwWomThZutIQYpQrayFKJkoilaSeAnfEUoU68MG8yfvenV5fyMf4ol8ogmyetVeeOeqJU8AsZn4prDN0kuEeS+L47O8/g8ORzw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/2eee4c34026c8bf6d9c6a0b2e3cb7a0be5e576d87cbc5717145b80a4f6ee7b27/6689d0e8/nsHIkeXKnaRGpTyn0UiRqbBNFTDQADtDSYNL1yn2b5gz6xVLu5dn6hpatLCi4nD4RssMnmiU4GFTQ8rYEO7SlQ==?uid=455675172&filename=zeroes.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=1048576&hid=73c3a11a8c3f66346317872d2e5c1b28&media_type=document&tknv=v2&etag=d8d4c2d1c8e4b04d96bca23175d071c5\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"1048576\"\n            },\n            \"content\": \"eJztwTEBAAAAwqBK65/OEL5AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8BjCrLQE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/download?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download_async%2Fzeroes_from_generator.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"465\"\n            },\n            \"content\": \"eJxdUNtum0AQ/RdL4dHAXiESqtpSp1XdRHacqnmyhpnBrAwLhXVqu+q/lzZvkeZlzhmdy/xeNCPXi9tFE8Iw3cYx9b982wPxuCQ3HZcX8MTn5XiK/61xJVFzBTkpDVZYLRNWuRSyThgUVRpqJAaELEcEJpnkBpmw1gJra1DHxmQ5zcexnz5/OfKPrx62d8Pu4pMnt/1Zfbhf7crN+zKUj8/36/TiRaUPV3P+vj5p8qYZIKw/OuVLtZ2mb75zT+putdtk4/OnB/vYbm5kOc+7k6NCaW2sTq2Iateyh46LK489T/t67Lv9gT2PEPpxGc4hmssN/eSC630BIQA2HfsQNTA1RdS6zoUiibD3YUb34TJwEfgcbsRqaMH5aH4aj/s3rpO7cpEmKtPWRM3MWYkS0hQylLUxUhmZ2swKEqwxrUQWdUwOXuWpx9P/COHoX4oXEXGAQ0EZKRSUYsaqShTlpkIQs4ymxKaoF3/+AhmZmUw=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/b3c5eba9d45a727530e49323f0ea4db5afcdeaca89ccaed3096cedcf52cf76c5/6689d0ea/nsHIkeXKnaRGpTyn0UiRqbBNFTDQADtDSYNL1yn2b5gz6xVLu5dn6hpatLCi4nD4RssMnmiU4GFTQ8rYEO7SlQ==?uid=455675172&filename=zeroes_from_generator.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=1048576&hid=73c3a11a8c3f66346317872d2e5c1b28&media_type=document&tknv=v2&etag=d8d4c2d1c8e4b04d96bca23175d071c5\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"1048576\"\n            },\n            \"content\": \"eJztwTEBAAAAwqBK65/OEL5AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8BjCrLQE=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download_async&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgyAQQNG7sG4FVATcm16gFxhhJpqqEJk2bZrevSz/2/yvWE4kMYqFOZdRyrClZ7xCXpsPHBHfzYEsX1rGtTxkyngCr+kokrybrdIG7exs56gdtEeyWjmNcdaxDX5QwUCoSAikemy1gmB9b8zQRXERO/KSYn3fpntNxj1vwFiFYCv4+wObhzGs\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f98b7015e7b8738f2619ef71081edb1d2c960c5acef7feaf04e210ac7945563d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f98b7015e7b8738f2619ef71081edb1d2c960c5acef7feaf04e210ac7945563d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_upload_download_non_seekable.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_download_non_seekable\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"152\"\n            },\n            \"content\": \"eJwdjcsKwjAQRf8l0J02qLuCiKD1B7pxFcbmlpSmSehMfCD+u9HVPeds7lu5BYNqlBNJ3Gjd+5jtmtJYvyhYPOsA0feNtiNPegHHvPTgQyJx+1+rdsdq217pVLgDSxEpY3Lykayx8RH+EGIwDEx081ArNUNctOX3cu6KCubkSVDKQJ7x+QJKJjZ/\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_upload_download_non_seekable%2Fzeroes.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"126\"\n            },\n            \"content\": \"eJwtzEEOwiAQAMC/cO9CKZTSd/iBrbsWrakNLAZj/LsePE8yb5UyX9SskshRZq3rcX8gcQ43oGvZ4IU7cYOdZXZu+HMnmFcWbY11JpjxZG0fhwhj9FCFYCqtnhcq5lnRI2FbbU2J+6Xbfq8zPk4xBPX5AnTeKKg=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader7j.disk.yandex.net/upload-target/20240706T221939.695.utd.8sxucbds0vua5adaxg2uhhe1b-k7j.40598977\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwzMBgFo2AUDHcAAK0au4E=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/download?path=disk%3A%2FYaDiskTest%2Ftest_upload_download_non_seekable%2Fzeroes.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"447\"\n            },\n            \"content\": \"eJxdUNtu1DAU/JeVmjc2jh3fKkUIuuq2IGi3XLbNS3ViHxOziRMSZ7tZxL8T4A1pXmZGmtHMz1U9oFtdruoY+/EyTW33EpoOLA5r68fDeoZg8bQepvQPTQnTwhhUuZCQKS4doNOVs5myyA0w7XImodIuo8CUlTnRikgOijMppcJUCKVtRkwaxpvbAz6+D/Cw7T/PgXzxDz9wN7H9FZin23dRwttj+fjhZnq1+Xj+tOXb+fvT4Xr/dX9HxG5btvds91Jf3Tdzfuc257I0/a58c8E2C15P3hY550LyTNLE+QYDtFiccehwXMdTTJY1fTf66LtQQIxg6hZDTGoY6yJpfOtjQRLThbioz3HusYh4ihf0um/Ah2R5CYfn/2pGf8YiI4Qk9WI4TRk4xR2RlGqRI8spdUJrKTIuNElatB7+ZdvOTH/74yEciyNNMMK3QqmqEhq45UgoGgmOO6Gsog6rzGV29es36IWQwg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/0396cce8467a1857faef9bfd18de5ca39f437ab9f12a38d74098075a8537778e/6689d10c/nsHIkeXKnaRGpTyn0UiRqeQu3WCacYIJt7aBvZXMHu-DNzSG5GyjYkFWVWO06QGZmP3QwhCPly4OfDzZZcpQZA==?uid=455675172&filename=zeroes.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=1000&hid=f923af85f0722964e3422f6997615690&media_type=document&tknv=v2&etag=88bb69a5d5e02ec7af5f68d82feb1f1d\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"1000\"\n            },\n            \"content\": \"eJwzMBgFo2AUDHcAAK0au4E=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_download_non_seekable&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUsOgjAURuG9dKz0hZQyN27ADVx6/wYi0IZWozHuXYbnm5yvmHZEMYip1lwGKcOSnnymPDcf2hjvZkOVLy15Lg+ZMnaqc9qKbIE+BAoXj2gVtAPgtVFsR69Go6JybNsevXVek7OIBr3mbvQt286QOIkVdUp8vG/X+5EVa16o4pBIS8HvD73NMdU=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4ee8ccac59ef30e17eee9120d3b90b20f07d348e83791a73ef2e81d6b94d362a?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4ee8ccac59ef30e17eee9120d3b90b20f07d348e83791a73ef2e81d6b94d362a?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_upload_url.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_url\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"134\"\n            },\n            \"content\": \"eJwVjUEKwkAMRe8S6E4btLuCiKD1At10VUInZYrTzjDJiCLe3bj6773N/4DPPEMLXjVJiziFWNye0lK/aXP8qjdWfB7QLfLAzBJLnljOidSf/q1qLtWxG+hq3LOoidqMJYVIbiw5wA5WVh+dvdxvvanymgIpW5kpCH9/gL8vNQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_upload_url%2Fexample_file.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzEsKwyAQANC7uI+OZvzUc/QCFicxWDSoCSmldy+Frh+8N0uNFuZZGmPvXohjf9YQqUlZedx65q9QIl280PCI89+nEdpKQyhQCBbsXYFGuHEDjh8jcnpUvaA2eW2bOZ0rTeqrnzJN+RejnR1IRPb5ApohKAs=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader11o.disk.yandex.net/upload-target/20240707T205409.608.utd.ebo5f456kgri6v88nr15xsv1h-k11o.47380144\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrSS0uUUjLzElVSM7PK0nNKykGAEGtBw8=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/download?path=disk%3A%2FYaDiskTest%2Ftest_upload_url%2Fexample_file.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"451\"\n            },\n            \"content\": \"eJxdkNFv0zAYxP+XSvMbje3ETjzJQhqwMaYxdaUa46Wy/X1eTBMnxO7agvjfydjbpHu538Od7v4s2gn94nzR5jym86KA4RC7wQBOSwhptzyZCHhcTvvixRZg0VnpKFYgJHeeAVDgJThgjvpGeABrmXBSonLWmaoqLdpKlkaompVYSNlYig0vYvp8vcPvN9HcX43fTpFuwv2vxwdxu9m07+pL39+s7+AQnuTg3Zdm9enqIvkdpdX6q7+9Tunn6i6ykbLxQz2x6eHicVx3Pw6rs/LjrPf7ALoSQtaC1Zz40GE0PWo8mn7scPsClvmYybxpHFLIYYja5Gxc22PMpDWp1aQLfciaEjfEPNNtPo2oMx7zGb8cOxMimb/CafumLIXfqFlD2hlbpQQzFimvkXrvgUOpqFAVM9wjUtIjBPOaDIPb/2/Pu/isnznBbJ50o5h1UNaUSqaMF0ww65WwTSm9V5Yt/v4DRvqUtw==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?url=https%3A%2F%2Fdownloader.disk.yandex.ru%2Fdisk%2Fdbecb6c0e4d562cf1dd0d23dcd1c0f85fddbb15c66e9cbca443beb463a59713e%2F668b0e82%2FnsHIkeXKnaRGpTyn0UiRqYW5MUUh-7FfmKSOdwig6ofcJ8QEGBsfk004SNfMIssjQOn1p01pC7r1rWBYpSlZwQ%253D%253D%3Fuid%3D455675172%26filename%3Dexample_file.txt%26disposition%3Dattachment%26hash%3D%26limit%3D0%26content_type%3Dtext%252Fplain%26owner_uid%3D455675172%26fsize%3D18%26hid%3Db9951abe027e0fffd2d3905941a2fee0%26media_type%3Ddocument%26tknv%3Dv2%26etag%3D891bcd3700619af5151bf95b836ff9b1&path=disk%3A%2FYaDiskTest%2Ftest_upload_url%2Fuploaded_from_url.txt&disable_redirects=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNjUEOwiAQAP/CWQtCi0vvxg/4gS27pI21kLIajfHvcpzJJPNV885JjWoWKXXUOq75SUcsS/fBjfjdbSz6ddK01LvOhXeUJW9Vx0h+SBYApuiRIaDtjfOBePDJBorggvVopoS98yaQC2gYgGNy55aqg3qwzJna+3q5NRR+lBWFm0m4Vv79AaPAMYc=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/ccd65f2888bc6ae89a240369de56f29dc83926a0bfa43609d39a0e88ecf37240?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/ccd65f2888bc6ae89a240369de56f29dc83926a0bfa43609d39a0e88ecf37240?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_url%2Fuploaded_from_url.txt\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1181\"\n            },\n            \"content\": \"eJy1VFlv1DAQ/i+RmhdKYzt2bK8UIZUbVKpegvKymthj1uzmIHG2LVX/O/aWQ0IgeADJSmRnMvMdM77NoAt+68d5Wk4Bwjxli8xsELpsP5v8Z8wWVO1npm9b7MLS2/j9NhtGv4WAyxGnfh5NDMq4EJUUVLIF8oZZWeoKrNCSY6U4I5Q3QinhFFVosXHIDFqmuOKI2pTWaRQVWoMoYuFhbjbe/Kf0d/tZB21KOg+bHizapRv7djmPm4NwHWJ5vPYu0oyBZsTI08ZYRhh/SGRc51QuBF9Q+oCQBSEx/hvOKM+/VqLtrXf+jwha3+Iy3AyJVcDrUAwb8MlC5zfpbBXCMC2KwvZX3Y7zeGD9tD64gc7i9cE4F2lbkLJEBxw1AlDKBOOWahWPIOKVZcVKTQVlzDllnEFnbakZVFZJzpoYXlSVaggqXnTTi5drfPe6g9Pnw/lNRy786afLt+Lo4mL1UD5z7euzY3vlP1S9M6/UydPnh5NbE8LP3rijl9P08eS4owOhw2M50vHt4eVwtnl/dbJXPonr0ext/V3lPFFMhta/tDOPxIZ+8sH3XQ0hgFmlTs5XMK3qfONbH2qSm74Lqb+ThHUScI8920mYR8FwXP5UMQ1GTVW+iseN1oJCg4RJJM45y6IoRGhOgTlEkrdoPdxntr2Zd9XDutvWW5ZjgA+10rQxtpSEVFSDE1HixmnRqLJyTjc0DQSEVbQxmbQoLuFJfJ/jFIoQH8t73olw8buO/oEhZfmKIk34Cpio0shzB7pSICNLVUXDgZSECB7RuIYacFagBmTCQdXQUoKpuJSSCmeNojuMX7PvOi5WtCJu/oLaiFs/RXPiRSMZKSVXgioVfxR3XwB9dW68\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_url&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgjAQRuG7dK2U0pYie+MFvMDA/A1EoA0djcZ4d1m+b/O+atoRVa8mkVx6rcclPflMea4+tDHe1QbRL6N5Lg+dMnaSOW1F1+wp8BDZ29g6b+DGyC7i4qm2gXxnmMzgQISOEMY2uNChaW19sQ2bQZ3UCpkSH+/b9X6kYM0LCQ6JtBT8/tMuMiw=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0d5a7dbfd53f6451e4cfd4fe95a037a581da1b4eaae8ae7c67478e2630932d1b?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0d5a7dbfd53f6451e4cfd4fe95a037a581da1b4eaae8ae7c67478e2630932d1b?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/async/test_wait_for_operation.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_wait_for_operation\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"142\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxFYZmQoJpJmSmPhD/3XF1zzmb+zGxYTCDiSKVB2unTItfQ039G4rHV19Q7GNjfeK7bci0tAn5UEHi/t+63bHbXm5wUh6RRUV03BOSuEDNUcUGkqiYlZlRInl9u55HVcG5ZhDUEiAzfn8iTjKJ\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2Fdirectory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"115\"\n            },\n            \"content\": \"eJwVzEEKwkAMQNG7BLrTBnVXEHGhvYAXCJOUGZx2hiQVi3h3x+V/i/+BqDLBANG92oAYcll5TzX1Gy0s734Rx9cBOdkTVaysGsQulTye/9adrt3xzkkleNENdjCLx8JtOd4eLV3mmsmlyUTZ5PsDK2QoMg==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2Fdirectory&permanently=true&force_async=true\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUsOgjAUQNG9dKz0S+ljTtyAG+jnNRCBNvRpNMa9y/Ceyf2y+cDMRjYT1TZyHtfyTFdfl+7j94TvbkfiL8nT0h68VDw8LWVv3HgMUcesrBNGBZM8BBwAc4/QZwtRKh1FUgLCANoCCis0CrDOSSNdYhe2Ic0lne/bdD+TcKurJzwl+7Xh7w+bcTEi\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4aebc3cf268042b4da9be79ef5e95f69c123c0d209b79369e0603e096881418d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4aebc3cf268042b4da9be79ef5e95f69c123c0d209b79369e0603e096881418d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4aebc3cf268042b4da9be79ef5e95f69c123c0d209b79369e0603e096881418d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_wait_for_operation&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_auth.json",
    "content": "[\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://oauth.yandex.ru/token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJw1jUEOwjAMBH/TSy+JHSfpIW+pnNiFSKhFrUGC10OFOK5mRnvZebXZXnct/LDrtvc3W9/WuW2iQ7t1/eIuxVGeMGBNkSm4jCwJJo+oCD5UwuH0CyE48PTvDm27WvE5iiySkaAGWrTGmgKD5yVFp9QG0Wdvet6YHjb+5ugBP1eBMxQ=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"274\"\n            },\n            \"content\": \"eJxFjk1TgzAARP9KJ2eZCRSs5ZZGC6WVitgWvWT4CJBGISWBAo7/3eLFve077L5vEKcplZKomtMK2DMwQIIKNCXZBpAjFO66YKpPXv26MxBatT538ErL3PfLCEtcEbYUzxvm9yIAdzNAe8EaKgmb5ua6Nb+HEN54Q/MbLv+fdNv5rLjBhi6JMlmYpLIdmXsd5Ro2j4cl3fbHjYO56dKHJPReRhnFbXqmXaEryU5sxBBG45p87a8Zf9PNQ6G4sgyxkK1YWJf87J/WV/vRwbrQ9q02fLhlrULsZQZGk+ifCFGDoJNNQuOGNuDnF6qFWdU=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoRL2AABuNkGCB-dHYqz0hCn_i9pMIiNxpQ\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://oauth.yandex.ru/token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJxVjk9vgjAchj/NvJHQfxQOHEwXcZjMJU4lu5CW/opYRUYLDj793MHDju+TJ0/eupetL/3UQdqD6cGdSn+z0C7+rRS9kGV2aS1uplEV2tW0bP+QM/kINhD0sE9g83N4y4Sla4jVLv+YXSGH6gxjjbxrjs0swrCYV+V1e9f2E9F97a1nuONu6Dj7Nuf34+r+iL5mAnXBdgimr/Xp5nci11gsF9WlgcfVRqchixNCieKRZDSMidQcJ4gQIBhRxchTdVD14FMUR1obHROGFWUGVKQ4lRhJw6MQWPULADJV4Q==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"274\"\n            },\n            \"content\": \"eJxFjkFzgjAYRP+Kk3OZCVKcwi1EEVqKheIIvWTAfhKaKhhQAk7/e6WX7m3fYffdUL7fQ9uyrhZwQvYMDZiRkkwpXiIsCHkPrtFUV891HMwJcS6hWFNH+/Sy84g5PbHKal79KlRNhB5mCFRTSWhZNc0ZumksMMZ3LuFwx/z/SbfftlG8wdhwE6f16Me3LYQasSGJpxc6pRnVuXuIH1dggib8cFFkV2WmFuF5UMAxTtP18MWCuVJXd3f2gS1T3rOOO7gem4wx+VT2dlceE54P2nYXqLJfXiwn2bT9JPonwrqhgcmmgFyCRD+/2LhZRg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoRL2AABuNkGCB-dHYqz0hCn_i9pMIiNxpQ\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://oauth.yandex.ru/revoke_token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJw1yrsOgjAUgOG3cTNpe3pjYCjEeEMSdHIivRy0wQAKGvXpDYP/9iW/9R7HsZ76Frv0Q2pzMXNuX5HWmFPxqmaudv2xYMZkz7Jd59kybM73L7nmXR2T4bCN5XuoFv4WsZvqGFIidAIcnJJWcKLBBsUSCoDAKHcC/uuI/oFTSrUMoQkaBHNcNOikU9wyahslCQr/A/7tMyY=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"16\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUlDKz1aqBQAv3wVZ\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoRL2AABuNkGCB-dHYqz0hCn_i9pMIiNxpQ\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 401,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"99\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoULGy5suth0Yd/Fhgs7Lmy/sO/CJqDIXj0lHaWU1OLkosyCksz8PKDi0LzE0pKM/KLMqtQUoGRqUVF+EZqwK1isFgCIxiz4\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://oauth.yandex.ru/revoke_token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJw1yrsOgjAUgOG3cTNpe3pjYCjEeEMSdHIivRy0wQAKGvXpDYP/9iW/9R7HsZ76Frv0Q2pzMXNuX5HWmFPxqmaudv2xYMZkz7Jd59kybM73L7nmXR2T4bCN5XuoFv4WsZvqGFIidAIcnJJWcKLBBsUSCoDAKHcC/uuI/oFTSrUMoQkaBHNcNOikU9wyahslCQr/A/7tMyY=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"16\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUlDKz1aqBQAv3wVZ\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoRL2AABuNkGCB-dHYqz0hCn_i9pMIiNxpQ\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 401,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"99\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoULGy5suth0Yd/Fhgs7Lmy/sO/CJqDIXj0lHaWU1OLkosyCksz8PKDi0LzE0pKM/KLMqtQUoGRqUVF+EZqwK1isFgCIxiz4\"\n        }\n    }\n]\n"
  },
  {
    "path": "tests/recorded/sync/test_check_token.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_check_token\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"135\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxVYbklpSkTchMRRH/3XF1zzmb+zGhYjSdCSKFO2tdyqvfUpnaNy0er3aB2OfO+omjreC8Vgc+FZJw/LfmcG72twddlHuwqIjO4AJcHCRHLGZjZkjIXm/u115VMJdEAi0jJcb3B61VL3w=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth asdasdasd\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 401,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"99\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoULGy5suth0Yd/Fhgs7Lmy/sO/CJqDIXj0lHaWU1OLkosyCksz8PKDi0LzE0pKM/KLMqtQUoGRqUVF+EZqwK1isFgCIxiz4\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_check_token&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_copy.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwVjEEKwkAMRe8y0J02qLuCiKD1At24KmEmZYrTTpikYpHe3bj6773F/7pYaHCNi6osDYBPeQl75LFecQ70qWdSeB8gjPKCQpKX4kkujBrP/1adrtWxfeLNuCNRE7XpfebV7dxEGnOw/8e9M1WaOKGSlQGT0PYDWPwsuQ==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"148\"\n            },\n            \"content\": \"eJwdjUEKwjAQRe8S6E4b1F1BRNB6gW5clSGZkmDaCZmpGMS7O7r6773Nf5tQcDKdCSKZO2tdotVvIce2wuLx1S4o9rmzPvLDFmRai0M+ZZBw/LXmcG72/R0uygOyqIjO6ChXZR8LOqFSR6F/MxszowTy+nm7DqqCc04gqGWCxPj5AlDENIc=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy%2Ffile.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"127\"\n            },\n            \"content\": \"eJwtzFEOwiAMANC78L9SkMHYObwA2jrmdCLr1MV4d2Pi90veW+XKJ9WrLFKWXuu1XG6JuIb2DDQuE2xpJn7BzNI7t/t7I6kOLNqidRgw7BHROwPeBliF4HDdzHB/xjHWLhA+yJSYjxxzM/3i1nfOe6s+X3reKAc=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader75j.disk.yandex.net/upload-target/20240707T000641.627.utd.bmy1gqw9i9r87d0vd1p9hce9h-k75j.5684662\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJxLrUjMLchJVShJrSgBAB9kBNI=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy%2Fnested%20directory%201\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"169\"\n            },\n            \"content\": \"eJw9jsEKwjAQRP8l0FO1oXoLiAhWf6AXTyVktySYJiHZikH8d9eDnmbmzRzmJWzGWShhiVJRUhofV9jq5LqqA+CzC0jy0Utw5S4zlrhmg+WYNNnDlzX7U7O73PSZ/YiFOBDLZGKq7MFlNBRznSj+WOAeof1XbS82YkGyEfjIdRg5Ei7Ja54JNWtf8P0BBwc8Aw==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy%2Fnested%20directory%202\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"169\"\n            },\n            \"content\": \"eJw9jsEKwjAQRP8l0FO1wXoLiAhWf6AXTyVktySYJiHZikH8d9eDnmbmzRzmJWzGWShhiVJRUhofV9jq5LqqA+CzC0jysZPgyl1mLHHNBssxabKHL2v2p6a/3PSZ/YiFOBDLZGKq7MFlNBRznSj+WOAeof1XbS82YkGyEfjIdRg5Ei7Ja54JNWtf8P0BBys8BA==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/copy?from=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_to_copy&path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_copy&overwrite=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgjAQQNG7dK2UltJp2Rsv4AUGZhqISBs6Go3x7rL8b/O/at45qUHNIqUOWk9rftIZy9J8cCN+NxuLfhlNS73rXHhHWfJWdQveAkfXud4SOKAISJ0ZEQIimhHQpClYTpN10QXvqTU2RejaPsZgvDqpB8uc6XhfL7cjhR9lReFDEq6Vf39dcjCT\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/07627e943452d747d97ad31ba78aaa1b7a1fc82efc2494866d012f9730599816?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/07627e943452d747d97ad31ba78aaa1b7a1fc82efc2494866d012f9730599816?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/07627e943452d747d97ad31ba78aaa1b7a1fc82efc2494866d012f9730599816?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/07627e943452d747d97ad31ba78aaa1b7a1fc82efc2494866d012f9730599816?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy%2Fdirectory_copy\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"7136\"\n            },\n            \"content\": \"eJztmWtv00gUhv8KskS+bNvM3TORolVKCxTCpVBQ6GoVzeVM421iG3uctiD+O+O0hV01QLtN+JQoiWN7fDznOe8cWW8+J2OYGXAOXNL7nNRFFZJekmwlWYBZnfT++pzkegbxWA51APfAZRXYUFQXD3AcBeeZj9d92UpsBTq0QRKCCNtG6TYSRwT3kOgx9gdCPYTi+ArqoqksjLN2JONcpBynpOexFUohxgj1zBqkhcYgiTXOCQVgHWJEYOUww5RRIZRzyDGRpopaoNjE0LPCZT775QxKHSZxiMvq0173g96L26OYWTfEr7Etyovutwwvd5fmbYvZDPIQ06hbbGWVzWP24+v0Vp1b2ZhpZtcUPhYvXJSwgFItajTP6qzIk14MjyiKrxhBxs2XrR+rgaxQDTxVThGEOVGEWWG0xtYRxLWJU+GW+JR7jQnlzNN4nmtBwAkuKBYuJs9/pxrIHdWwgtx+poZ7h7+NGijGV2rQecjmWdXU4zro0MT0EzsFnccL6+xTjILJ3fAgDEYKab3UhsmUGBA2lSkIISik2kjvidZSceQ5s4xozrGGqHcvU4mB/QLPvcNHPFcrwGdT2AnnYYW6X0Hyt9T9LJvB+KrOAc5Dt5zq7Lpql22/qabx5CSEsu51u644y6eFdlDttItl50LnDs53qqZbtgqBs65zUV5Wo6ij2Hk0Ta3kkrRtJ84ZqLbYIIyEIpRS5L00ErxKU+G5kGC57Wa5774ye9sv3o+oPnrz9PHg2Ut1zF4P1T76p4SzZhjEfvPueH8wn57scnM+OS53Mc8H7z68enNIX78MXsx3j1V4mxUFutg9SIvjYflpsj14SPfi+88mc/1vsDtt/dpS9q8L2YmJlUWdhaj2fpZPsxw6E11P+p1pNstCH3VskYdWyC24fjbTJ/CQPI5TO+lEOlCN/3uDcJrP+/O2P1wpZm//8eDd8ChpF86G7mrodlrB9kej0duOrYqyj77jbg9uWK+B9TLUG9JrIL0E9Ibz6jnfxLyhvHrKL25QfrGhvHLKwxuUhxvKq+/MNzGPNpzX8ayxBPSG9HqeoJeh3rD+Lc8bj5Ivf28tHIVbYW53uyhlzHiPBNHIRoBpioWTLuJVUiHuPTjhFUKSUY20lYQpbqS3BBsmHBFdIaQCTVi3GQh2MSot4i9PX6un/DR+wkdOTD1+nuMndu/42ZOjV4+IO4Bd1YwGHy05Ozw7GFGGUlMcoml9wt4f6GHl3zw3hxDmzDVw+D9A6xC0nbRe0c9gt35FZL1wLJbC9gvKmHQm8bDVzFMrKQaOmfJCpcZgZxVB1HFAtDMDl+nLyK6wzeLu1+WCoE/6XmIgSoOS0mAllNLGKWK5UlHfCKC1U77FaH2zqyitFXW5HjZrZx1r587e7b8cu3qiCRfxagSKRaoRtohriSpFNE+9c8Z5lhJpBFIOudSDgIhdea08NspwwxlykrZ27FXZF6s3SsHxdufXmllqrPKFzR57wQJV0iNoKym8ryH+RndPuZ1dEXRs3vS7cXljyHf78oeGPAfnAXGBJDDmkRKWOSypjRioo8SkQBzxTImIjTomYy+RzBIqCEWGtunezhldk21/V4/+/un+1KO/b/hb/WODRCulr/9azC4=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_copy&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzU0OgjAQQOG7dK2U2j/K3ngBL9DpTAMRaENHozHeXZbv27yvmHbKYhQTc22jlGkpTzzHOnefuCG9u41YvpTEuT1kqbRHnsvWZPIhK7RD1tr6FGy+9Lr3aCxorQcwyoF1YYAENgGgCug8glfkjEFrUJzESjwVPN636/1IprUukemQHJdGvz9+IjFQ\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/c79f1d58f3357c95f20307d45b3338b416b5698bcb5cbbd19d67db71e644d54d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/c79f1d58f3357c95f20307d45b3338b416b5698bcb5cbbd19d67db71e644d54d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/c79f1d58f3357c95f20307d45b3338b416b5698bcb5cbbd19d67db71e644d54d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/c79f1d58f3357c95f20307d45b3338b416b5698bcb5cbbd19d67db71e644d54d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/c79f1d58f3357c95f20307d45b3338b416b5698bcb5cbbd19d67db71e644d54d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/c79f1d58f3357c95f20307d45b3338b416b5698bcb5cbbd19d67db71e644d54d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_device_code_auth.json",
    "content": "[{\"method\": \"POST\", \"url\": \"https://oauth.yandex.ru/device/code\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\"}, \"content\": \"eJxLzslMzSuJz0yxNTC1sDQ2MU4yN0s0NTGwME5MMTeyNDQ2TjU2MjRJMjVWS0kty0xOBSktSS0u0YZwtQ2NjAG8WxSf\", \"response\": {\"status_code\": 200, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"154\"}, \"content\": \"eJw9jtsKwjAQRH+l7LPYtGma2p8puWx0QdK4SYsi/rspgo9zmDPMGzzu5HBxq0eYG9BeoRp9LzuLgwmdlX7S00WEAe0otIRTA/hMxJgXitWQQlREsSDv5l6BqnHLyP/JR3BXR0kf6o5MgZwptMZl46MPt1JSntv2Zc68tb8/8PkCLyYweg==\"}}, {\"method\": \"POST\", \"url\": \"https://oauth.yandex.ru/token\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\"}, \"content\": \"eJw1jkEKwzAMBH+TSy6WJVnOwW8JliWXQGlLYgr9fVPaHncZZvey19tYx+vhxfy5NV/b3Xxq183PfrMSOC9IqJIqU8hYTeICiI4RSBmnD1/E2DlZRFCn2kHRsuQldHJNQfAvPLztPgrkZNYtI0cl7iejQjVC7ZKCc5t+X8794ceYv3GGiG9UozdY\", \"response\": {\"status_code\": 400, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"103\"}, \"content\": \"eJw1jMsJgDAMQFcJOTuBe3guoQ02IElJ20MVd5cqnt/nQnY3xxWQesvmclIT01BYk+iOC3xGSFyjS5lw2ltlh0wV1BoMbvDnnGBYd6BSDonvDO8HpfImFQ==\"}}, {\"method\": \"POST\", \"url\": \"https://oauth.yandex.ru/token\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\"}, \"content\": \"eJw1jkEKwzAMBH+TSy6WJVnOwW8JliWXQGlLYgr9fVPaHncZZvey19tYx+vhxfy5NV/b3Xxq183PfrMSOC9IqJIqU8hYTeICiI4RSBmnD1/E2DlZRFCn2kHRsuQldHJNQfAvPLztPgrkZNYtI0cl7iejQjVC7ZKCc5t+X8794ceYv3GGiG9UozdY\", \"response\": {\"status_code\": 200, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"274\"}, \"content\": \"eJxFjslugzAARH8l8rmRQECacHMpoGKUsJQ04WKBMZjdtUmzVP33Qi+d08wcZt43yAihUuJpbOkAzBW4KxhWcFGOQqWFMPa/wiXa3pj1fDakUUWc3o7QRUnlprSMIpv6pJw+K/C0AvTGa0Elrpc5TTU0Q9O2cy9oOdfs/0k11bjo1LxOiD5YMX9JTXEOGfW8wHr0TkF6dMGqlidVEwkFrxmGfkfGyA3Yx+jZiDFFkceG70ZdN+D7YXNp15LxAdJePPdW5J+7PTQdyzm8npC8GmhfvG1Ot2C7K64L6B8Inu6cLjQ5zQQV4OcXsaFZJA==\"}}, {\"method\": \"GET\", \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\", \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoampAAAcj1rSZxVAGKUgGZefRREeLcftqg\"}, \"content\": \"eJwDAAAAAAE=\", \"response\": {\"status_code\": 404, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"137\"}, \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"}}, {\"method\": \"POST\", \"url\": \"https://oauth.yandex.ru/revoke_token\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\"}, \"content\": \"eJw1irsOgjAUQP/Gue3ti4GhAzERFiA6sJA+bgmioNAY/Xtl8EznJMd6j9vWp2XCOf+Q3gxmx5U1mYxpq1e9Z3Fa7P3xE3+la9u9L+ZYnodjh7FpCqx8TM/h4G8jzqkfQ06EzoCDU9IKTjTYoFhGARAY5U7Af93Qr5hyqmUIMWgQzHER0UmnuGXURiUJCv8FS/Ez0Q==\", \"response\": {\"status_code\": 200, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"16\"}, \"content\": \"eJyrViouSSwpLVayUlDKz1aqBQAv3wVZ\"}}, {\"method\": \"GET\", \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\", \"headers\": {\"content-type\": \"application/x-www-form-urlencoded\", \"connection\": \"keep-alive\", \"authorization\": \"OAuth y0_AgAAAAAbKQ0kAASLvQAAAAEJoampAAAcj1rSZxVAGKUgGZefRREeLcftqg\"}, \"content\": \"eJwDAAAAAAE=\", \"response\": {\"status_code\": 401, \"headers\": {\"content-type\": \"application/json\", \"content-length\": \"99\"}, \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoULGy5suth0Yd/Fhgs7Lmy/sO/CJqDIXj0lHaWU1OLkosyCksz8PKDi0LzE0pKM/KLMqtQUoGRqUVF+EZqwK1isFgCIxiz4\"}}]"
  },
  {
    "path": "tests/recorded/sync/test_download_by_link_error.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 500,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_get_disk_info.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1268\"\n            },\n            \"content\": \"eJyNVNFq2zAU/ZXh16ZESuw4zgds7H3vRrUVR1iWjCVn60qhzWAddDDYy2CUlUI/IHTNlrZLvkH6o125XZO1L36xse45555rn+sDryDv4jHjNFbsPfVGGIX90MfDnt/xSsLS+Ek96A+GIYpwD6GOp6UmPFYlSaDiBygKcTAYoGHHq2gWa1bAsddDONxFeBf7b3Aw8vGo199BaISQBwIVUZMHZdBjKnY9vdGYcEWbZ5YWYEGQjKbxWPKUVjFJ04oqFZMkgdsjuFYAefDSjyIcRUMcoX7HU/tK0+KBDfgDT6ZC5pwoJVjOwGLKVD7qmguzth/N0szNnf1sVvbULF7YY7OwM7Psmh/m2qzM2tyaOzO3x1BYAfbWLGGOTMqM05ZKrxrwDtCYUJpkFSlaMl8/4jveNJdCk1y37Wq+mu/gfgUPc3ML1wWIEK1JMtkonIPCCdTW5qphmysYdm1+mYUb1n4BSkEYr+q2Tc+AffMCbkt7BORUvhVcklRt+N+A+dMe2Q/mt3uZXeeqLDlLiGZSbAHP7RG0eWpnDN97T8q8paGX/+AQC5kwwlvy3OAQNioyWm0olwC+Afipm3DRZMI5u3YOwe0cWAnhVKRki3QG6Zk19fteQL4C6gwOFvbEGUvI9twX8Frmzk9TqigVaiL1/4BGbGU/wQgze+rcloCRSld0O1yXrt5EeG7+3FvseofN6lRuL1puLaiVnOzHgjRQNs3FFI5rt7meHwSDMMBhzw0va6GrfTiFxDTrnEwY3+w3lxkTjwqHzxa+rPcgCM8WXXBWMA11UmtZly5QMRVkj9ONdEWnTEGA4I8W9lAQREHQD6MAB/7hX6naRCs=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_get_files.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=0&limit=25\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"36722\"\n            },\n            \"content\": \"eJzVneduI8m2pd+lgNt/5vBWeNNAY0AjWpGi6CRxMCDC0nvPi/Pus1Pdd07NnColCUnV3YUCZEglMyP2/vZakRGR//VlvAvz7Zdf/9d/fTGL3fgw3uy3g+3O7Pbwyy9uFsziyz++bMeX8OVXTCgm//jilvN5WOwGYw9v+a8vq834YHZhsAnb5X7j4H1fGOdCcizJr1xiGRBVCHtGkWSMY8e1VtgYQrXT8L1EMSKpNReUI4JQ4D4qGjD1Nhj47NXezsbukw7/z398WZh5ctDsoNdkhdaClC7PxdGY1fs4+1w7d1oTYmVXLUtj2831XkpjNVzCWYXTOMLVw9+7TYDL93AIgrDMIPiPO1j9yvCvWP4PhH5FCN7/36cPrfbRDTRf+nEcp57BfDwPg915lVysWa2gTc1uvFx8Xbpd2GW2O7iMObwtjmfJO0a73Wr769evfnlczJbGh81/+vF2+p9ns/Dh9J+b/dfkx6+IWYWDRJbB6aGgnPMyGssInLjDyVfrlGY8BMyI85FppbGlXBLtnFL2qxAqBBb118W2XJmG59rCtEqrznmBuuPW+tF0qXsgp1JjsmhMy6NFNpMt9Gq7OM6ykl/HfnF834iH6s6IklkMVs1OrR/FjoeXfWl37PeO/0EL8P9/7sf+t//b5r8kl5j0+m+39PkvcL2r5XactNlvZrczbpRkwS8jsx399stsPB/vfkO/uOVil+RG0s6/fdPK/0GK37bzL9CqYTP4/04rybLfXpPslxG8ohH0uldSB2WdRg5ZZyEALEIqSMHpL/Pgx+b3j/JmZ37ZTReH3w7kl7Azw980YZoGISiRwUkVhRFERsW01o55FJLMMrsRdHXSkb9+vVu4zXkFgfw1v/Tha3a7DXM7O3/N0fm2UUUuO2zh4bxCh6JwoJ3xc7NQZZ1VIXs49Fvj7T43LrbQ1xuT6F8XkJwGXEKCmpEhXCQ5AqEluVQEYxYpFQK5EHgw2AvjtGIIB+QiIjF6SiOJlBjJlGXSJ2nkkgv848ivIQ2f5jn8cEW7bMJhvIVOA+Il8UoZk1Ih+Cf++Y8rMMnQbYwUNnj4hOg8DgFOSBgq4WvkDDJIK0gTDmfII2SJw8xYgS0ijjG4aiS85CmMfPfhv2HkbEgWeTfbx0KYL3txddzhS/7oz3KUOZXUfX/7slwVWIbkyf0HMvIDGujPZKRTKFikjEICIYcddcxRS3SA+CY4MCcA9xxFHaNVTjjOFAS1I1IDPbF1KYzsjpbD8macDZPs4X58V2jQ7aGz77wEdWovBueXCq3c18+H8qh0b02+uRwsNp1plS2x3srOOObTGHlDn/8sRjL0CsgQrHTcWukNiYFTBFTwTnjLoIR6mwJIiCqOmGLCRR9DRJ4TZESgwgWlIlKfAshCqTVGueXdY5W0TWl9X++27w1rnqvZ3hqvOsY2Qm8tmwVb1eLrjen2Jk29hcgiyHGuIWU8QQGxEKTHXCkoOMgiSWMMlDoJeUMFh5DUzFKqmYE8Uj+g6RWN+D2aakGUYlfRlIsbaRpo9KBAogjGOmSgbCrOjTHSKKy4CF5jDVIEU2o8VNioggrIQEpqpJ33aTR97+H/RdNCMyPMU3ZwMuRYrOb948A87Z/anX67KXp1IjrDdbu5eVwUQmvykTR9fwP9mTQNPEqlHOJIBuME4tHRAOAMFiMLNFUKRayNUFogiFtsPQbJ6QTRnnHNTQpNnyV5bLdzu+5Dbj8v8zZfjIrTuShPz4N7w+erzqh3P7lvNLN8DiJi93Juj3vbHn/ITjrkmU2Gw7dpekuf/yyacvFKU4sJRIWHqqqoskQSp4XnTgXisY00vk3T4JUSECiGkygdMdRhGql1IN28R5j9+TS9Md3epCnxUWvsvfAgPhWocoM0CgIAKqUXjFiqDZAW6Em9RMExC0FHwfSYaJni6Ac0vaIRv6tNFWKSXEVTjNhtOIWLA10dBCgYHcNrCQGNTcCWGK68Bt0dA0FSAdCBFpF50NDWec2RsFJHkYLTdx/+XzjN9Q/yZIbTrLmzovkCDX6nmmbUnfn7yM81X28dH0/Cz9ToLns1TnUqTj+ggd7Eqf5cnEqBhODBB0h1pI2hikIUAkujkJpbwhEmHBwVdQ5JT4z2ATs4miNCEsLTxGmnWVx2MqdNhXUu2S42x36tl9np/PNhMr5MHy90Puzvs7y8sS9PpZWuZC+91fJ587AuTLJ0ullk38bpLX3+0ww8Yq88hQTGv9fXCJLecwNtCE1roIsJw9y+zVNuhbMBzCwY1RC0sFxrGwn0ABgE+lfg6Y359iZPLZRxYzR3IEy50CBMuIgQavATiBLPlIP245b6oCSnEHxMeVAoHqy7AGLyH/D0ikb8Dk+1hoPqK3lKbjT7yMEJSDCoAIEIupkwTQjkEhQUD/pKIwfooMzAKQuQLVGAEYRGwskgmiWWpPD03Yf/F0/zq9Z+lGts2CJk/IDtyVYzlekve9mNaDyvouoat2kdS739/cO1PCUolacf0EBv8fSbM/gksw9GK1gQoBBH2FjDqVNCgz4QVmjpJbyMOSHWOQ/lgZAIdgkCL4JdArHKU3hq/H5cP24qT7pebsyr5fqFtJ/M2rJZe1xcq0oz1+1NSOxmQjGfIRexmAxJrTvZrg/4nt89DVLM/i19/vMGRP9w+4ohsJkOM2gmpLFlAFQoVzxpRx7C2zwlYGmENVDTgMeRYWqoZYFwJSOjBtM/n6c35tvbbh8CCqgJLs5gK5FCQhq4UKMJZI10SFDqhSIEhagDAbHqIuBVReM00cDIH/D0ikb8d54qpAhi+kq3f6s+DVFoAbJbeBIgz2LQPjkZS1lgzDpqQowW1DQkpFOSRItAzvjAGfhFgZxM4em7D/8NT0kYMXXoLPHgNNlXc5mX6Z1aWvXsK71CR8/sclfYitMA5x7YfqA7QvdPm1YzlHmn1bjkGo3H3367mrM4lbMf0HBvchZ/LmeZCSC6k2E+UAYuUVbIWAtcZc45o0UQimom4VWtFKM6YI+ldtKCAieYpunWMLo7PO9auUk1MxsX9v0eHvr144zxC/aNXKm3ydc6FbVempdKHtUm2UdydxllqpdSVMX6rltP4+y7Y+H34/+0IYI/NC0iFGnOXUA0Gb32IjCNBUg0ghHwg6eMuIJthpDiYC2YgE8ApwR2GGLQe0J9JH8BBl8a4n5auPAn1KyI/HKS32nXR+v2qJedbp52D7SVQ7lGqbB/ePz6QQn9Jsh5UJyDo+CBGoWiZoFjkD1EJcNfERscpNLBWumspcQ7ip1MzAUF3yZRkD8atk3vie+AHCvGBdZXgVzfKoy15MhzpKAyYdD/cJ0RQepqJTgJDvCE4RrhKk2EcoWtBSvlnOTceqhXktgUkL/78N+M20q1bpBl9IWFHVQ29Uk1iHLpVDh27V3Ap+5TodI/v7QeQ2tlRtv6AGeECAN26bLLICza2B0/FOQf0HB/JsgtdsjBBUQNVcaDxAeZAnIhIgFRHaxjUKSALBYHjAIKAXyiUQJKEIS3Dk6mzSBgbhAaq0Y/2z/dl6prFM7dh9HL5cUVfKd+Mo/lVZ/Gx/wQFWvzXvuMS+djeNlXm2y5nQ+HuceU8dx3x8LPBbn+Q0wjj1wyycQjar1X1oM2ZMEZKPWAApcyOJHoSWkR9R5iD0x1BNlAoRp4IQkLAv3NQP5BCf0myAPENGbKGmhk8C+YIRWcRkRELoIClUVsVJCiRCOswf9SzaFFpTIKqi1D7Acgv6InvgdyzQjh9CqQE3zjDbjAlOOcQBSh5G4SYaAdo6BcE8MFQ4HYgKPlEb5ohCj8CJqNckPB7UtrcZoif+/hvwH58CGOy51xfzSZb6dmeeSP51Hhsabw/DGTbY+XVTS3l0a5vanyx6LK0/rkeB7K+yIfs82a4cktipykK/L3N9ybICefC/KkmEgKFkJ5KhFT0ohINGPYMZYM2iBOHJWMEQ5RD3KDB2GpN5YoymQ0PgXk9hj8fbfeQ83hfau7Pl/KOjds0ruXqixPSy/TWeW+MjHL7nDsp436bMH4/KSnobu4mxbbT4unlJHk98fCzwU5pOUryEkEzwN1UfPIJE5m4UUCgeTBxYWAuHkb5NYDYzBwwnAvqZTaaquYYToEEAfG/N1A/jEJ/fZQNaYhOIoscUZGbowHbY6UCzQaYZNZak5AVHtOuQUn7V0y3wIQriHgqdb4ByC/oie+A3LCEAZ/cN1QNVU3jq04nkhEBBpRIx7BVERIZA+lS4OA9HB2INacsqAzfdTidTyIgc/WykvQdK93Od8i+bsP/83EtCAfHoq6MDOoehxenqrnnfDTI7O5+qQo1+VJsV05N8kO+0XlamKzVGJ/QAO9SWz2yZN3naCIgPSzzsdkXI8TiKzIHbNgJ7gRjhAnQaJQJQNcKU6UIYPLlBGCT6C0iWnIFFx+E0rPubjMrcrzXrazmKFVe/qsF0+j5os9rqrGDbKLB9q5H+3nL9G1W26XK56zUVeLKcS+pc9/2lg15NgrlqOWiMvIoDEFYmBjsATjFUGlRchuj97GsoGCj2UyeVEYoDpRPmF5EERYH6O3fzMs35idb+IXbCIK0gqJrEimxQurpQBUIqQZOGHjjXNEaGORtyQZHKTRa6qEpAp+qX80j+2KFv8OfjnCWPHrBkQwKPLb8AuGgBDpvBSKM8wJqCoNZs0EriS8BWoLAy8cHBh5rzmUDMIBOhyMP44BkzQh/e7DfyOkBz2w06OMeskMd3tXOW62/enuOczK7V2vGVZCZ2r1wWW4f5zZbt4Wjg8T+SCXi2zY0+N08lC7RUinY/kDGu7PxLIE7Y8t6GijJcSZJUAVF4jAVioCX31ANiiGgyIgF6x24BcDxK1k8IoSMW1ou5mZv8x6p8PoNNXVPl00a+1dhuFCf9edt9GBTpqTmJ3l6qK+GhRLk1rt2CqXQqmUU5dq2TfTRkTeHQs/V0gnefmKbIPAhaAIlTqoGKJzAaw1ijKAw0KcpdxflFAxoV5SL6BmMugpEOCU2aAVJzEw9zdD9gdl9JsoN9JGIDLVCJIR6A3w9lb7iCB4wQXHyIRXBAPQsaOgoBBFVIjg4I+oAvz/AOVX9MT3UA7Mp/JKlJNbUR6MEVCeDNKa8kgxmGFHpCHOWUkZtaCmKHFg3pgJkNiCUAwmWeIYDY4u6rQxkfce/ptZdJm2n7cH8/myUhAvg91snN8fM6WKb/h99eSa4+IE0+qZZkrV5WV8HrJOo7ZVZ1vqQZo0kN1nr0c5TUf5BzTcWyinn4xySxnwGmhCEdNGaI4Tl4CIUipxd8BxTY0nASXTBFFi3rEm0UrnkIIkYSko79dnVXnHn2aVc+7RbgbNhdCx1dW11kMo8Z24B5A9lc75+iL7UHek2NzamSaL6rLu17UMPqRMVn5/LPxklJM/UK594myU5FAcFag6FQVSXFFHfMBCpNymVIxgHrUz3tJkboM1QWCnsQ0EaIT03wzlH5TRb8+HlmCAIZadwcEGShlnhhJDEA0O9JcBbeIcS8yjjoxSEF00CCeV98B+zPyPRrfTe+LfUQ6VhBHJ0HVr9fStgyJKOgncERYzCbYfkhj8MgdzRxhmhkSqk3egEEVEBox+cj8VEl2BIcFIubT1Je8+/DeqnILtnrHVoeqwYe3hy6WJJERkubLZr8gEXH1NomNVnNaEFl5y/fN9viznfXR/WHQWuc6Z33Cf8gqUf0DD/Zkoh9BL7pGRJKyxUN5GCqcomYLg9jJiQwNBYDdltBDooCPl67h3Mj0qIOZC2rqTvZ241pK1N7lFpnws2VElexaFLaTffFzblmiG5emmkLm0c9Uzvhf7dbV1P6/29egRsYlbpqnyd8fCz0V5kpevKKeaBgMxgwXR3BpQi9xhqJTg1bRlPm0WNcYaxCTIRgwSPipDFEDCwC8j1xz93WacfFBGvz3AYjCXgTGIcU0lKHNI10g59kowJy113CGBlTBGC58s70eSBe9iMNApIN1/NBU7vSe+h3IF0p3Iq1BOxa0LrxVj5nVGWDCIwRVKYTzWUSGOVOIasHAIu2AhublJluLg6EFWAp245MK5NJS/9/DfjG/T+LSkbdLqcn9hqlMqlcuTOBs3FsV8tY+bjeFwvFgvC26E+lcjW6Qj+/0N9CayxSePb1MTCSfeKe0pdd4LMAnJpOGowQyCMOFwQdHp6ITRcFFWg32AC4OKhHgUJAXZrc0clfP0VO0+5QsqzsKlZMo9vPOnRmEhCo49nXom9Np0uu6cJ6E3L5MOqr5sO6XxoNXRMW3h9Q19/rOwnOTYK5aF4hSkm5ME4AC+TGhHfTLUzaS3WKUsFsTWGS2pZ9ZHqanlMTqKY7JoE2zQqxz8O2H5xux8+/ZiDEozwwKSoJJICOBeLJjaKBUOjCMJ0GSCROadhG8UmMqogoZXiGGW/gi/V7T4d/ArKRKKXDdPhIpbV8KAL5bW6mS+itOg76kXUQgCloArsPzMQtoGbwyxBnxxoCQacNLea6pDMGkzt999+G9mbqPMw6m3Ee37eq44rBwn+mWMm7n+tl+ha7u2Lnsuj059s+sM0dX0TV+o/QEN9CZ9P3mhNkhkbokyyiTbNHgITwZePCiTTFaBFwTlyTRUJDRWYBh99MrB5blkHppDOm1iX5vUe73RqDnZiXxHDp+Lc1Qa7dc4jmTrftLP3JVGxZNpZjfo0qxO2sfavt1Tk7N/qRR3mfqinzL2cUuf/zz6/g5fDKYaJZtdJLcGNMVABYgNgoLCUKDTNgZS4MCRN0CZgGMEjGAOxc8BZYiRyOG/AHxvy7c3eUoFVHdwaTgSHYUl0WtrnA/Yes4C1DMPuaRAChgHioZTHDDI0eQWkQWdIOmPRibSG/G7POWgLNR1IxO3bnyhuMCBODh3jiLSBGSYFEFHycCpMkKYh5de90wCj+oIxBBV4GQpB11uLU5bWfjuw3+7EuZOdiovpxey6JY3s3Kso35H7e/uHk+FyVO5qM/juhJiftDPZewyhd0o98BlElfbWrnUK97fMDDBVLrKfX/DvcXZb87gc+bdwekbbVGyv1BQHkoG1kCGaAOUe2Apwkh4LA2cKcIUJ1PtqMZeWIUZRHjaLA7zcB5tnmoPiIdh7bmDQ+7McEE+s5ywp7tDuSfDfZP3L9XzpdVGhbvnYPfrvhGTjSXusjunzOJ4fyz85IGJP3bLAOMguCcO3AO2FDwz4tyLEOzrsk54U8pqRGtphGqeTPlVIN0iJkkvqGS0Syj5F2DwbSthPiSh317S6CVnMTDFI4qegyF12KCIlfARGhNsh1fJEpVoLKVMc6nBkwjmkJAhuB8OMV/RE/8Gco4RYsmmXdcJY6JuA7nhjCS78iCSmAAvvAXeGGmSTT4QWFNqQVEpbMDdJnMbmIdTNtwzA69ZhtOE8bsP/w3It3KbedL0rtScNOe+VpU8N6pMCmNMeL1xB83la/lMtcLzon4dsAkQMxXYH9BAPwb2/3MGn3NT0EStHQSxQppyy+ALKAkkUSKEpRSYMx8gjqEqJbObXAw2YbZTnIHk4zQF2LHBWq1Nf0dD2D2v8scDcbuCehg891fHPUN63A+5UXk/y+3KVq2l8LNmpzhznSqeZWw5P0oTxjf0+U8TxkS9Qln5ZHNAKNEestOHyHGyA0QkImrMoXy/DWWk4S9BEyJDNWdgVawQYK98svCcUPEXGJUo3I8rL038jNvDsuk/ysqo79WMVGOLl/i+uWjz+ilz1yqux6XwtVDtjprjJ+hVsZA1zp9rhcf+MAwHqo4yVXSQPbI6lHc73tgB7jPFSy3qdtltT3f7bn0/utCGJePmdL/vnc10VBz2y+dlo55fzb7emPZv7/IpIEWTmXoUA7CjlxSMLkhpgxAILaipkBpWGIGsd9TiCF1jYnROgYIHROsfYP2Kvvx3rEPmCUQlv25djLh1pToFLYacC6AWvEMucMeCSrbbUww0hOTWE5zYYS6VBK4p5pRx3GMTQJlSlTYH5L2H/wbrcU/Z8Wnl7+fTTOYxt5jsio+zSxxu/UO7e+qgp3Zg5oBK9/H5aqxfsf7l/Q30JtY/ef2LjRgMuKYgPCJ3xhjsAlE46CCSK0jmsXBNvQpaUWq5AdvhNDKaai+FRCoF6+5hzVTLTea1mr8Q1gC8LdfbR+3kjAxGUub7bMAKx/tYrx1kuY+eWtl2c9a+l0+FpdgMTBrWb+jzn7bGRfx+D5B7iynRgVJlFQLz4izRwlObZDfGKTPzvIouaWOrnWOYAHA8FFTQ7pRiEWL8C2C9tsrkepX8ZIDamC4brNFcrKrLTmFVzfTvZw2x3fXr50y1sOw9fL0xOd+ELwK9lNxSBb0UmHRGcpnclCegr4PTjFHvOMgUocXrugCWTFRiNLntoyBRJfkBfK9o8e/AlwitJblu2yV1q6QmVgupw+tG6jgEqkEb+mQHSWQjuAZOiYOmMCwS7iF5GbMS6o0OHq6Z0LSxkXcf/hv2TnrMtB5mnU5uMBlYFCtT4RaNyWidK+juiSyGLi8DX+NKGN4/li5P/afFoWwOAzJkarJTB0SfK54OZPMwvytOuqX+ne+2pleOl1zF6Q9ozD+T09whSgWCgmIpExZkNXDbOGZiUB60OQvaIoq89pFQjYhTyd64LtnT1mPP0iZymAM/55t7UD/zY+kw2V0GTubu1sVcyw+KDPczmR2q1qcZmZX7JZGYxNPTIIxckRwy6+PzJm3nkM+Jj584gqJ+1+qUIwbN+/vy/2Rb7BAw0TI4JxNbj1MWLkZJiWQMG4Y8cYAaizimAZS+Bsx8zu72tw2gtKJbbAfyodCddu9ke3J6YYuMm+96aJpM9Blmzlv85Mv9+ebua+EwqLWGa5s7NzfT1bRyDPR8bIs6Xo1emoc8vozbD8z2yGQ6Onz9RES8WS0EdJgLkOaQ08QrogIX3mgOvQXfk2SEW7gQkbPJsgSnrSNY4WT6lrFgwH60qdQVXfm9apG8hq6b5HfzCExgXCkM2DLwKRExgrVTQjKQc1p7ABbwTAZBhYCWANNjobBFwZlREa6dhzSp/t7DfzPHr/ocGueJ3io3XrV93jzjSjlWQ2m0L9q7R8jPzmBXWpPx0F+5SR8AmF6xVP3dDfRmCaCfWwKiE1FGA4RXAs6JQHgiFahyGBMr4EwFxchLrpySHCqAkx6UJrMhchApXKftOVJ4eOBns9SPjXbFNIfbYqU7FaCIztFmMs0HOus/dktslfWn3vOxPj273mI2Gfcedq1if58fp+0hfUOf/+wRGK5iYJ4QC21vkqfVQAElERRj8vCXiHXapqfaKxZQMlVBUaxN4ptMVEQI68Hv//lUv3EE5qbkfHuxjPdMy6ggVQIodtBfgEIEv/WWwu8AxxxzUOvcYBBjYDGTDf9csiVQ5BGs6I+m5aW3+HfgyzBVYHM/Z16IABsSJElurTkIJikFNzZYzqShkItIefQ6B4ZConpJQ5RQNZSw3DlvNU4bJ3n34b/R6kOxW7C2MlUZ60u3H+2aztcy4aH94goT0yMkPKpcK+ZXdLfvrAe6e9y3au28u+TEjo4Hp/FknpuvDneF3uVx+bRtqsJj6Gyv1+rpk64/oDHfBPUnT7pmHgIuWig3BsgiQSN4wUEhaC55IimUZMlIeoRLoAgEpUvmoFqspMcUG4XThsrjHRMdvaPZPO9dutljtmwifjkUJqi2GveHojfIti7P4+FxOdvM2kdMu1vXO9xVJwM82D/JNK3+OfHxE7X6f884kRSD4zfOu+C0NMJJiRlUdyMiCjxtYJ2S4AgUBh2dB4nnKVfEcYahNzUx9K8w4+Qmsb475Ip3RZXV2f76qcls+zhxsjEfzU7jwbqe80u+aDe7RzE9P339REa8WS+0T7bZ4cmyJ1Axrw/AsDGAc+eco0AgnXAMBjojuhijcS5hO3SpUyYiyK8f1IsruvJ79YIKgsR18whvXVqpIM+JkmDPEUKWseQRdDG5OOGsY5JoTKS3SHBsEGNUEaq8iBw55T1gInUS93sP/+3d0l6pZdR417/UL2Wsy/l8ccBceF4VV8dqtlte5VvZdenBsgdR4bqVWRZC4Vyrrztr5U0le3hROl8VbLF8XLeCnT/SPPBbfWS5+IDG/DPLBXGgPSOEPhQ4R8Agaqu0FsngpgomKGIgbiXSRCGvKdeJgEqezcEjlESD0+6smu5MVXf0sdlq3odidnJY5cYKb59WGSJ78fgo2GRyuCxKOzVtHO8yyzhBbtirDZq75vjluHpImwrzOfHxE8vFH8svaUie75TciLU6IomoUMoGipPtRZFiKdVCMumCwNBx8MfJ2m0L/ADVIrSXGKm/wp5UN1WL5Xw86M4e7kjM19h+hNu5+6Uarbrzyd2lOhlOx7WXHum4xaG7+fqJiHj7RkBAlAgbBPIx+QNNJQo4Oh044kyAm2fQhZYa5q1Mhus81RGUoqeUYf/Dp4Nd0ZXfqxaQngRd+fwFfmO5YJ5jLUWgOtn9nEZpHfgeboyNlCczhSy4JQaOHzksGZPMsWS6vaDMELiQtAfSvvvw37oLmpvNjzizzl+y3X6u7u8K1aJ7GnRbzexL7ZBb9aez8zx/KLkdDXgvm+FJVwuVnmKX2XNlHu75ZBcuMzJulSfFTdu3SngQX64vFzy1XHxAY75ZLvhnrw/ihCNrlNKIekNB2bhgIfYVdV4lE4JJZAwT7ixUkuAVVDuVRKcH20GZSNto5SXsi6uu2p/sOvfUGZgXIOBa3GXCuTUcRJlvPMXCtlhr7uadneao33nwOXtQInd/1uRpnFYuPic+fuZ6ff57vQCt4ZKnCFoNjSmFSOZogQWNWlqVbGqaMmgUIqZQx020iHFvnRdaYh1lpMn+9n+BJ+XcVi/WJtYAx/X1jndG2/LLBg/RStVp6XE0ndTo89P++HyiB/lQU18/kRFvuwsshFQq8ugDiEEMtpBbS0KUmhmcrP2LyabTICRd0JZSQqB3NFYOCoyPP5yMeUVXfqdeCIK1VteNRt1cL5KnuUUtNE3uiZtkDNMi5zjlHC5KQ1X0QD0VnRIInJbFXBjsNEIJSqDWsZR68e7Df1MvxpYPL7lsub1k7cOluM/d1XLU5vvH4nnvuvqiT2M+Ws8fwr5eXrx4mT3ekXIxhwfyvF9tbWXXCMcDLk/LldW8yMaDWsW1ph9aLz6gMf/MegGnJD2Kwr3OPQmceIGMdsyogBU4bbAdIKM8Y5xpBH5C0JhsBeCloAqBGk7b4VaWhqdnW2wdeq49pp1t+7HZn1Zzi/aRiOyog6fd7GN/vp/tSr3WZelyfjHNTluzxexpxiarYdpo1OfEx59QLwSVwnkLhQIDKahlxie3HLGnLgJ/XMqTKp1QydMbieBEgG8lUPNBkVCMMMSZ+Ss8CeimejG2w8mlbXvbVWieHp9D8cUXhdyN/KaA7/POXh5euicxy+az66+fyIg36wWGfvGBJ3eMsTBURXDqxoGESp4riD1yRpnIpIbUo8macxKSJyRi5pUIICF/+LzM9K78Tr3gyeDllZvm3jrRyCWL8YgKimCabCmGokvKmY8u2SUEiAW2SjvrUbJVJbzLJs+rMSGZkJLMR0nbs/Hdh/+mXCxOzVZ2XOnL1ng5jo1lo3E+bp/6uNe6P9Vys9W5wqa5abP42N7nINLnxQYx5fzdguEmO7UuaMa3hcmeXY6zsSINPevVW2Z+95Hl4gMa888sFwTCTRCBpQpgrY2RUDNcUJIIIpN9M0JM7pcjTnHiKxQTFhGI3WB9slMYS3tScauMrfbPj+fzw0MotZusVjM7ZVX2odW4rIqsmD37GS4ez9vBYjTPPlb2i7uwa48gVyrVOCqmlYvPiY+fP9FIJNtnaijTUJwNlGtP4R+oVZVsJGekTHMXAmNmAw7udW2B4ZEyrBVlmjAv/3b3LpZi1n1uZfn6RZhtr50dzU7tpwMc9HFVqAwOGd/bMTpoNXf48PUTEfH2vW4adCRWS2K5RJproDuOmAMOkg2UCQ2SQwc44hSFFIPagRniXnAWEUH+R2sCrujK71UL+HjFrtuCBt+6mZhWAcqX9ogQ4VyycxRzySTyxANx/7pGiCZbyOOoKChmQQjjBM4/eEIc4COlXLz78N+Ui1mpfRkuWKY2H7hNrSIfUCY3eWCVeru8n592j8NpLxsK+LmR9yqqcXuhl9P6qTtyFO3PY7KZz9rNx1lnpnPVjpq9rMLZiGP3+nKRvlvNBzTmm+Xik3er4ZpaY6NAWkbtiQjBC+oMOGnFoSAgcELMU2led+7QOnpQORDIOnlIiCEmdf3A5tyab3Blu5l25gjnwnJ7RJXVk+qi1vHufP/kBpM6bnf00rafyOrlvCxmm43ZUty1n2npoZ1WLj4nPn6mu/jvHcekdtwxiQXyQUQmRHSYBqccDl6lrewFU8gsFdAxTPAgkwdlJ3OibXAY+kf87erFrJ4v7zedy8P0qfNkJu3M42N+s9iGQf1wv3lpHE+ddv65bLOVbfHrJzLi7S3LkIVaLiJPnqME+ZAsIiJI0Ui0ZCIm0/mSO30EI588QFpwhLiyUDko5JAzP3okxxVd+Z16IVEyZkX++b//8eU1Nr/8Svg/vixj3Ab4Hv3z/wAMTU/T\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FA_VP4DRn2GzXFhi4MZ1AXKyTRj2b7U8oGibUBVYGi8go&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FAlg2nCclufDemoVfpwt1zCwdy7h-xG8LZsYopD4-2C2L&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDP-6aWA_xa2wFJCdQ_aWuWSTZSP6VM26TgqSPrQnDeRj&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FBZv7xagkAaEb6PY68eE8PahUldLf5yKdMRwQx6dl8hEA&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCpRuhBNr4ne-d_4u2s948-ZoVAr6NXpf8UacrRwGVuLO&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FC2eh48vTo1_xjuJB-YkE8ob8XdIVDT9lbotDs6x_1BO4u_9T69ZxrRPeH5TRNzBNNQ%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FD78qN2ofdDnb_IrMjJe6HGxDwUbEe1xUWDIZyYRQeRpahsM_1-66e_4zU4z_enS1cw%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FDgOfiHTiZhjmskaow5QyhDQK81mQ-ASioJ0mbzNHSrJ5QF8C3Mjwyg7LF5i4rq41jQ%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FAe7OOF9Dla0JwgzWJyt6dkw4bBMjF7qHjFSIyP2t1dnI&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FD_VcDdh-8Y-gtucIwrsZktXelHStVPep69-KM_zguQlbUCbDwOj7O7onAeu3wkjOKQ%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FB-SdmS_mmoID6Y_tliCuw-GIdNduJxcPiFj13Jy3-GJoziyg4TNKs8ybGV5a3N0buA%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FD3foBl4pvJc1a4SgYzP07sNJHIrup2jf38K70wJ6xq23DYBZyLCH7mZ0LvnTnBTy5w%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FA3fWo3S2RU5dz48TGGHHjfliNnFCJZ1PNgginqoDch0Z&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FC0-OxVr6SLMBFgIwj9Yi1PBZsZI3qbqbcAyHhxZatTg0&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCzN6LkDz5W0PI6CojCt9cZ0qShVAkrWtO3RB0BNGDuOQ%2FC2E7TIYxY2nUHrlHfM0ZT8uEEQxDjWHF9yiM866mv9XH1c-DthBO57PDJ4sKHGVFLw%3D%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDLiIYP1X1SgHaZQ7IhZd8l2JfR5G5uPnS5Mx-ERFqiGe%2FDJUhPiW1l-6n7K55XKDQZgeg_8M0-J0v7V2pvHtt5Nt6%2FC-FzKf9SHcsxEuUMuhz3Nb2iPkuuVyakhFgZHyoNMCpl%2FCs7s-W93EGPjPmdKJ75BhIjDi125MNE149dKC-JI5C6M&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDKp-BVICj_0S13oN4NPnpJoTDpJ-ZLlN6stZMy-JDoVO%2FCfu34wWpdLmk--QBnjtFQlzfgsdOSUxT0WSe4av0GLfX&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDv_KRgqbByPrkpkIwe3ywS6M1phYPvC1ziSO4bV2jkhv%2FCjV4aROlTTB_j_b0fIk6cnNjhqBD9Ux2ngcC7e5q1IegLQGzWZWnvHav_2g48jt8v03XId3_7PvmEFjUGZEdURk%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDLiIYP1X1SgHaZQ7IhZd8l2JfR5G5uPnS5Mx-ERFqiGe%2FDJXeNyj9s8cipSdCaX1IHfJeGhuFbEQpplT_tGq2igdO&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDtvBFEF8A9AZqWP4bSwjc7Nmhlxi_qMBdo5nSPUw6kyW%2FCg6tn4S8aJ7fMocuhtPcdK-eOSYcDjaV22eQ8BRfCp3tuTq_9UwuRKSCczB6t3i_xijmBmpvEDVzQoWsP8DQeTs%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDomi_UlOE2fCK4uh1SBLo8hpUmjEzJjgkiKYV2TcnvUr%2FCsVGRa8itZzMzH19HCCF_4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDqafKe03Mqt5ThsHYr1g0p8M3GQhkjK3XWuwXx3v7OK8%2FCg3Blmw1-qCzAUZBMdEDJFcW_URPAYKvBpZklymCvGct3e1u7PeW9JDIV84zlXImeL5jtezl2iRHjFrSdRG1_fY%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDibgjzSbVspePxQXeFYdF67thdrD1LCcbzOYUx6lACAq%2FCib5gzBAHSo4SvzFuBEKB3bCZwFyucU9z9xi5hqmOeuMHnYd7AwE2HFB1_7yupsbItNewv1HkHIpmF4i_KIcRkY%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDo6lUXRA5qY6asVSAhlxSWv1pTQpDI_v-dVt43_RPt1v%2FCnxPRAiIZ7RioifNoNNywsWZ1VRLxKBlpyI4kBkPFQSuBmsNmFN2aHCEn41P4xRz0l5sDju4zwli82N9lVMRamE%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDlMCHurTzOkWTWajS-QQCrnse_MvLrYNwxTSCXHbAIsF%2FClGSzgn4-Km_crKI7O0-BjO4IMSHumxtQgkVAeD1XNCd8f8iSn9okMxUhc30uyi2rmlSPQlTl9BJT8lYpeya6wU%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=15&limit=10\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15421\"\n            },\n            \"content\": \"eJzVW2dvG8t6/i8Crr/EvJpeDBgBq1gk9iIxCIip5LKXJSny4Pz3vPRJco3AFiXYsnNgAZZYZnfe8pSZ2T9ukjQsdjef/uOPG7NMk0Oy3e9Gu9Ske3jxxs2DWd58vNkl53DziRL18catFouwTEeJhw/8cbPeJgeThtE27Fb7rYNP3TDOheRYkk+GM2IcsogEJKUX3lJFjDSISYIIQ9SaYBU21EROqGQ+YmK4ZwbeswxLuPJ6b+eJe6fh//x4szSLy6D5ndxlBpoW75rT5sLXqpLnJpVpIcGEP9SLmGlfy2eqFZ4XD3BX4TmJMHv4vtsGmL6HIQjCMoPgB3ex+sTIJ4b/DaFPCMHn/+f2IWo/O0CLlU9icvUOFskijNLT+jJZs15DTE2arJa3K5eGNLNLYRoL+FhM5pdPTNJ0vft0e+tXx+V8ZXzY/tMnu9k/T2bpw/M/t/vby5+3PPIoBJZSMWUlDlhhrLEVXnnHNY2KOM+IM1x7JzlSKGKBkTEyuKAQI7dCqBA4JrfLXbkyC4+1pWnfrbunJeol7U2ss3Z7O0xpCOnjOn88EJcWVGP0OFwf9wzpZBhyk/J+nkvLVm2k8PNmtzR33SqeZ2w5Pxn/gxbg59/3if/8vzH/cJniJeuf35LzDzDf9WqXXGL22aSpcZNLF3yYmN3k84d5skjSz+iDWy3TS29c4vz5qyj/g5S+jvMHiGrYjv7PbV167DO02IcJvK48BNY4ErzQyofIMbfCRSKixtxF+mERfGL+upA3qfmQzpaHzwfyIaRm/Blp+CYLFBmqOZMxWCGChzQqhggV/tJXJp1Aoi9p/HRbXLrtaQ1lfJtf+XCb3e3Cws5Ptzm62NWryGXHbTxeVOhYFA60mzw2C1XWXReyh8Ownez2uaTURreFu3aCcqtiq0o65m5z/9Dr3BvWPFWz/Q1ed42th/5GNgu2qsVt4T6pPDXxI+6My2bYkpXJ0Ks5qcY2v+P75rLDH54zxXZpk9yF20K1N2kmA8iqWMoa54+1Qms4DuORekCZKjrIPlkfymnK66m4zWdK51rUnbLbPRf3vYf95EzrliTN2X7fP5nZpDQelk+r+kN+Pb99Y9v/K+iX0EHYL9A4MYSLS1cLaFFLoIWxFjp6SSnhWiGDUHCcc++NssIIZL2jFkdIjYnRORWwVRZpGOu/R/7ShHA1z+GPV+RyGw7JDsrs5hPcsNKUcYG5QFTyPz++AtaJYG+D9UCDQ8i5QA32DrnAHQvKSUYVi9hKbj3BEQnNpZLogg5OGcc9NoExTtUVWP/h4b+C9bin7DhY+/vFLJNp5ZbTtNSan+N45xud3nMXDTqBmQO6u4+Pr4Z1chXWf0KAXoR18s6wDgXGvYVSIkJAIVuDCJSzxYSSGKW00gIqOSgy7KEaqaQCMJ97FyUxmqArsO4aG6babrqo1fyZsDrA22qza2kn52Q0kTI/ZCNWON7Hh9pBlodo0M52mvPOvRwUVmI7Mtdg/Q05/1WwDi32BdYhqpgSHShVViGqsbNEC0/tpbsxDi/DulfRUQ350M4xTABwfLCRe0IpFiHG/wewXltncv1KfjpCHUxXdVZvLtfVVbewrmaG9/O62KXDh1OmWlj1G7dvbM4XwReBXjKKatBLgUlnJJcImo5Ez4PTjFEQJNEroQVAZATVFVBklGHhFDSqJN8B31dE/BvgS4TWkpBXga96q6QmVgup4dpIahwC1aANPZLBIBuZwpwSB6EwLBLuuTOMWQl8owMIsQD9e01S/+jwX2HvtM9MuzHvdnOj6ciiWJkJt6xPJ5tcQfeeyXLs8jLwDa6E8X3r7jwYDpaHsjmMyJipaaoOiD5WPB3J5mFRLE17d8Oi77Vnn38iTv+EYP5OnI6IM0EMsI201HiQhgC7hGljsTYENIcWESrWcRxBh0vjjObRiahs9EBN13DaHPgp39yD+lkc7w7T9DxyMlfclHJtPyoxPMxkUlR9mGVkVu5XRGISnwejMHElcshsjo/b4xWcfp/6gCv+KlRXf2l1yhGjGlkMTA9ggl0ImGjwOA6MXMT4ZVC3UVIiGcOGIU8cQI1FHNMASl8DzITfD+r5dnTL3Ug2Cr1Zryg70+cntsy4RdpHM9desXHmtMMDXx4utsXbwmFUa483NndqbmfrWeUY6OnYEQ94PXlqHvL4nHQazPbJdDY53L4jRLzIFgIS5gK0OfQ08YqowIWH5oBswe8EQJwJFyJyViBjnbaOgLW1CASahS6z32GLV6TyW2xxeQ+hV7HFm1dgAuNKYYAt0GU0guXG2ikhGVFYaw+ABXgmg6BCQCTA9FggNsAMZlSEufNwTar/6PD/ootC9THUT1O9Uy5Zd3zePOJKOVbD3WRfssUW9Gd3lN5tSDL2jVdTAL0u1X88QC9SAH1fCkCaU4k01QYAh/mL71OUgwnVIFOsY0rGL14waA7MQJi3niIF/8FcJCL8CgW0Co0GP5mVbtU7FdMc70qV3kyAIjpFm8k0G3Q+bPXu2Drrn/uPx4fZyfWX82nSb6Tt0nCfT65I9bfk/FevwHAVIaCEWIi94YggjQiJoBiJ8zFi/TKqc6u9YgFBWqiiQMfg/IyJCgyV9eD3fz+qv3EF5k3N+SL4Gu+ZllFBqwRQ7KC/AAoRvOothdcAjjnmoNa5wSDGtKLSSFDhHofIo8HuO+D7ioh/A3wZpkpq8TrwFeht4CvAhgRJmAVpAMUkpeDGBstBilFEHFIeKW0YgAu+LBeFKIE1lLDcOWhgfG2d5IeH/0qrj0W6ZB1lqjI+rNx+kjadr2VCo/PkClPTJyS0VK4d82ua7rubke4d9+1aJ+/OOZHSZPScTBe5xfpQLPTPrdVg11SFVujuXq/V2VWg/gnBfBGo2fsCtRUBZiERptSAj3TcicB1YMpiiljgxEh8WdV3SCLvGENYex4jBefKIlTetaXyWGSiq1OazfP+uZc9Zssm4qdDYYpq62Q4Fv1Rtn1+TMbH1Xw77xwx7e1c/1CsTkd4tB/Ia1r9ferjF2p1COEXWJcUg+M3zrvgtDTCSYkZsLsREQV+bWGdkuAIEIMGQwUSz1OuwGcxjI3XxFD8+2H9bWI9PeRKxZLK6uxwM2gy2zlOnawvJvPnZLR5yPkVX3aavaOYnQa374gRL/IF9AEigiMFQs0pjZ0gNgZw7pxzFIjhCsdgIBnRxRiNcxdsh5Q6ZSLSmn+HL16Rym/xBRUECfoqvpDkbXShsAErIgOUKkKWMQXIFS+TEw6UnCQaJJu3SHBsEGNUEaq8iBw55b30X4jxJbr44eG/3i3t37WNStLh+eFcxrqcz5dGzIXHdWl9rGZ75XW+nd3cNSxriArX7cyqEAqn2sOmu1HeVLKHJ6XzVcGWq9amHeyiRfOA3+pn0sVPCObvpAvFI1YBKi4wbL3lIRoLrIEYJxwkP7BJNNFpeDUyKHJsjbVWg9Kh6lL88trSTm+uqiltNdvN+1DKTg/rXKLwbrDOENmPx5Zg0+nhvLxL1ax+LGZWcYrcuF8bNdNm8nRcN7LXdlbfpT5+IV3AL1+WdoIWRF02Yq2OwMxUKGUDxUF6kBvsCltIJl0QWGkNX2aBQdoYBdUitJcYKfN3Y4vVIhn15o0iifka209wJ3e/UpN1bzEtnqvT8SypPfVJ1y0Pve3tO0LEyxsBAVEibBDIx8sXNNjjgKFVAr+sloKbZ5BCSw14YHlZrvNUR1CKnlKGASG+wxavSOW32IIoMI6v2wjA/I10wTzHWopANSEo0CitA9/DDUAC5TIEZ8EtMeckclgyJhmoSkGioMwQmIi5Qhc/PPzX7oLm5osjzmzy52xvmHvwxUK15AajXruZfaodcuvhbH5a5A93LqUB72UzDHS1UOkrdp4/Vhbhnk/TcJ6TpF2elrYd377Do/j0errgV+niJwTzRbrg70sX5HJgiETFDZhZaxH8C5g44D2NI6gcUEJSQTcAZjGLkFZMgu2VzqEgOY3sCl2Ep7AvrXtq/2w3uUF3ZJ4AATeimAmn9ngUZb4+iIVdqdZMF91UczTsNnzOHpTI3Z80GSTX6OJ96uMX0gU07xe+AK3hOAJTB84uSiEuZ7TAgkYtrUKWX1s0ChFT452JFojeW+eFllhHCQYwBsn+bnyxMbEGcPywSXl3sis/bfEYrdUDvWtNZtMafRzsj4/P9CAbNXX7jhjxsrvAQkBrRB59ADGIwRZya0mIUjODJRcuSlCMICRd0JZSQiA7GisHBOMj899bjbqeym/whSBYa/W61ag384UHOopaaHrZEzeXNUyLnOOUc5iUBlb0gHoqOiUQOC2LuTDYaYSIcsB3nF3hix8e/iu+SCwfn3PZcmfFOodzaZ8r1nLU5ofH0mnvevqsnxM+2SwaYf9QXj55mT0WSbmUwyN52q93tpLWw/GAy7NyZb0osWRUq7j27KfyxU8I5u/kC3Y5oRYNE54hsBWEMmZAyRATnKTOuOANipziiL03giESI7+UqFGKWkPjFb6w8m78/GhL7UPfdRLa3XVazeGsmlt2jkRkJ10862Vbw8V+nt712+eVy/nlLDtrz5fzwZxN1+Nrq1HvUx+/gS8ElcJdzlBZDEhBLTP+suWIPXUR8Me9zBfBCRXB/BHBiQDfSlywoEgoRhjqzNC/G18kdjw9d2x/tw7N59ZjKD35kpDpxG8L+D7v7Lnx1HsW82w+u7l9R4x4kS8w5MUHftkxxsJQFYmDPFFwFtQ57JEzykQmNbTepakcCc5rjplXF8uO0Xf44hWp/AZf8MviJcfvctDIYY4kUUERTKHRFYruQmc+OiMBKRAGW6Wd9Ujyy2FUYi3IYxMoFchK+9dS6At08cPDf0UXy+dmO5tUhrKdrJJYX9Xrp+NuMMT99v1zLTdfnypslps1S63OPgeVvijViSnni0uGm+y5fUZzvitM9+x8nCeK1PW8/9A2i+LPpIufEMzfSRdQlKBfDZQo6FkvPJdMUSFJkMZab8Jlq05gqwgHS+0vdy3grqNn1AHNAN68TBftMrbaP7ZOp0Yj3HWarFYzqbIq22jXz+sSK2VPfo5Lx9NutJwssq3KflkMaWcCt1WpxknpGl28T338+oNGAlPltHaMI2qMvqxZUApqVTkijZHymrsQGDPwhcF9ebbA8EgZ1ooyTZiXf7u9i5WY9x7bWb55EmbX72Qn8+fO4ACDttaFyuiQ8f2U0VG7meLD7TtCxMt73TToSKyWxHKJNNeA7iCqOMCBlzwSCvYbEuCIU1RTAdyBGeJecBYRQf57zwS8IpXfYgu4PBj/17kL9cZnArQKQF/aI0KEcxHwi7mgsL54IO4dih7uzjuNo6KgmAUhjBO4/+AJcZFdO5f6w8N/RRfzu855vGSZ2mLktrWKbKBMbtpglYdOeb94TlvjWT8bCvixnvcqqqSz1KvZw3Nv4ijanxKyXcw7zda8O9e5alfNn9bhZMSx93q6EFfp4icE80W6EO+81y0vT8JcTnAwYRkyxlIH1QwuwxoFt22D0IzBu0bQSDiCefuAIbyMUKjiq88PbE/txRZXdttZd4FwLqx2R1RZD1QPtY/F0/3AjaYPuNPVK9sZkPXTaVXKNuvzlSh2Huldo3ONLt6nPn6lu1B/PW1ApXbcMYkF8kFEJkR0mAanHA5ecXGFL4hnlgpAGCZ4kD44cjkTbYPDkB/xt+OL+UO+vN92z43ZoDsw006m1cpvl7swejjcb5/qx+duJ/9YttnKrnT7jhjxIl9EZIHLBZhtcBA62stDRAQp6BItmYgA9vRyVIpg5EEmSsER4soCc1CPwXrg7/HF9VR+gy8kuqxZkT//8+PNl9qEt9DHm1WMu3D5nf/5X3Mnrag=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDLiIYP1X1SgHaZQ7IhZd8l2JfR5G5uPnS5Mx-ERFqiGe%2FDJUhPiW1l-6n7K55XKDQZgeg_8M0-J0v7V2pvHtt5Nt6%2FC-FzKf9SHcsxEuUMuhz3Nb2iPkuuVyakhFgZHyoNMCpl%2FCs7s-W93EGPjPmdKJ75BhIjDi125MNE149dKC-JI5C6M&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDKp-BVICj_0S13oN4NPnpJoTDpJ-ZLlN6stZMy-JDoVO%2FCfu34wWpdLmk--QBnjtFQlzfgsdOSUxT0WSe4av0GLfX&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDv_KRgqbByPrkpkIwe3ywS6M1phYPvC1ziSO4bV2jkhv%2FCjV4aROlTTB_j_b0fIk6cnNjhqBD9Ux2ngcC7e5q1IegLQGzWZWnvHav_2g48jt8v03XId3_7PvmEFjUGZEdURk%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FDLiIYP1X1SgHaZQ7IhZd8l2JfR5G5uPnS5Mx-ERFqiGe%2FDJXeNyj9s8cipSdCaX1IHfJeGhuFbEQpplT_tGq2igdO&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDtvBFEF8A9AZqWP4bSwjc7Nmhlxi_qMBdo5nSPUw6kyW%2FCg6tn4S8aJ7fMocuhtPcdK-eOSYcDjaV22eQ8BRfCp3tuTq_9UwuRKSCczB6t3i_xijmBmpvEDVzQoWsP8DQeTs%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDomi_UlOE2fCK4uh1SBLo8hpUmjEzJjgkiKYV2TcnvUr%2FCsVGRa8itZzMzH19HCCF_4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDqafKe03Mqt5ThsHYr1g0p8M3GQhkjK3XWuwXx3v7OK8%2FCg3Blmw1-qCzAUZBMdEDJFcW_URPAYKvBpZklymCvGct3e1u7PeW9JDIV84zlXImeL5jtezl2iRHjFrSdRG1_fY%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDibgjzSbVspePxQXeFYdF67thdrD1LCcbzOYUx6lACAq%2FCib5gzBAHSo4SvzFuBEKB3bCZwFyucU9z9xi5hqmOeuMHnYd7AwE2HFB1_7yupsbItNewv1HkHIpmF4i_KIcRkY%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDo6lUXRA5qY6asVSAhlxSWv1pTQpDI_v-dVt43_RPt1v%2FCnxPRAiIZ7RioifNoNNywsWZ1VRLxKBlpyI4kBkPFQSuBmsNmFN2aHCEn41P4xRz0l5sDju4zwli82N9lVMRamE%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FEncrypted%2FCode%2FAssembly%2FB3msNJ0cAgR1gmI3g6Dv3TiXPDJ4TpDAvvZRisuBiFR0%2FDGRi0BoEQJ2SaGqLMUSLa4PyJAVq1pTabNeVq7PDbJ96%2FCRfcns_7ODUkUE7SjxY4n-cmtV0kcRo4g-ys1WdHZmrE%2FDlMCHurTzOkWTWajS-QQCrnse_MvLrYNwxTSCXHbAIsF%2FClGSzgn4-Km_crKI7O0-BjO4IMSHumxtQgkVAeD1XNCd8f8iSn9okMxUhc30uyi2rmlSPQlTl9BJT8lYpeya6wU%3D&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=0&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"4067\"\n            },\n            \"content\": \"eJzFlmtvGskShv8L0vJl7dD3CxI6wibGcYiDARPbR0eoL9UwtpnBzIBNovz3rfHeoqPd2FayGzQSM9DT3fXWW0/1p0ZWwbJstP/7qeHyKttm6005KytXbfDHRrgFlzf2GmX2ERptyjhle41QLJeQV7Ms4pBPjdU627oKZmsoi8064LiGkFJpSTVrS001EG4IjYITLYSkQVprqHOM22DxXpOUiLZWKi4JIwRkTIYD5dGDw7VXG3+bhX9o+s97jdwt60m7s+lQ9EY563+8OFpk4t0V7V683U1G18zrc1P0M39+ML3sZ2Ze4K7gIUsYPb4f1oDhR5yCEar3CV50Qk1b0DbVPxPSJgTH/759VO17C7QsYpayJ3ewzJYwq3arOli3WqGmrsqKvFWECqr9ssIwljgsZbf1iEVVrcp2qxWL+/y2cBHWr2JW3rzauTzCw6v1plU/tkAz6qONjEhLPA9EmeTByCi148kxwWwQ3CWgwWhDrFAaQ9OOkMi0MrSllAGQ1Lfy8vjNDVy8zd2ov5rscnKeje7O3DkP79lD//Q6P705XuTd/W5v+rZKWVf04126OsoGp2l7UjnVd/lsNZy8vUqqknC56Vf3V9P7n3gPr/9sstj5Q/NmHWKd9c5Lct7EeFdFmdWadVxVubCoq6C5cOWi07zNllnVIc1Q5FVdG7XOnS9U/okdfalzE1WF9ez/tlVXWeexyJoL/McSzHo02oLxwZJAfPBoAE+IAa0kby4hZu7XpaKrXLO6ybedLWtC5eYdy4TloBRnGoI2STnFdDLCWsxIJFBXlqsWmOo6ke3W6zysdys0cuuwiNDqliUs/e2udcCX5ekJCd35iM6Xb/hc9bZ8kl0Meydisup1t9urUVZuDrKjEWm9sIj+DKDeBoZQo2bhmFR1jQhvtNSGUSoS50qRgE4BR6NywRpBKJCQCEspcp5Y4sxpYbzQsS6jUAf428yPlsbVosSHZ+iyhm1WYtKQeMIay4XQ6F38qM97z8CkIC9jpPIQcYUUIgXADSnHNX4nKQL11gRjJO5QJpFsoMJ5RT1hQQiMmqio5ROM/Obpv2Dk7Zzlh+F2k3qwLKZpdV/Rj4f3cacX+w99M7gqL4tVT+yzQzb4joz8DgL9SEZGEyW6yGvGeLQ0UiG5pzRGQSXzgXAmPE3WJa1DMFQgI7kTJLooldBePsHI80UxP15nXbjubgfZ694pL7eTzeQSzMM4n+0u3/A3g3e77fGiP/DucFjM8vXk5kQU1JZ6kqXDpxj5gpz/W4wU5BGQAF4H6b2OjiWQnCAVYlDRC2yh0T8BSHSVJMIIFVJMkEiUjDgFXAUwJhHzjwCy1x9l5KB4fXbCxq5/N3h3Ph44MdyddKd3dDVx/hSmd3rY8ydWtV5Ybl+lafRBBUaClBZLBvs1EAGgI5XGYMMhnmieEnAeNNYNV9JQaYXn3AqHdWT+hqbPEPGvaGoVM0Y8i6ZSvZCmwFN0XiQFDovLYds0UjqHhw5DjVSAJWgZooRzF7HDJgMGiBOBW2JDjE/R9Fun/5OmveG+ch+6swfH7o9ODuPZzH3YfBhPrsZDNX3H1GR+Nx6uz/IejK6/J02/XaAfSVNm0F8gvRboMOo8cYCg1IhKtF9wnAWmEf4sglBKAWHUQVRIWDwuJy71EzS90OxsPD6ozt8fbJbHcizzxdHNUh3f7GYDJ5eryWI6uB6cDrtyiYeI6nI3zqblVL7vXk/Yhbiez79O05fk/N+iqVSPNPWUoSsidlXDja9FtCrKYIBFisqlr9MUojEKjeIkSzowxwPlifuAR7cYCRU/nqYvLLev0pTFZLGTRxXx8GnwVO6IJaAQoFqj2Zjn1iFpkZ48agJBeDQd1wybvBdGkr+h6TNE/MuzqSFCs8//22s8mqLR5nuNIqUS8JZ8/gWJLuHK\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=3&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"4233\"\n            },\n            \"content\": \"eJzNl/tv4kgSx/8XpOWXC0O/H5HQCgJJIAkhhJBMVivUj+pgXgbbkITR/O/Xnt27He3d5qGZ2TvJP9hWu7rqW1WfLn+qJAUs88rhL58qZlUkuyTb5pO8MMU2vqy4BZhV5aCSJ3uoHGLEDiouXS5hVUwSHxd8qqyzZGcKmGSQp9vMxVUVxrmQHEtyqCwnRoIAi3QA4QhyyjLilTRceR1ICECQVIIo41FgnnlkndccCSt1EHHn9dYuEveDzH8+qKzMsjTaut/JJ/Mwb5qOFYOPQkFHDcz0ZuHPA38+8xfDx6sn4Rdq2mlGr+ApCTH6+L3LIIbvowmCsKyheOERVocMH2L9D4QOEYrr/+V+VO17C7RMfRKSVz1YJkuYFM/rMlizXkdNTZGkq3rqCihqeRHDWMZlIVmUK6ZFsc4P63WfPq4WqfGQffBJPv/wbFYenj5k23r5WJecuOAw8gG4NARRL8BZqbz3isdovBTMCmkkYl547JhEQTNHlWfBBerrIgoNHEN9lZ9253B3tjLDk/XoeYVukuFmNDhOR7WnrMtG++YNNo/3Z+NaoY/udrNkP7/a0+XD/bbJTzP78fZkrbvN/Xid3mWXm/asSefZqvkTbcfr523iG//WvFqGWGa98Z6cV2O86zRPSs0apiiMm5ZdUJ2afNqoLpJlUjRQ1aWrouyNUufGVyr/RI6/1rkaVYVs8ie3yh5rxBarTuN76Qi2DhmHguPMcyOpA6+ixpgwzG11CT4xv23kTWGqxXy1a+xIFQrz0OBWOAtMekEJgBaWa20D8cQIxylmZV+ZYhoTXabxsN5Zuex5Hcu4fpR6qDfzHJZ28Vxv0WXe7yHXfBjih2WXPoj2jo6Su0G7x0brdnO3ux8m+baVHA9RvX0yTFAr7Vz1yLU52Zxf3FyfGzZ47jXHG7weGduH8UYO2ranRf2d/fZHtKXPMd6SSVNDuIjPFvFgjObOE8SFBmO5CNrHxuFGYc+Ui/pxSz0oySk4wpR3HntBpFACeLT1u+Uv1R938zw+vEHEDHZJHvMb0ci00pQxqXU0qsnng7fwlKD38RS56IDEFkUIBMUEYZoQIqSP4WqkNYotpygz0WWhsQsiOBJFwkozboklr/D0m83/wdOj9XA7bfUztoKan7AtyTVTtft03MxE/24d1I1x2fDxZLw9v3wrTwl6laffQaCXePqVBz+EpxAU4hiBQgaMD8758oYYLh1SmCmOqPM0hIgGBREG1HrEnSOBEIoCqFd4avw2uXjMurf64rS/7J1e7Mn1rdlYtrhOjjeqO2jdjGck3NTg+KhG9mI1eyBnN7N8s8PnvHM7eXyZp+/J+d/GU4K+8BQUQ6I8qxi2HGlsWQQqVZT7eMxygJd5SjRxwhoZGYNCYJgaahkQrmRg1GD6v+fpO/vtRZ56pUOkJnHeYCuRQuUJHpjRJHZNrERB4zmvCEEQNBCqjQsRryoYp4mOjPwLnr5BxP/kqUKKIKbZm3jK3zufQhBaBJDCE1AiTmDal85YyoAx66iBECwJUkfkK0mCRYR7D5yBxQI5+QpPv9n8VzwlMGVqN0rx5Gm27bVqH+cdlVp157vj9kgvbFq0c/E0wa1Ltp3okdD3T9lwAKd8NOzvW/3+VaPxZs7iVzn7HYR7kbP4x3KWYmwMBsOIQ4CUihMVI9JiFBRhJp4LXLGguaRBSxeYdoQA83GABRMIkNfmVph2dnfFsDXr1RZJe3s/xg9+c7VgfI99v3Uyzo7ORl21Sc3H7hE6mzWvSGc/rfX2J0EdXxQ3F69x9ptr4Tf7fxeD+e8zLYqHlObcAaJgVZyrgGks4ohGMIr84C8zWBBflhQPQjIRd4h/SsGyWIPeE+oD+T9g8L4vzuftPb9Fg644SmdHhXb3aHM9HTfn2W1xSYct1OqftLeXV/Xv1NAvgpyD4nGcYByoUeWfVyzZOPaQOEdICDh2gFQarJXOWkq8o9jJ8ueC8tiQCORfgPwNmfgvIMeKcYH1518PKl9Kq3JIDyppCDmUt5//CfhcGfU=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=6&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"4401\"\n            },\n            \"content\": \"eJzVl2lvIkkShv8L0vBl3U3eBxJagTG2aXwAxm57tUJ5QhmqCqjCGLf6v09Uz+5OazXjQ+0eaSQkyCIVlfnGG09GfqklZUiLWvNfX2omK5OHZLMtpkVpyi08rLllMFntoFYkT6HW1AQd1FyepiErp4mHCV9qq03yYMow3YQi324czKoxzoXkWJKmlhx5jhSlHgdjA8cRaaW0EpwEF4PG0llnrYlUG2xt8Mo5ybn1WltJLLx5tbXLxP2k8F8PaplJq6BdqdbnJI++m9np6ebsvh/EyfFjdzexRwE/Tm66p3f729EwjFZmXpxN8QchwpQ9TdjTNGRj7HatFqw2PCYRVIG4bhNAFg+hCcLyA4IPvsKqyXCT4H8g1EQI5v93W6DmewuX5j6JyYsrSJM0TMv9qhLBrFagtSmTPGvkrgzlh6KEbaQwLSbLasa8LFdFs9Hw+S5b5saHzUefFIuPe5P58Phxs21Uw4ZGlEnrDWE+IKow1soQEjzyigVLmcXURqSMUdhb7T2xRlJYOZGUkkhMQwgVAie4kRUnp4vw+VNmRserq32GJsloPWRuGs5X53ftu8fBcX+Nwn5yMb99unVdf3X2aIYnqzsah4cz1PuUXo/3+Hi/C7fb/iXLi3Q26wx/oV34/HOb+Nb/NK9XW6zc0PpxL/wWvw5arPIiqfRsmbI0bl5VTn1uinmrvkzSpGyhusuzsqqnKget7zLwC+l9n4M6KB420/9bclWXLSjL+hyeI4+cVth4RK33ynpmNAvOOCWdis7W0+AT89uLvClNvVxkD60HUg+lmbUUElJaRL0H71muI7WUSi+8kIQFUXllZco5mKBKcbNxlLnNfgUWbxzmPjTaRRFSu9w3OjQtzvvItWcjPEtP6Ux0H+hV8vmy22dXq2774eFulBTbTtIboUb3eJSgTn407JOxOV4PzibjgWGX+377eo1XV8aeh+u1vOzavhaNw6dzMVh0n/gNujwVh/n9YandHVqP59ftxeamvKCjDuqcH3e3F8PGOxX075JVGwfRKhjODeECxgExjZmyBkTGlmOGVHAaERG5CEpqQ2xUUKJEI6yJxFRzUFQqo7gLDDGI9Z/I38oL3uY5DF6RiU14SAowSa2JmVaaMqawZoRw+vXgFSAnWLwN5IEpxzkBFyEFeyOMRBsF5ZoYLhgKxAYcLY/wpRGiMLTMUW5oVAACi18A+Q+H/w7ks4uYnFwld/P7tFiYfMeH+3l3+EnhdPihPU7yPkrt0/nJeNPnw546pGf3u/1MDno8YZs1w/fDN4CcvAjydxDuWZCTnwtyxqxjguoAa5M4IBeowEIJSzRHgUdkmMCIezBehCCwS6+5l4LB1gxx7gWQ213wg8nZNbqcDUaT9f7pRHdml/Toti9PFse3i+Xp4PTe5JNZ4hfnZ8uM8fRRL8IkO1r0xjfZTfsFkP+wF/5akENZfgM5HIFgBBQ0j0xCgXMRCRjJs8BCQNw8D3LrgTEYOGEgE1RKbbVVzDAdAhyxxvzdQP4+Bf0syKEfCcFRZIkzMnJjPA8UKXB7NMIKgZwT3ljPKbeBMe9AU/iXaQvztMZ/AvJXZOIPQE4YwpzjV4EcU8XeRnLHqxYRQY+oEY/c0siQ83B0aWggoT0zGkWnLPSZPmoRGaaGBey18tIhx9ELJP/h8L+TvB3kxUVPd5cG9Xezp5v+vhR+sWO2c3bfk+uT+974dH9JSuyz01cTm71I7HcQ6Flis59LbIOQ1QFWqTUyysMdwVodvfdUKLhIkGioRhYL8DN0KQ5p5IkR2jhddeiMvEDsCTJdd7gJx587Me+sTtLr9lW2RKvx4rPObuaXt3a36hs3bWcX9Gow36a30Y1Hruz09u2o+70XiP2WnP9VVK5q7BuWo5aIy8gidwLBPcZhCRevCF1ahOr26HksGzjwsYwI2jgDVCfKVywPggjrY/T2b4blN1bns/iNWqEgrZDIihiRFFZLAahESDO4CRtvnCPgUYu8Jb7CcPSaKiGpgoda/Ql+X6H4H+CXI4wV11//fVD75qFakx7U8hiLAD/F118BpgBUpA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/files?offset=9&limit=1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1439\"\n            },\n            \"content\": \"eJy1lGuP2jgUhv9LpOZL6cROfImR0CqQwgw7HSgwl3a1Qr6CB3IhMUyZ0fz3ddq9VPulqrQr+UNsnxyf9/F5/RJYp4s26P/2EvDS2ZNtju26ddwd/WIg95qXQS9o7bMO+jBJUS+QVVHo0q2t8hEvQd3YE3d63ei2OjbShwUIY0IxpHFfYsWYADQWDGCDRWIQkAoiwKSkKkWcASNTQXCsDCMGwYQjDRVLFZVAYuCPro9ib+X/lP61F5S86JJmms5mY5bvOZg+bZ7vp2dH1O4JieGHxzE9XD6Ol1fneeygKq98VfqLNV69/1822stXPkUMIH0H/IArmPYR7MfoLQB90Kn4q3xP7b8GVFTKGvvDCgpb6LU7151YXteeKXe2KqNKOu3etc7LKHyYsfsuYutc3fajSFVP5b7iSjcXyra7izMvlf5y0RyjbhpxhZmQLAUxTKGIqUlihIwGMQcMUgK1ZknMOSEQa5IizBTkPMaUAKwlNioiJNUaxzgq28urnX74teSLSb06l+DWLg63gOdy1OjJw9BUw/qyuMtW5R7Uy90DK++380/iqZ5yuc7KWbK63h6LT0YuF9INx+fMsOk4e5PkfvxytGrwN/Owk9jd+uBn7jz0euuqtR2zAXeOy23ngnDL2+0g3NvCugEIZVW6zhsd58F3lN/E4+85h56qbtb/Kqsz2aDzWLj1G4ZRgKlBBksCkBYSUqGVURQbmlAFwkIry7+dpLjjoduVp8EpDrXjmwHnmEBqAFGEIwrjVGntmZOYCGWMEp2xuNv6m+7usR+9L2Vzrn0fR6NK6ShrW12I/TkaJkV7MwUy2yzgprhKNiQ/JSv7MM+naFXn2en0eWHb49COFyDKJwsLhtX7j9N4ySeH6w+3y2uO5udpdneA9YqLG313oPNcTBmJRs835HqXP+N7ML8io+px5Jj8DA7L7V22a+7dLFkMwfBmkh9nH6OfdOc/aDqBHk73hG194xE/N75dNRWEAkGMAZQIRgkTKQAMMYq54lLGhHEBlIiVUDgxiiUpoUnqF1nqc/2Z+atX/GkKd576MfFGn2zru8G/pIilLEEoxQDCFLPX33vB1x7yW72gMqbV/pO9/gGfMryI\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_get_last_uploaded.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"141\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Jt2UW8BEcGfF+jFU1m6W1NMm5DdiCK+u+tpvm/mMB8XCo/Ou6CaxQMMMVVaY57aNy7Er3ZhhecGaJIHFJZUy8ByyKhh/++a3bHZXm54Mu5Y1EQt+jtrH9Gg5piQmNzKzawhkZ1dz52p8pwjqk1+xCj8/QHnfDH+\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded%2Ffirst.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"126\"\n            },\n            \"content\": \"eJwtzEsOwiAQANC7sO/wtaScwwsQGKUFazudJhLj3XXh+iXvLQrhTQRRmLcjSHlu7Rkzkl8gz0eFHteML1iRg3P2zwNHuiNLo4xTXqurnpSxFsw4wskZpkK9tD2VTmpvlOKjLjPuKg319zpjvTYXLT5ffm0pAg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader7j.disk.yandex.net/upload-target/20240710T190233.266.utd.9hryhlqchyr0qlrcamkjieq0c-k7j.42371251\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJxLrUjMLchJVUjOzytJzSsBAC/sBgg=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded%2Fsecond.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzEsOwiAQANC7sO/wKWQo5/ACGKBosRCY+onx7sbE9Uvem+UeE3MsE7XhOD9aqT7EruwK4TI2ePk9xCfskZzW898n8n2NxJVQWqAUJ7kINWuQRsFBAbzN5W6uZiSUxdTlnPsttUe10/aLtUXEWSD7fAGhiihv\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader28g.disk.yandex.net/upload-target/20240710T190234.152.utd.a8hlv5j5sf71l5o9bhrmfpwo8-k28g.48777307\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrycgsVgCikoxUheLU5Py8FIW0zJxUAGVuCHI=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded%2Fthird.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzFsOwiAQQNG98N8BBpoC63ADKNMWq9jwUmPcu5qY+3mS+2Jrppk5tta6F8d52y83HygrXCDEssHTp0APSFSd1urvQ/V5ocpRoBaTFAdpBaoRUFhoNYAZT+U+ydn3SNhS79eo9Plo+rD9xtqi+Ybs/QGhYShq\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader32g.disk.yandex.net/upload-target/20240710T190235.209.utd.85csw71favie2unvvmi34jb8v-k32g.49282822\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrycgsVgCikoxUIM4sSlFIy8xJBQBc9ggR\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/last-uploaded?limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"3483\"\n            },\n            \"content\": \"eJy1ln1vE0cQh7+LJfxPQ7w7+27JqgJpwAUVQnhJUlXW7O5sfCR+ie+cOKB89865lNAKcCKCZNm+3dPszvxmnpmPnaqhSd3p//mxg9OmuqgWy3pUN9gsebGTzginna1OXX2gTh9gq5NmkwlNm1GVef9jZ76oLrCh0YLq2XKR+KWONsY6Ix30KUWhwduCslA03mN2NpWsoEApToLRIHNSEHLx0aGwNrmgkkAdbQ6FD54v41mVfpL5663OFCet0WZcLfJ2s2r4SFpVhV3jzbQg9i3zPgjQD4V7KMVrafsC+sr8IkRfCH7/37txSO7b+8ksV6XaeINJNaFRczVfe0Krpjc/w6qVrVRn7dq4aeZ1v9fLs8vp2QwzLbZzVZ9uX+E002p7sey1j72okpYyFBsNePDFaKGs1kJm0slniTllSsaHlALycnTKOwSJCJ4iYc9aT+TJ96b10+EpHT6b4qsn89dXU/GmenVOTTqHOT55937vZFdbMX9lj0cH1Zv08jgq97hc+azrR9PV+agcPnu7vJxd7sH5HxDfP9q5fPRip758oHb58+uyyoPPUe62LrYiDj5L2GVn5rO6aqrZdIBNg2ncZmx3jPV40D2rJlUzEN00mzZtHrdhG7RBewB767B1OUi0GP3vlLYABgDdMS/7UMASR8aqlDWQzlqqoI2WlBzm2J1QrvAfy3mWluvTm9PpxeACutTgySBRFNkWgzZxhKUPITqjSAElSNalNvGxGbN0rTD93hHu8u9rqptew1+jE2pGZ8h/lvO1nrn3ZQLfHN8a+HSBtojHCMa2a85rwXkJxnCKKpcU8YoVJQRW1ZvgkyrknS8CfVDFOAo56aBdFOiCYVufrK8TjE/MpoXFZq8WdFHVrEunz1EVFpwyxjnjnbveug2A1N0AZJJjbcgjBaNQguZSCzELIUIRjrKPwhVlZeJn0KloJzzflPeKVyDFBgD9sPkbANXECXk3AumNBLoH979LIH3fBFLZeBs4MUGRRmeMJA1MIHI5eGcjFvRApsTsCzAwDWhMRRSbwWpf9AYCHY9Gu7PTvd8P01uF4smRNvuHL1EfDOXuwQ58yHYUns8h779Yjd59uMrDy9XRxVEzP6iSaNwxzDcQ6EbDn4ggtUZQRAhIObZqekc2SqcDosw2oUuBNiOIdSfUXJ06RiW00Emh9pp7kwyagO6OoP+k8EYGOT4jGGetjNokMNx6sgCfuKmoUrBAdNxtuFOiBqFcLDIyYq3OmdNWGvoGg27h1tcYZKQ2Xt6KQdLcjUE2O2Fckaggq0iCuWiN1sRDAXcQpz16rjuTiDEctVagudGiNDFkYJyqDQz6YfM3DCrVom7uhCC1EUH34P13EaTuG0FFJm+cBytJGq+ygxiARJJRxIh8QxTc3dBHntgAsk85GAYoYchtGosNCEr4TD0/v/TD5Tt1nI9pOTw8KU9heHQwfrl/sPvb4vBxpVMIu5PhavK7q0bvzyfDiTkyO3E/Pz6F/e8j6LOEP49A0qwJZHkYcIKrhls7GM+uG0hogsyRKzXjZgJR4RnE8bzAFaq8TcSzRiajmGpB8jh5dwJ9mcAbAYSQidgJtGB9AJMx8CQiMDoN3GjaNggEJRqdCFTWIZRoLfLEBABBqG8A6BZefQVAXAsi+HD911ZnrU2nr67/BnifKJA=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/b3c4119f6b52828f540364401de4c8d1adcdec589cc9a401b7387a21aa28ebea/668ee8e8/nsHIkeXKnaRGpTyn0UiRqetcq2paGWjFgD460pR6Z_SiUcPZb37Cfy8d4sBnxq_fXKVuwowF2qN2bjBAwBOAsw==?uid=455675172&filename=third.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=22&hid=89f26e64463cd42e4d41394541ec7adb&media_type=document&tknv=v2&etag=ceb0d6f5a6c3641899b753e32ec2c67c\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"22\"\n            },\n            \"content\": \"eJwrycgsVgCikoxUIM4sSlFIy8xJBQBc9ggR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/3d5869fa223e4a7551e42440e7d9876bafa82e5fbd8f2a06524acf0f6d2648f4/668ee8e8/nsHIkeXKnaRGpTyn0UiRqZ__DokFJXcV3a0GY45QXPa4SI1DSA2zd6_9Lp2dQOx_WzydIwxYvYtpSic0t7Z2pw==?uid=455675172&filename=second.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=23&hid=ba29aedb9bd087e6b1749aa1d6ca7c9e&media_type=document&tknv=v2&etag=f36ea43e34bb30404c3a4842f2194e2e\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"23\"\n            },\n            \"content\": \"eJwrycgsVgCikoxUheLU5Py8FIW0zJxUAGVuCHI=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/f1c8578261e1583d72b92e0c1b0bba443a0c36a8bb7a22d8cd951c0ea9d5c250/668ee8e8/nsHIkeXKnaRGpTyn0UiRqcaK3Lqw8IuW3ZdZeuIXgfH2IYShPQSDErXCi4c99DmIxmJ7i_jqmIm5Y5AbQdCk2Q==?uid=455675172&filename=first.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=15&hid=647b704582c6258c2552ca591db1b9da&media_type=document&tknv=v2&etag=ef06f76f53a4386cea89de53db991bea\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJxLrUjMLchJVUjOzytJzSsBAC/sBgg=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_last_uploaded&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOwiAURdG9MNZSSim0c+MG3MCH/0gbayEFjca4dzu8Z3K/Yt4RxSTmWnOZpAxrevKZ8tJ8aGO8mw1VvpTkpdxlytipLmkrMtqgXUBrO1hjWzgP+B4DDxR9N/pgR9OPvjWdVzrCaR25V4bs4BTASpzEA3VOfLyvl9uRFY+8UsUhkdaC3x/D3jIQ\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f7c38ce072e7570e8beeb4e6d6afb29bc79549b052b13fe833fd415a7681eed1?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f7c38ce072e7570e8beeb4e6d6afb29bc79549b052b13fe833fd415a7681eed1?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_get_meta.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_meta\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"132\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J12UHcFEcHHD3TjqgzNrSmmTchMRRH/3XF17jmb+3GhYHCNC6pZGqI+psWvOY/1m2ePVz1D6bkhP8qDCiQtpYccMmvY/1u1O1bby41PtluImqihu0O7Ccpu5Qwhefu4nltTxZQjK6wMHAXfHxgALkQ=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_meta\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"597\"\n            },\n            \"content\": \"eJy1kc9OwzAMxt/FVzrNzfKnyZlH2AUhVKWpAxHLUjXZBJr27nhIXLjAAS62FX3+7F98gZHyRPNMM7gL1LI2cAAdpEa5gnt86uCQcuJXgR2UGCtxzeXi2wtL51Rf3fbB33PeU23bxmF8pjZmap6NWmn+wB3XDo4+E7d8V9BbijycBSvVcloDjYm3AamUNqo3wlllxIRWzGpQAXVUMZCJ0s5eahGl8cNOE+7EMFhjvIkD6T5OAW3U6NH2PCSs5NsNEgQKuUGz6XHfayeNk/YO0SGyKpc5xfSj7LfsoeRMx8Y49fa7y5rOvMT4hfnXjMtpOqTwT/Z8nva+0Cf2CrdbnVNN5QiO7VHvELXtrRwGef0AcGeugQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_meta\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"597\"\n            },\n            \"content\": \"eJy1kc9OwzAMxt/FVzrNzfKnyZlH2AUhVKWpAxHLUjXZBJr27nhIXLjAAS62FX3+7F98gZHyRPNMM7gL1LI2cAAdpEa5gnt86uCQcuJXgR2UGCtxzeXi2wtL51Rf3fbB33PeU23bxmF8pjZmap6NWmn+wB3XDo4+E7d8V9BbijycBSvVcloDjYm3AamUNqo3wlllxIRWzGpQAXVUMZCJ0s5eahGl8cNOE+7EMFhjvIkD6T5OAW3U6NH2PCSs5NsNEgQKuUGz6XHfayeNk/YO0SGyKpc5xfSj7LfsoeRMx8Y49fa7y5rOvMT4hfnXjMtpOqTwT/Z8nva+0Cf2CrdbnVNN5QiO7VHvELXtrRwGef0AcGeugQ==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_meta&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_get_public_resources.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=0&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"2605\"\n            },\n            \"content\": \"eJy1lcluG0cQht9lAPNiSdP7TBMgAosSKYlWaEnUYgYB0avYImfRLFxs6JBccslD5BFyyTmvIL9RehRbsg1HtuME4ADTmGJ11f9/Xf06cJVJyqD9w+sgr+XcqcnMrIN2MD6ZHr2qt/lydbDaDpfj2WDM3ej55eBqWe9cFeXAPpvF2zYa466LD3XvfKl6eDxYx0eHwB5LeR0eMJknx+vhQZaO8Fl2ke6Iy04n2AhSkRi/w6AuSuOXZuVs0H59sxEUpszqQpmJ0/47oZRFFEaoraUlRAmkiKHaAmMRkUZEFkAhNUFC6RhqACWHgBMmOIi0oloSYgFnsYV+k7e91cXcZ55WVV62w3AttNsqZ6EOh1ejXQM411cnOX3m45NMO+tMUwcCkG8CuonhCEZtCtsIPAWgDYAPU4UR1WejclFNfYh25awdnkxFYcJ3zassSUxa+Y69B96Cwi18wsk7Jf4nGf6f9N7Bap2bu06LoLFz4UqXpUEbUspJFDHKWRMb32x8RFt6sa3S/tyul/1dvN5b9eXz6fpcXY77CF0UyXJ40Td7s3M43uu68frFcPdymuS7Mx0hhy+6h/AR2j7j/B4eTrqgu5idpvzF5QOdt7/d/v7mp9s/b/9484t/+7l53vz6RbhKxmNorKQ8AiTihhgLYoFiiyOGfBhE1AAFKYPMi4i8yNgKFhEhIxQJIRss6rLKkkleZLkpKmc8HGk9n38KOMQb4HDcBvE9cB/Qi/AmhJuAjxBoU9pG/NNc/mPDX4Pof9D6Y4h+c/pHEGWcU4Yx4jGDAN0hKtLKLVxRl5OyElXt2w/U3Ij0ocq/6dXzp4qeHYRpvjsfXcVdO6hG3dPzHeLi7+txb76SSZge1Gont9fnucmv+vbsaTesh2x/N33F9L+nd3t+ZvfSFTjrXUJ99EBvLysSuLWQH/D62LDC91CU7pXPgCKIHhnISGiCWSyJlFxAyJilDEUaYUG5HwdeP80Yg8pAxCGVBlgGtY2k1UKZ2H5uwD5U81Xz8durenQ+fmt6b0HiEjN5S2BlVlWYz4VreLJubt5zWGfLdJ4JbYqt5nRurUWqzWqrqMNmGTKDGEcQxSzy1TBANSSxr0ZK6t9jrhG3QkArgOFSRdoigYRRAGrClCI4ZP58UKVomJZ7+zNzMUjFcT8frVNw6o6vX8bP3f4qX9RUFNf7k1hND0+H6+OxkMyOiqt6NHz20o3rdIG3T+pJPz07L8e9vZODTBB91Fu+OHqCd/zvu9rpzr1+rabFBs/OOzhbvpc8K13lD2BHVJVQ08br1lSU005r7hJXdUBLZWnVENCo1mk0e4J6d6q1vEammHy0SYNvp6G3NfUfpGVIChMTJmmMAJZGwThCjFg/JQzWrcRoJx5yt6pZuugsUMtU/gBi6M2NjP8/93ZjLx3DVACfBEPvO3vkag/fO4EPe7x1vTllU4Eo82sILZJYEW+pMkziSPgJR6S1llpioNEExpgAYf20YyRWHjaPG/bXMCYRiaPgfqLdIeR309QvvqD092dfRCAGHlqKmL+mb37cCO7kD9p4I8isLY1/BTd/AStKJLY=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=3&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"3970\"\n            },\n            \"content\": \"eJy1l2lPG0kQhv+LpeVLAPd9WLJWhMvG4TbnamX1UY0H47HxjA0myn/fGkIWwiZAjpUsazzTrqqut+qpno+1rIRhUWv89bHm8jKbZZNp0StKV07xZi1cgctri7Xx1F9loTeAOd6kG+Zq533/prW7caaGt8drdKbnre1NerL6rn/y/qwb2Htonx+a4e58c9JJF5vX7ODD2sZ8f+Wiv3FaXNe3lB8PD+a7W6O8y49Hp/mau2g2H/1MJ1fop1+W46JRr89dzJaLQT3W78z4eibczWWx3YMbXJ+7IeDK9k5aYoTaJUqXmF6+y8b4DG6zVGt8/LRYCxNwJURc+LioS0mDigbn7whpEILri+wObSkrDSd0sTaBYjSdBOhl1R+FlEpLqlkjOuO59i6RFMAnlxh1RsooOTE2uUgD8zEKp0WkxgsrNbWGAXVMgbBeoqfhKGYpezWgMBoOIS8xAJTiY208yWa4jd6XwH53VA+5/3/MowrDbAi9cj6uLLvxGH25Mhvl9c9qpewKnmgeRzf51chFmCzHrBgsz10e4XZ5Mq1XP+vRaY/eQLiQArMycUYJEcAUJdF6EmRIMgRuqcOYtXbGUKWYITIA+EjqSlm8DrKeF632AE47uTvYHHfnOTnKDq5TV02Go+2ro9OtzkTcFodbenvkzYpdbQ93Vvda887+xXU+WT8rj6fcrA5383Uti9Osp093/d5J9+YPvoafP6dZbP6bxIVqi1XBNv9brgu4q/GoyKqENF1ZutCvpF/ou6LfXLjKhlnZJAthlJdVQVRJbD5J4R9so7KBKYNJ75nPqqqbD0W90MdnVDqpWHDG6ZSU0IpI7aKUDMVjDujCEGLmPvvAChxjPRQQF8pBPmvO2AKU2KqYbOejYlRzGrUJJHotlOLBcU695lU1ubKPelZqNeqHfTeB+je79NFbhZt//VX92HdMKrzrlUlBB5WSEZp5iCIqTqSDlGwiEZL2hEQuI7dE4JemJCnHhfEqBhIS2nqwf19k6DPKqvVe38QEZlmBCa41qNQSY5dCCau5Vp8W385LO77bMfm0e7a3+mE7XHSLjf5sxYk4DneXreF0Z9KyZ+365UUnN/Hd9npnzqYbl3uDw6wzYO3WSfh5Xp5v0ikcqenKnA7txbd4yZaIepWXuEh2qW0w2yD6GS+11UYT8n1eGsp88l6T6BzBlvVOeplAABcWy476QJOMUUUWdTSJKGxiwQWnXDCZ7mX4Dy+/HdCP8PI3RPUSL3/Z/O/mpRVAmaNgvNRAguY+agVgtFYUQ4sqSJUsQsEAwjJGC8EBwlURSiCJV3h5YG740cmlPij8+T4NrZP1nbXzD+czD63srtstzfXY8pGbZNzovalsnbLu9Ym7ubvYWopjONi9eCsvv5Tr/8zLh6K+56VEDSklVsUkBdOKK6pEtFKCIDrZN/EScUVJAGkN8kskD8oKjXOLWW9kUvI1Xj7p0jfwMimvjSVeERQ0cGaoo8FSC5AkMCtssIYoH0QC4gDHNorsk3CCA0gS3Hd4+YZNfM1LRRDIlEpLlf0RXvK7zl5pVk4mO2qwSrX70B4NuIbxnKnjd7fl7mb98LKYH09Zwr/rm1l/UG6P2kdrN+0duV8cn/88L2flaei8V92iO7mOT3i57QbwkItvU5KJJUKXKKmgRGSD0WeUFNXMeOFMiY+ZJEr7AFaCcozhbPaEYxdiT0OKBgwTgqKOgaA3LEhOsaM5GgAKzxn5/XB+6Ez561G9eKb8VfPPGFnCbVm/XRo+avVjjGRKW0sTJQwiIzJ5qzi2kfU0Wc6VoDZ4i8cP4TlIQRkFmQwP1FgQ0nH5CiNdW58P0sa5yrdtN41XD5Z6rZk7uuxene3fhlXfsyT4fNSZZdPNvfL89s6llY0z1mXl9Q5bD2H/ZUZ+KdGfIGOVOETiY+peION9Id9zMXIitE546PfOGWIj84GrhPqFqEhyT7k4zQc52vwaikQrgWMQlzIcPyoK4oQBSYWiAmcgPIfikyb8CoIPxp8SEAKXAFzjewmNUcaAH+JDYAKHG047xiXDygqgI85b6n2UTujEBcrnPDXfIeAbIn5CQE2NkMYyKvGlxIhPfy/W7tNfa/DF2iilAqrLT/8AaP68XQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=6&limit=3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"8403\"\n            },\n            \"content\": \"eJztmMlSG98Vxt9FVWZjg+48qIpKYYTEIARiNqkUdUfUILUadUtIcnmRbLLJG2STR8gm67yC/UY5bfibwYBHsqLUqpK6W+fe/s53fvfqvK8kRejnldqf31dMWiTjZDjKT/LCFCM4WXG9YNLKm0o2sr3EnZyHKZzsm7X9Bs2LWe9AZqtxvTVaOaImXGCH7TTrdUUoujv1Bt1OT08PSKc9E7uXrXaaNFpkP2zI7YvqurBZf2e6tT5I9+jB4Citm9PFxZtxRsMejNMtiiyvVatT45OF/Lzqq+woO4xveweFLgrUgftT0w9wp8l9DRO6MLZwLkySWKm9//Cm4obBFMHDDQQROo/wPNZ7mNSwqGH+GqEaQnB/nswgBpGYvKkMQz4YDV04ScpfMc6F5FiSmrGK+WBdsB4xho3BWGjrSAzRY6UU5o5LizzyAjOnrRXCE0GMsBQ7xiIM0x/4JCYPz4aTL7Nxg34/pAVMAPR/X8mGyRie4eSPif3uWV0L/jzhIQX9pB9OimlWRi7CpKhmPZOUjopJL9zKsR9cpr2B8WG44JP8fGFqUh8mC8NRtfxajUQRpJ0QxjoJo5pIhERcam5wdJ7DIbhEkWlBbITp2BB0IFEGiaSMsSqERtw5UU3z1bXzcLSRmp1mtjdN0X6yc/FOtZK1STYecTO8WDtRrru5vzXdOTZWxL3h2Whva+ldcjxKx/Tt7uikmR4c5seN1d31gWG+07jc7ryidTj+NEr84hf95spHLA26CPZ8RZeuDDoHz5MN8qRIBumiKQrjumW+57om7y7O9ZJ+UiyiOTdIi9IFpXKLpW6vSOOzcnOgUxie3BuotPBi6eC5LlwAAYg1QTFhOchGbXBYSSJYdJgH6uf6wSfmJvZccZ6OF8dkLhRQhhR7QmWA32vINxUgGuUGQRCKJeS3NI0pupC7MjO16m7XDEN1YzTMQ/VOHd6Mcp37sta6hnAB3zGOxFLHRCAugGGkUTgwG2PkkQUcPMOKMmSiDkww5ajhhmuKraZMMiUh1nXkz0aC0TyHL98x+WEYJzmIX4HCkwxTjBBhVEFJfnjz/QxcXZ3krw+qg8FWY/WisT0xw8322ehwp5n2xfJ2WxfLk4393deoPT7eEtbqZqqPtkw2q+63jzd9/+DnGXjWPRqvt3e6WyeDMDu9YeB5mYGFWZI9ikCs5zGZR2oP0xqWNazvIRBTDi/8OAWFxd5KjaH6pGCYWBTKH0C2hFNGGc6h/JkMjiMZSJBWQB61Q55SxK2w9yn4+IR+hIK/YVZPUfCXw9+joMkyGMuU9V+9ytaPoZB76632mnsXKZLROGGNJ4aCjR0hUQEeFVyVUOmSAhQlhNJBhGgVkPFbKNxtbLK8Wc+TZEXWT3sbRND1ZgxTm+q0G1dXLjpndOKTfpOeZ71G6/LtttaXqK/aa2d5HVmx9DQKv7j0Jzh4SznAYRnjcRhee/kzD4MlRhEHojEAiAqwgDAOCwnGznuB4m0egvEysEEe/F0qci2todQbFUo7lIzSQdJAFIc1wIeHqXi7Ju/g8GaYO1DUhrAIS2vU1HoDq6wUXiGsBDOmfAioGKVkdAxzWJqdopoGAX6LOvJAHoPid8z9FhS5hEWDUYY1R4rKH4HiTmeyv9yb9VRm29Wxvpger63aolVPNu24czjIcaNfyHzndX2veqqnk252PCoOe6xJNsdDAvvQn4ViUn3XHJh3rdZ015Ne7/IGih//iRf8wE2eYiLi8xTtIVFjuobkPSbCmiORfhyJzElKuNIS8gaVaTm1jMSosIQsSmlhy+I9ppQwQjwkwlgoVc0x0U5K5PADSHxkPo8xZJz6hUEW0km/FwfDviny+UGMiQvw3KOypBYuB0OfDQcO/Jakp/3ewh9XfhC0v+FZnwLtL4f/cJW0qz8zd53yOFOz0vrhssoABIIjzwjsZWErgkIApFoaOKdGeq98jExZ2EjRspaw14JTpQkTXNgQUTVJAa04HV+c1jvJ+nDaW2r7tcZsYg+X7GTlbLl36GOro1bXp4xno/m9y2nacSed+dny8X7LLbmOGI3JjEVxttzszOutpXCADsdk9+IbRH1VR6/02yub34FqkvaSNDwF1KRvTgOg9CwLpw+y9BqBN/VUX2ks7bf2KiUVXhT+fQrPfV60jo6OdufccJAtohvJy5Mvej+T3g/J/aL2M6n9gNgvWj+P1l9L/aL08yi9+ZXSmy9KP4vSra+Ubr0o/Tyk/lrqoxetn2sP8oDYL2o/3w77Iblf9P6/7UOWKx/+8qMtTyWoQzyCwIzDH34qlHPIC8dlUMhohSNFWnnmg2ExRq9IsJAK7AWJESH0rZbn23fL+cFGUW9ezC5s0h5uNburTT3uzdbql7ydN2cn+7PDA1XfXItLcv7Ar9TPz4fH6+tne+JohZjLnxT7Z7qev9DteaJbetXlumqWcioYd8YiFyAqixIFgjnmhhMOLr7dLP0S+U6rNMoQtNIOKWKsEJQzb7XFwRAkvRHmfi/0VjfqurBeivC5ivBOj/rjvz7++9NfP/73438+/R0+/a18f/pH9VbP9EtnmhhPHMHURioxij4oZiLUHMMmEO8jHExERbGDF3JGQDJwJOAhrqQQ4pHO9HdY5VZnWiKiMZEIY04w0iVHPqtTqdE3FaiCPMBH8eF/4styvQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=9&limit=1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1364\"\n            },\n            \"content\": \"eJy1VNlu20YU/RcC1otlc1YuAojCihK7TlwntuzKKgpilktzLHExOZJFGf6SviT9In9Sh4rrBG0f+tACBDnLnXvOvecMHz1joWi90S+PniitWZtm1aatFXblFj21BFF6Q69eyaVR6QI6t2i6N/YjuRqTE5gvt9fLT9BONjfn+3J/uvz4U2dOyB07Vg+zRRR3gk3hw+n1rVmo3CK4nZ2t5b1/Gsi6uOjOT6tySq+rWTkRt0nyDWfVLB1Obm3djny/E9octgtf+9PbWlyVBlPgN/MjF1+KAlzk8+/PX9Ln354/48Otqd06bEzmjR6fhp5qQFjQLogggg8QPaBoivEI8xGm+wiNEHLxrdm6PC6CMI6GXgNttWoUpKY/yDgPQo5DMgo4goDHFFOEIVAkZJIEGUMRiSkVGaY0wpzxMKYoBp4xHKJMiSDCmgJwnjmkotImM/9MiLBXQqoqCiitI+BkePTqxqxdGemfxP5rVi99/3/SOxUKU0Bqu7rPLOraYQlrqtL/qlZmlvCd3rp6KJeV0NAcatMuDjtRatgcNiu/n/oozgRTnEKMKHG8BI4ySbHGCgFmIs5orDjGgGIUKUR0DI43i2IcC6JUIP0giBF3I79sT35cwOx9KS6O62lXoitzcT+3P4c32w/z6Vl1t0g/XV6u5ttokY4v33C6eZefz2bHx+VkfPT2XuH5+2B8Js/15sAedW9tgO4C+rBHJ+75YWV08trEQV9ib9Zkb4L2jsjujdP+E493E7Sz7sBVWFet6ZuTCGuFynsbDHLR5slgaQpjEzRQVWl7c/QNTb5r5x551+dw7YMm/Qt+7/DkxeCD3O1xShGTIbCYhQqTTGZcgwyFJkyKELFBAdqIrxjOjbXzRgt6YBflOlmTAVh3ZSUhTmSMIhmEkZYCg9AqECqTmnGGcO8sYXOnba/cyL/MRQP+327rN6T+l/OK1d/LXBAe9OeRkrEMsSOMolhmkoveAKGMgIVO4YxGEYEwEjrAlAWAFMZcoZiwTAoaSpfrJf/ObA5Tczf5FwU0sData643wgEOMepdz7HLHD39OvR2kritoVdlWQtuGD/9AWlcodg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=5&limit=2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"2598\"\n            },\n            \"content\": \"eJy1lWlv20YQhv+LgOhLbHPvJQUIhRNHtnwfsmKrKIQ9LUYSSZNLWbLh/96hktR22hxNU4CAxF3yndl3Zh4+tNLg5lWr8/tDS2UhXaRlXY2roEINiy0zcyprbbSKWs9SM566FSzS+4PTEG+/L4/F9C2W6rCfT6l0xYqI4etlONmNLj5Uq2FNPLwu7xaTaTjK+5c7d/1jflYNR7fRvtDF/Hx1sp9nAzrMr7IdddPtPsWpyxnEmYRQVJ0oWimbblXTyEaLcGUO3ohBNShv7Q08n6m5gyeP1NT5dOZgxS1T3+o8PG60TOlUcBa2CSJsE+FNjAY46SDeIfg1Qh2E4PkqvQcFJqkUG63SVXldGjdOm9cY50JyLEnHwjbhSEhtXMKdUIR4LzSizihlnfM2djFhDGOTGATRMEYUO0woCDjc5DXPberT76Zj8vncZQESAPsfWkWZLuAQ48+J/eqsPvn9/8hDDebp3I3DqmiUg1uGaLk5f6rV+uepzja/y2Y5SJdbNq2mWyuVWbfcKuuouY2wjROBsZNSKY0w9c4jojxj2oCjJtGMeOI0llwmgliiGVZcwmmMZB55FgmRIG6MiLJqrz91VweZOt8tBqsMXabnt6ovR1PfG4nsKBn44u355nhvoS4/DGbXZ0vzVo8TZHSWHyzSevc0jJb3ym/3rsmAhNtj8s6Ys1d0B67f6tR2/zKx3RyxadLu5xZtw1mKvEpDmmddFYIyk6bg7YmqJt32LJ2noYvaJs9C0waNdd3GuFek92RdG4xy5fiLSE0nd9eN3J7AjqWISektU1qpGCVgiKHCQ/2MFcir9tzZVH2MUGfTDDTbYZotugvSdgHmEUnBDAbnFLHCCMuQYrHjmAnMuJfr9lFhAgVsytOJng3hkzTsfhJvZm2iCBew5AzlzlFpscHWcmvgQtoYwqSKNbeEcgKdZZy0jHCsteWKSU8ZlE9pHIPWJ/HPAS2Hmx/IuHSLtALrWx0sccx4nBDMBUYxe9z4cQLOVf+yR6twPxvKYs/vH9bvrqhyt3AcvSpmE+HC5HynR0+zm5shOTu+Fxd3h8dZ2jskl+5Anv48AdlV8d6/mQ1DEgI6eyKgqmwHJm9rob/OQLqGTjLApINFB/MvGEgkJl9HoNIxsw5QoC2CmVcKY5HA5MEUWhzHMeaGS40ssmA2DKMWwhJBlNAUG8b83xD4MhtOfgqBvyCrbyHwP8v/EwKLmUqzf00/T2KCEiOE0kZCVOWJkAhQxxX2xnK4BJeAOWCf9pCOdi5xBLpeIsCA/w79ruPDtL8sFjVX5W1/HJvJ0eXJ6nyktPCD8kM9ONm+Tkd1tqBvLurxbjZ8X416exf7uWL2rHd3+h36QXu+otsfG/TnCbh27hvwazp4zT4wgGjlYiY0B9uodgbHkgjmDeaO2ufsa7Rfgo9iAJB08H4C9aYCTKNcIRChWEJ9vwTfxUSVLjqoy8pFL+bwBQabOM8ZiLEnmhomHDEOGgbIhx3T3nvuGXw+LcMxBYL5xDHBYkMVVzyhWCeUSRbLrzDwB5J/xkAhGaa4+XjTGEby8Y+N1roAQIONVu595eAvf/wTXpgduA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=7&limit=2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"7119\"\n            },\n            \"content\": \"eJztmMtS20wWx9/FVfEmgPp+cZVrimAwEDDhTpiaovqKBbIkJNnYTrGY2cxm3mA28wizmfW8AnmjaQU+IAkk+fLFs3LZrpJa8unu3/mfv+XzoRFXblA2Wn/+0FBpFY/iYlielZWqhmGwYRKn0sZCIx/qJDZnl24SBtfXx+XroyjLdtbWr9bejVWx3bsYHu910wFbedeT1cr47eH+a9Abne4wrWU3lSc7Kp9Gh73TbTs4uoo2mc4He5OdzSw9wEfZSdpR5+324zzDIgnz9KsqL1tRNFE2XiovIxtd9E9Gm729/s5Z5qbn4f5UDVy483JYlG5pGudhyI1j32h9uFlomMKpytlwHQEoFyFaBOIA4hbkLShfA9ACINxfxtMQAmIaXnChUbgyGxbGncX1FwmljFPIUYtpaDWXUHnEGYFIA1d/ATrLjFBCUYoYItwZCrhDjmvmLJEGWIwB1UyHmQaZjX383QWZbDBwaRUWEDLwoZEX8Shs4+y3hf3qVd0jn034kIVBPHBn1SSvI6s8D3OpKs7S6C5bPk7ck1Tb7DpNMmVdsWTj8nJpolLrxkvFMKpPI2q11dJKao3HgHtlmFYWKQwQMQh5YSgX4Sp32HJMOeAhlHTMeS08gz5iTAJqDIvScn3j0p28TdVeNz+YpOAw3rvaX9smZbdTxvEq75wnbxHDm13vJjqVad+vr17tXuCxjQddfJkna1vXb95JeQ0GordxUXaAZsuvcCe8/zSMbfsBYrPeYq3T9oNKm2EzeVbGNYe2qipl+nXGm31V9tvNJB7EVRs0TZZWtQ5qdu0n5F6htTpGIOWKsy+mqsXcvtdysx+uOY2UQCZAIxhq4bihhCptIDTWMuCbA2djdTdHEF4eZFA626wu01F7hJquCoVJJdcKY6uEq+XgiYPSceyQoIpY62oRqaof0lgnqRXt91Xhoqc1+ThJ7SkP09TV11eIsjAKpULEQyG8xNoqbyFnVgAoGFGq3kSoGCG4NwRSQawRWGLHgt689NQhHmLdx/8kqTCnpeHkB9ZeuFFcBq7BBCinAhFMoKRAYH6z8OOmuLc7PlxJponIdS8ayavJ6ca6rrY68bYe7R5nJVwbVLzce905iM7lZNzPT4fVcUK6aHtUoODBP2uKcfS+m6n3W1uTfYuS5PrRFG//CZdsZsbf8kRAFzE4AKxFZAvwLzyRSsyBfNkSieEYUSF5yFuoTE2xJsh7AXnIIufaMGYtxBgRhGxIhNKhVCWFSBrOgYHPWOIL63nJQ0apXcpyl44Hic+KgarKxcz72Liw72FdUkvXWWHzIjNBb3F6PkiWfrvyO432F+z1W0b7h8Pf3CXt7of8c6W87Kl5LX13HZFgBIwCSxAkBjoCnAuWqrGjFCturbDeE6Gh4LiuJWglo1hIRBhl2nkQxWmwVpiOrs47u/FmMUmWe3ZjbTrWx8t6vHqxkhxbv7Ur1jcnhObDxYPrSbprznYXpyunh1tm2eyy4QhNiWcXK93dRbmz7I7A8QjtX33HUV91wCv55k7mn5lqnCZx6r5lqPFAnbtgpRe5O3/WS+8t8LGeOqtry4dbB43aFeaEfx3h5qcfrZOTk/2mKbK8DR6R14Nz3jPi/RzuOe0Z0X4G9pz1bFh/jXpOejakt78ivT0nPRPSW1+R3pqTno1Tf436ZM56Vs8gz8Ce057dE/ZzuOe8/2/PISuNm7/83panYNgA6gNgQsMffsyEMcAyQ7kTQEkBPQZSWGKdIt57K5DTIRXQMuQ9AOB7Lc8371fKo7dVp3s1vdJxr9jp9te7cpRMNzrXtFd2p2eH0+Mj0dne8Mt88ciudi4vi9PNzYsDdrKK1PVPwv6Zrucf6PZ8o1t61+W6a5ZSzAg1SgPjQlTiOXAIUkgVRTSo+Gmz9CHyZ61Sz52TQhogkNKMYUqslho6hQC3iqkve6FPulH3hTUvwlkV4Wc96tt/3f77419v/3v7n49/D0d/qz8f/xE96Zk+dKaRssggiLXHHAJvnSDKh5ojUDlkrQ9vwrzA0IQXMIqFZECPgoao4IyxFzrTPyCVJ51pDpCEiAMIKYJA1j7yiU6jhRYaoQpKFw75zf8AefLpKg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/public?offset=9&limit=1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1364\"\n            },\n            \"content\": \"eJy1VNlu20YU/RcC1otlc1YuAojCihK7TlwntuzKKgpilktzLHExOZJFGf6SviT9In9Sh4rrBG0f+tACBDnLnXvOvecMHz1joWi90S+PniitWZtm1aatFXblFj21BFF6Q69eyaVR6QI6t2i6N/YjuRqTE5gvt9fLT9BONjfn+3J/uvz4U2dOyB07Vg+zRRR3gk3hw+n1rVmo3CK4nZ2t5b1/Gsi6uOjOT6tySq+rWTkRt0nyDWfVLB1Obm3djny/E9octgtf+9PbWlyVBlPgN/MjF1+KAlzk8+/PX9Ln354/48Otqd06bEzmjR6fhp5qQFjQLogggg8QPaBoivEI8xGm+wiNEHLxrdm6PC6CMI6GXgNttWoUpKY/yDgPQo5DMgo4goDHFFOEIVAkZJIEGUMRiSkVGaY0wpzxMKYoBp4xHKJMiSDCmgJwnjmkotImM/9MiLBXQqoqCiitI+BkePTqxqxdGemfxP5rVi99/3/SOxUKU0Bqu7rPLOraYQlrqtL/qlZmlvCd3rp6KJeV0NAcatMuDjtRatgcNiu/n/oozgRTnEKMKHG8BI4ySbHGCgFmIs5orDjGgGIUKUR0DI43i2IcC6JUIP0giBF3I79sT35cwOx9KS6O62lXoitzcT+3P4c32w/z6Vl1t0g/XV6u5ttokY4v33C6eZefz2bHx+VkfPT2XuH5+2B8Js/15sAedW9tgO4C+rBHJ+75YWV08trEQV9ib9Zkb4L2jsjujdP+E493E7Sz7sBVWFet6ZuTCGuFynsbDHLR5slgaQpjEzRQVWl7c/QNTb5r5x551+dw7YMm/Qt+7/DkxeCD3O1xShGTIbCYhQqTTGZcgwyFJkyKELFBAdqIrxjOjbXzRgt6YBflOlmTAVh3ZSUhTmSMIhmEkZYCg9AqECqTmnGGcO8sYXOnba/cyL/MRQP+327rN6T+l/OK1d/LXBAe9OeRkrEMsSOMolhmkoveAKGMgIVO4YxGEYEwEjrAlAWAFMZcoZiwTAoaSpfrJf/ObA5Tczf5FwU0sData643wgEOMepdz7HLHD39OvR2kritoVdlWQtuGD/9AWlcodg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=ZShQzuB9wxJxB%2FwZkKZ9iTLgKjwuDjrsKfAk8Bf7Z3Ci8MdFWwcF3ZKy8QM0fRbbq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=nXBcnGlfywGE3yHxGbLhyWcgZG22XrmwOXGeHkW1ZHCiZyPOEghmpEkd72i3XCM1q%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=dl%2Bc5VJ%2FnpElTj8CfKtTCUWD4i8NuZFlxbm%2FnJucDpfqWpepjGfV%2BC%2FuO6IEnz6dq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=1F8lNBhwHOFY6mxVD1v7yHMG1WC%2BhWBYTc2BeIZS8mOyGrKfgGq2RLDFyQAghFXsq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=9pzN8nuTYPCLMcgTsFhvAa4dpczjHmuNrH9YI%2FjgKn8d%2BMEKy2uFjPkSiKk2IHWcq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=3zKPt8AWrN6kC17aLIok37epy26V%2BxtOG%2FSjsyVu2fcle7wvhktMoIUDwIN5QsVZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=maIUF3stzlV7pHfJLuEX3aeq1c1byplh6ethRDF3PnggV2QNz6SwLNniFL2UeK7Pq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=HHxs%2BV%2FooOFHqFPxarMNjuWRGnm6CPN9tCxKUS%2B0NvZO6bb9Gn9XOapz%2FUNZMdmVq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=RQxUClzl8pbN%2Fv9qyZIHbtLDiMbvQWos1Fmt7sR%2BDT%2Fg9yxhpZutWl4G2Mvr2iteq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=iyCtP2UB2HeZlzVlQesDxYO%2Bb%2BTlPNyiH2j4GcwXk89ya4TeLJVgikcht0egXMvbq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=3zKPt8AWrN6kC17aLIok37epy26V%2BxtOG%2FSjsyVu2fcle7wvhktMoIUDwIN5QsVZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=maIUF3stzlV7pHfJLuEX3aeq1c1byplh6ethRDF3PnggV2QNz6SwLNniFL2UeK7Pq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=HHxs%2BV%2FooOFHqFPxarMNjuWRGnm6CPN9tCxKUS%2B0NvZO6bb9Gn9XOapz%2FUNZMdmVq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=RQxUClzl8pbN%2Fv9qyZIHbtLDiMbvQWos1Fmt7sR%2BDT%2Fg9yxhpZutWl4G2Mvr2iteq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=iyCtP2UB2HeZlzVlQesDxYO%2Bb%2BTlPNyiH2j4GcwXk89ya4TeLJVgikcht0egXMvbq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_get_upload_link_object.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_upload_link_object\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"146\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1F1BRNB6gW5chTGZmto0CZmJKOLdHVf/vbf5H+ULjqpTnjlTp7UNqbo15Kl9Q3T4aiOyfm60m2jWBSnVYpEOGdjv/63ZHZttf4WT8IDEIixj7sim5pDAmTDF2aTbAy2rlVqQfXLyeDkPooxLDsAoZYRA+P0B9WQ0BQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_upload_link_object\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"639\"\n            },\n            \"content\": \"eJy1UcFOxCAU/Jd3tZsFWkrL2U/YizGGUHgobilNYTeazf67b028amL0wpuQYXgzcwGDaULv0YO+QMlbBQ3QQKyYCujHpwbmmCLdCtZADqEgYYKrrS9E9bEc9f7B3tM8YKn7Sod5xmpO65ytN3NcjiZPr+gqydZc7Uzvrw0sNiEJfM/HtxhoMaJvWPJpc2gibQqdlL2SXAktej8EgtwPXgyj97YfpFMcGZNSTYoms9yJTg68G3Eag2AtCt9PrrUOA33iNrT1FgAIJrodUzvOD4zpVuhO3hFgjFgp+xjij7Tf5eJySrhUMlduPaxbPNNK5sv0XzteT9Mc3T/JU1n1fcXPEDa4NXeOJeYFNMmzXqqxl3JkomXXD70OwNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_get_upload_link_object%2Ftest.txt&overwrite=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"242\"\n            },\n            \"content\": \"eJwtj81ugzAQhN+Fc2PWf9jmKXJIz5VhdwuF2Mg4IlXVdy+RepxvpG80P03eqMQ65/QxY9M3wFJpZIzEeuRB8TBaCRE70NYMQaEDtsEHjmzBhzgY9KQkWgMcOsnNWzMV4tM01brtfds+tjVHpNLJL4HzvojvmJCeIlHtjdH//aXG8km1VaAMOClvoLUyToB04lFR+N0nxTnxcyyHyYe3HnTKx3JZXmLtTOicPNfvVKf8enJ9v52x0n1bY6WTcFx3+v0DrUZLNw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0f123dfdaef3cfb2fbc510ad60354b92d70f5989faf5089ab4d8e21d540f961f?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader61j.disk.yandex.net/upload-target/20240711T033247.017.utd.8s8n2fonfxcrw4ow85803nowk-k61j.3749671\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrSS0uUUjLzEkFABHSA4E=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0f123dfdaef3cfb2fbc510ad60354b92d70f5989faf5089ab4d8e21d540f961f?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_get_upload_link_object&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNjUEOwiAQAP/CWQuCZaH3xg/4AcouaWNbSFmNxvh3Oc7MYb5iPiiJQczMpQ5SxjU/8RzK0n3CjvTudmL5ukhc6kPmQkfgJe9Vpp5QBZPQJudAKweTN9pEA73XYEC3PClw0fcQbTIE6mqQ0E/W2eStOImNeM7Y3rfx3pBpK2tgaiaFtdLvD3oeMQw=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f5ed0a3fd6f8872087b9323c375927372ed0b078c957c6f3e7043ded9b686f96?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f5ed0a3fd6f8872087b9323c375927372ed0b078c957c6f3e7043ded9b686f96?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_issue7.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_issue7\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"130\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1IVQEBGsXqAbVzI0vySYNiEzEUW8u+Pqv/c2/2N8wWQ640Uyd9aOMVW3phzaNy0Or3aB2OfGusAPW8CplhF8zCT+8G/N7tRsLzc6Kw9gURGde2Cu2JuVmSE+OX249oOqYM6RBFomiozvD7NwLV4=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=any%20value%20here&offset=0&limit=500&path=any%20value%20here&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_issue7&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_listdir.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"131\"\n            },\n            \"content\": \"eJwVjcsKwkAMRf8l0J02qLuCiODjB7pxJaFJmcFpZ5ikooj/blzdc87mfiBUGaGDYFa0QxxSXnhNJbZvmlle7SyGzw1y1AdW0bzUQfRQyML+35rdsdlebnRy7kXNxXzuKapxrLCCSSxk9ovruXc1mUoiEy8jJZXvD+tELfk=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjcEKwkAMRP8l0Js2VG8FEUHrD/TiqYRuyi5uu8smFaX478bLzLx3mQ184Qla8KpZWsQxptXtKYf6Q4vjd72w4qtBF+SJhSWtZWQ5Z1J/+rvqeKkO3YOutnsWNVCrIQZRF4qhZQM7mFl9cvZ0v/WGynOOpGxmoij8/QEssDAG\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjcEKwkAMRP8l0JttsN4KIoLWH+jFk4Ruyi5uu8smFYv478bLzLx3mQ/4whN04FWzdIhjTKurKYdmo8Xxu1lY8bVHF+SJhSWtZWQ5ZVJ//LvqcK7a/k4X2wOLGqjVIwZRF4qhZQs7mFl9cvZ0uw6GynOOpGxmoij8/QEs1DAH\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjcEKwkAMRP8l0Js2aG8FEUHrD/TiSUI3ZRe33WWTlor478bLzLx3mQ/4wiO04FWztIhDTIvbUw71m2bHWz2z4npAF+SFhSUtZWA5Z1J/+ruquVTH7kFX2z2LGqjVMwZRF4qhZQM7mFh9cvZ0v/WGylOOpGxmpCj8/QEs+DAI\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1529\"\n            },\n            \"content\": \"eJy1k91qGzEQhd9Ft3XwSJrR33UfITclFKOfERX1es3uJqSYfffKJYXmJraJe6NB6OgwR9/oJJZfRxZBlDaJjdjxkLgULiKcRFt4mEV4OolDHN40sov4tdV+vm5EnjguZ7FQoPAB7IOER2kC2qDwC0AA6PqJ5/F5yrxrZyUSGUvSqkAxVeW0IusTOMRckzIoCVyEpJ2VlQpHWy0p6YxDzhJlBrI2euUzduthLK22ix0c4/LjT//zz7D9Fr/2+sjzsl36stu3eenJtm/p8jgMfFh6s/P5EY5Te+kZd39D3DvB8TntW/5P9h3RO7wTv7S5jQcRuj0YDYBIrt+mdfMvZXU1ZbpI2bribM0yRjDGV6VdrsZnbzVZBBulyTEVjzpzjEZKMAmUKzUhl1olXaJMN1NWN1K+Q4KPKH/a/grKJD2ice8p6ztS9r06KJ4ty8qV+0jpiCqDtT7LmmxVSBGgt62oaEyqD2l2kjU6jOTvT1nfSPkOCT6i/Gn7ayhT//oW1u9dOi5xL4LeiH0b2iICAWzEWOvMfQPr+hv/zLPT\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir1&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"72\"\n            },\n            \"content\": \"eJwNxzEKgDAMBdC7/DlDFpdcRUSUpBBoqNgsUnp3u703kN9jEKi/IJwWt6maQgY8LTpkPwjZ8qoQJlQPT8jGy62Ubis85w9RhBb8\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir2&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"72\"\n            },\n            \"content\": \"eJwNxzEKgDAMBdC7/DlDFpdcRUSUpBBoqNgsUnp3u703kN9jEKi/IJwWt6maQgY8LTpkPwjZ8qoQJlQPT8jGy62Ubis85w9RhBb8\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir%2Fdir3&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"72\"\n            },\n            \"content\": \"eJwNxzEKgDAMBdC7/DlDFpdcRUSUpBBoqNgsUnp3u703kN9jEKi/IJwWt6maQgY8LTpkPwjZ8qoQJlQPT8jGy62Ubis85w9RhBb8\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgjAQQNG7dK2UMoWO7I0X8ALTdhqIQBs6Go3x7rL8b/O/ato5qVFNIqWOWoclP+OZytx8aIv8bjYW/TI6zvWhc+GdZM5b1cZ0dLHGk0c2NiSHFh0ADj0GsK6FCDxA6DERd13rvUFMAB4uNg2ujeqkVpYpx+N9u96PFF7LQsKHJFoq//5bNzC0\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/112a941bab8e14cf78487338658c34703d3e63c58fae220bb188f33b394f670d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/112a941bab8e14cf78487338658c34703d3e63c58fae220bb188f33b394f670d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_listdir_fields.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1F1BRNB6gW5claEzIYNpEzJTUcS7O67+e2/zPy5WCq5zUbVI5/2U8opbKNy+YUF6tQupf+48sjx8JclrnUhOBTQe/605nJt9f4eL8UCiJmozJhZFrmNgSihu42bSmNGebtfBVGkuCZSsBEhC3x9L2zDP\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02VHcFEcHHD3TjqgydCRlMm5CZiiL+u+PqnnM29+NipeB6F1WL9N5PKa+4hcLtGxakV7uQ+mfnkeXhK0le60RyLKDx8G/N/tTsrnc4Gw8kaqI2Y2JR5DoGpoRi1aRzGzeTxox2eLsMpkpzSaBkJUAS+v4AoRIy3A==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02WHcFEcHHD3TjqgydCRlMm5CZiiL+u+PqnnM29+NipeB6F1WL9N5PKa+4hcLtGxakV7uQ+ufOI8vDV5K81onkWEDj4d+a/anprnc4Gw8kaqI2Y2JR5DoGpoRi1aRzGzeTxox2eLsMpkpzSaBkJUAS+v4AoTYy3Q==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields%2Fdir3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02aHcFEcHHD3TjqgydCRlMm5CZiiL+u+PqnnM29+NipeB6F1WL9N5PKa+4hcLtGxakV7uQ+ufOI8vDV5K81onkWEDj4d+a7tTsr3c4Gw8kaqI2Y2JR5DoGpoRi1aRzGzeTxox2eLsMpkpzSaBkJUAS+v4AoVoy3g==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields&limit=500&fields=_embedded.items.name%2C_embedded.items.type%2Ctype%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"158\"\n            },\n            \"content\": \"eJx9yzEKgDAQBdG7/HqLaLDZq4hIJCsEEiNmGwm5uxYWNloOj6mYJS3ivXhwRVBJBTxW6LkLGD4cIGwuPdGh0Sf2f2jRJoJmdRFsCTGkoODBGEJe1yJ3mEbvvV2pBjGI\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_fields&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNjUsOgjAUAO/StdLSD1D2xAt4gUffayACbejTaIx3t4tZzGzmK5aTohjFwpzLKGXY0hOvkNfmAwfSuzmI5auVuJaHTJlO4DUdRVo/hKjaaD0RKqf83NlWm6GvqGEOAbzpO+1I6aC8q81E1NYgIoC2UVzETrwkrO/bdK/KtOcNmGqJsBX6/QFgXzDg\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/498cf01f49eed0509b641238723808bcca937625e02c0958083fd243dddaa24f?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/498cf01f49eed0509b641238723808bcca937625e02c0958083fd243dddaa24f?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_listdir_on_file.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_on_file\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"139\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1F1BRNB6gW5chaGZkOA0CZmpKOLdHVf/vbf5HxMbBjOYKFJ5sHamsvot1NS/IXt89RnFPnfWJ37YhlzWNiOfKkg8/lt3OHf78Q4X5QlZVETHUWLxqbmSXUiEZmMWlFi8Xt2uk6rgUgkEtQQgxu8Pf6MxNA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_listdir_on_file%2Fzeroes.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"126\"\n            },\n            \"content\": \"eJwtzEEOgyAQQNG7sHdARKicwwvQMApq0cCYVI13b5v0b1/yLxYyDsyyQLQVy/m+LavzmNsJfCwzHC55fENCsko1f67I5RGJSyGVMEL38peBRy1gJw/dsE7xXE4dQlfGpGN4Hc+oHFbz91sb0TZaKnZ/AHHxKJw=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader5j.disk.yandex.net/upload-target/20240706T222227.810.utd.9fojizlz6hh9sgn6ihmybi4ae-k5j.17053624\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwzMBgFo2AUDHcAAK0au4E=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_on_file%2Fzeroes.txt&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_on_file&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzU0OgjAQQOG7dK209A9hb7yAFxg6M4EItKGj0RjvLsv3bd5XTTuxGtQkUuqgdVryE89Q5uYDG9K72Uj0q9U414fOhXaQOW9VR7B96y/YOROYo+k4Bg5jBAZIwSFyYNvHlNBy6qINHoyxI3D06N0I6qRWkinj8b5d70cKrWUBoUMYlkq/P7YSMik=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/6a29148d7305ff607f65f5b6afaac53ddf5f296ccd2fc76254a002baf64d43ba?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/6a29148d7305ff607f65f5b6afaac53ddf5f296ccd2fc76254a002baf64d43ba?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_listdir_with_limits.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"143\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxVUIzJYNJEzK3PhD/3XF1zzmb+zGh0mQ6E4AinbVjzItfu8Lt282eXu1MsI+N9Sx3W0nyUkeSQ3EI+39rdsdme7m5k3JPAhXoDJEFnuvwZASVxBCzMokQste767lXBaUSHUjL5KLQ9wdblDMF\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"150\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2VG8FEUHrC/TiqYRmSxbTJmSn/iC+u+tp5vvmMB8TCk2mNQHI0lo7xrT6rctcv93i6VUvBPtorGe520KS1jKSHLNDOPxdtT9Vu+7mztp7EihAY4gs8FyGJyMozAzRSU1jNmYmhOT19XrpFUFzjg6kZnJR6PsDwEU1Eg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"150\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2WG8FEUHrC/TiqYRmSxbTJmSn/iC+u+tp5vvmMB8TCk2mNQHI0lo7xrT6rctcv93i6VUvBPvYWc9yt4UkrWUkOWaHcPi7an+qmu7mztp7EihAY4gs8FyGJyMozAzRSU1jNmYmhOT19XrpFUFzjg6kZnJR6PsDwGk1Ew==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits%2Fdir3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"150\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2aG8FEUHrC/TiqYRmSxbTJmSn/iC+u+tp5vvmMB8TCk2mNQHI0lo7xrT6rctcv93i6VUvBPvYWc9yt4UkrWUkOWaHcPi7qjlV++7mztp7EihAY4gs8FyGJyMozAzRSU1jNmYmhOT19XrpFUFzjg6kZnJR6PsDwI01FA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"567\"\n            },\n            \"content\": \"eJy1kT1uwzAMhe/CtQ5CS/7VnCNkKYrCkEUKERrFhqWkLQLfvUyQDp26tAtFQR+e3iOvkD9nBgMUFihg4DgyEROYK4TMMYF5ucLJxgdTCsQfwcv7WoBb2OYbDApVtcF2g82+7I1SRpdPiAZR+IXTdF4cD+FGVnXdtHXZCjJW5JuOakc4kqK+U+Q9l8iua2rf9r7T6G2lG0Xcke1Jl06NZHVPWFZepONEwYdfHcw2H+7+05vZPtudnHtOeZulDMeQsiQb3kM+yCWGnLaPpG6KkU9ZjKfbQOYlXCTv8B3or9PM5/EY3D/Jy7p+rHrhS0hhOoEReVS9ln+wqjut11dBp2yPYHQB94kIVMDkfWJpcV2/AGprqT8=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits&limit=1&offset=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"567\"\n            },\n            \"content\": \"eJy1kctOwzAQRf9ltqSq42fjdT+hG4RQFNtj1aJuotgtoCr/zqQqC1ZsYOPH+Oj63pkb1M8JwUJIMzTQY3YYAgawN0gVcwH7coPzkB8MJwg/UqT3pQE/41BXGDjjcsPMhulD21nOrWifGLOMET9jGS+zxz6tpFRKG9UabpUPPkomPBct1TT3Sg+t9JJ36DoljTNmp5zjJrKd3nVGU4WHKJR2vkNB0nkMKaZfHUxDPd79lze7fR72tB+w1G2lpT+lUilZ/57qkS451bJ9JPVjzniuZLysDZnmdKW8/Xegv04zXdwp+X+Sp3H9GPWM11TSeAZL8ox3gv5RkhveLq+EjnU4gRUN3DtCUANjjAXX47J8ATl+o98=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits&limit=1&offset=2&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"567\"\n            },\n            \"content\": \"eJy1kcFuwyAMht/F16WqQwgknPsIvUzTFEEwKlppokC7TVXefW7VHXbaZbtgwJ9+/b99hfI5ExjwcYEKBkqOvCcP5gqxUMpgXq5wsunBNAzRRwzcXysYF7LlBoNAITeoN6j2dW+EMI14QjSIzC+Up/My0hBvpGxbpdtaC+O0JS1GHaSSnn9aJa3yjXMOLSqhurpGok4iuiCFkrXqOqRAqg861KJn6TT5GOKvDmZbDnf/+c1sn+2O655y2RY+hmPMhZMN77Ec+JFiydtH0nFKiU6FjefbQOYlXjjv8B3or9PMZ3eM4z/J87p+rHqhS8xxOoFheRR9o1uBUmrRra+MTsUewTQV3CfCUAVTCJn4Ktb1C5s7pCg=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_limits&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgjAQQNG7dK20HUoL7I0X8AJDZxqISBs6Go3x7rL8b/O/at45qVHNIqWOWsc1P+mMZWk+uBG/m41Fv6ympd51LryjLHmrmoGd78C5gUIkD76zA2NsjeVge2AwfTsR+WTAGUpTRB9haA3YHrvggjqpB8uc6XhfL7cjhR9lReFDEq6Vf39q5zDU\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/e2e4652449d7cd626519eac301e7182e2083bdd6f0240dfbca6c2930218a5747?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/e2e4652449d7cd626519eac301e7182e2083bdd6f0240dfbca6c2930218a5747?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_listdir_with_max_items.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"146\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4b1F1BRNB6gW5chaGZksGkCZmpVsS7O67+e2/zPyZUnExngkjhztox5sVvoVD7htnj2s4o9rmznvhhK3Je6oh8KiDh+G/N4dzs+ztclAdkUREdF4nFU3UvkuASrI4EE5uNSSghe328XQdVrSWCoJYJIuP3B/7cNDo=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2VG8FEcGfF+jFU1iaLVlMmpDdakV8d9fTzHzfYT4mVJxMb4JI4d7aMebFb6FQ+4bZ49rOKPbZWU/8sBU5L3VEPhaQcPizZn9qdtc7nLUPyKJDNFwkFk/VvUiCS7A6EkysVmFnNiahhOz1+HYZdKosEQSVTBAZvz9sDzZH\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2WG8FEcGfF+jFU1iaLVlMmpDdakV8d9fTzHzfYT4mVJxMb4JI4d7aMebFb6FQ+4bZ49rOKPa5s574YStyXuqIfCwg4fBnzf7UdNc7nLUPyKJDNFwkFk/VvUiCS7A6EkysVmFnNiahhOz1+HYZdKosEQSVTBAZvz9sMzZI\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2aG8FEcGfF+jFU1iaLVlMmpDdakV8d9fTzHzfYT4mVJxMb4JI4d7aMebFb6FQ+4bZ49rOKPa5s574YStyXuqIfCwg4fBnTXdq9tc7nLUPyKJDNFwkFk/VvUiCS7A6EkysVmFnNiahhOz1+HYZdKosEQSVTBAZvz9sVzZJ\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir4\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02+FgVRAQfP9CNqzA0UzKYNCEz1Yr4746re+85i/sxoeJoOhNECnfWDjHPfg2F2jdMHpd2QrHPjfXED1uR81wH5GMBCYc/a3anZnu9w1l7jyw6RMNFYvFU3YskuASLI8HEahXuzcoklJC9Ht8uvU6VJYKgkhEi4/cHbHs2Sg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir5\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2qHgpiAj+vEAvnsLSbMli0oTsViviu7ueZub7DvMxoeJoOhNECnfWDjHPfg2F2jdMHpd2QrHPjfXED1uR81wH5GMBCYc/a3anZnu9w1l7jyw6RMNFYvFU3YskuASLI8HEahXuzcoklJC9Ht8uvU6VJYKgkhEi4/cHbJ82Sw==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items%2Fdir6\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"153\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2qOChICL48wK9eApLsyWLSROyW62I7+56mpnvO8zHhIqj6UwQKdxZO8Q8+zUUat8weVzaCcU+N9YTP2xFznMdkI8FJBz+rNmdmu31DmftPbLoEA0XicVTdS+S4BIsjgQTq1W4NyuTUEL2eny79DpVlgiCSkaIjN8fbMM2TA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=0&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"70\"\n            },\n            \"content\": \"eJwVxjEKgDAMBdC7/DmDk0OuIiJKfiHQULFZpPTu4pveQL43oTB/IDgYF81o0AFPRoduuyBbnhW6CqqHJ3QRtFI6/875ASfcFp0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUHgYM635CNlVVIWwGBdXYliFpqsj/XhKli666aTeAxNHVPTNXKJ8LggEfV2jAYurRe/RgrhALpgzm9QqTSw+GVggvMdT/rYFhRVduMDDC2h1ROyIPVBvGDJdPhBhCKr9ink/rgDbeyFYIqQRVzHQhCMmJok4iBtch06gpOtREdNgH2UvOue5pL3Dw1BNNtWpdJxUTQUpeo9PsY4i/NlhcOd7753ezf3HP9T5gLvtSDzvGXKqZ/YjlaJO72Lv3/iE7zCnhVGr3fJvJssZzVbbfTn8ttJz6MQ7/FF839mPbK55jjvMEpsYTprkSstOEtu32VtG5uBGMbGCMKZYKNTCHkLE+ybZ9Afvbp2s=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUHgYM635CNlVVIWwGBdXYliFpqsj/XhKli666aTeAxNHVPTNXKJ8LggEfV2jAYurRe/RgrhALpgzm9QqTSw+GVggvMdT/rYFhRVduMDDC2h1ROyIPVBvGDJdPhBhCKr9ink/rgDbeyFYIqQRVzHQhCMmJok4iBtch06gpOtREdNgH2UvOue5pL3Dw1BNNtWpdJxUTQUpeo9PsY4i/NlhcOd7753ezf3HP9T5gLvtSDzvGXKqZ/YjlaJO72Lv3/iE7zCnhVGr3fJvJssZzVbbfTn8ttJz6MQ7/FF839mPbK55jjvMEpsYTprkSstOEtu32VtG5uBGMbGCMKZYKNTCHkLE+ybZ9Afvbp2s=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUwDxi1v2EbKqqQtiMlVGNbRmSpor878VRuuiqm3YDSBxd3TNzg/w5I1gItEAFDmOLIWAAewPKGBPY1xuMPj4YUSC8Ul/+1wq6BX3eYBBMyB0zO6aPvLFC2No8MWYZK/yCaTovHTraSKmUNoobYXsp5KERwdS6QaZ16JtacxOC9NJgQDSmPbSq86zxKKU0HRcH3mqvNRfI6xIdp0A9/dpg9vl075/e7f7FP5f7iCnvczncQCkXM/dB+eSiv7q79/4h200x4phL97TNZF7oUpTdt9NfC83ndqDun+LLxn5se8ELJZpGsCWeiaY2yiihGNfrW0Gn7AewuoKBIuUCVTD1fcLtua5flvKmIw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUHgYM635CNlVVIWwGBdXYliFpqsj/XhKli666aTeAxNHVPTNXKJ8LggEfV2jAYurRe/RgrhALpgzm9QqTSw+GVggvMdT/rYFhRVduMDDC2h1ROyIPVBvGDJdPhBhCKr9ink/rgDbeyFYIqQRVzHQhCMmJok4iBtch06gpOtREdNgH2UvOue5pL3Dw1BNNtWpdJxUTQUpeo9PsY4i/NlhcOd7753ezf3HP9T5gLvtSDzvGXKqZ/YjlaJO72Lv3/iE7zCnhVGr3fJvJssZzVbbfTn8ttJz6MQ7/FF839mPbK55jjvMEpsYTprkSstOEtu32VtG5uBGMbGCMKZYKNTCHkLE+ybZ9Afvbp2s=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUwDxi1v2EbKqqQtiMlVGNbRmSpor878VRuuiqm3YDSBxd3TNzg/w5I1gItEAFDmOLIWAAewPKGBPY1xuMPj4YUSC8Ul/+1wq6BX3eYBBMyB0zO6aPvLFC2No8MWYZK/yCaTovHTraSKmUNoobYXsp5KERwdS6QaZ16JtacxOC9NJgQDSmPbSq86zxKKU0HRcH3mqvNRfI6xIdp0A9/dpg9vl075/e7f7FP5f7iCnvczncQCkXM/dB+eSiv7q79/4h200x4phL97TNZF7oUpTdt9NfC83ndqDun+LLxn5se8ELJZpGsCWeiaY2yiihGNfrW0Gn7AewuoKBIuUCVTD1fcLtua5flvKmIw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=2&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUU3tis+wnZVFVlERgUVGNbhqSpIv97cZQuuuqm3fAQR1f3MDconzOCAR8XaKDHdETv0YO5QSyYMpjXG4w2PRheIbzGUN/XBtyCtmwwMMLEjugdUQfaGcYM10+EGEIqv2CezovDPm6kkFJpSTUzzgunghZSUBo6KqxkrF6D1i1xSraUtEhbF7jkSolgO2qRt1yj510rcItOk48h/tpgtuV075/fzf7FPtf9gLnsS136IeZSzfqPWE59stf+7r1/yLopJRxL7Z63P5mXeKnK/bfTXwvN5+MQ3T/F14n9mPaCl5jjNIKp8YR1XEvdMSmUXN8qOhU7gFENDDHFUqEGphAy1iNb1y8bw6Sd\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUHgYM635CNlVVIWwGBdXYliFpqsj/XhKli666aTeAxNHVPTNXKJ8LggEfV2jAYurRe/RgrhALpgzm9QqTSw+GVggvMdT/rYFhRVduMDDC2h1ROyIPVBvGDJdPhBhCKr9ink/rgDbeyFYIqQRVzHQhCMmJok4iBtch06gpOtREdNgH2UvOue5pL3Dw1BNNtWpdJxUTQUpeo9PsY4i/NlhcOd7753ezf3HP9T5gLvtSDzvGXKqZ/YjlaJO72Lv3/iE7zCnhVGr3fJvJssZzVbbfTn8ttJz6MQ7/FF839mPbK55jjvMEpsYTprkSstOEtu32VtG5uBGMbGCMKZYKNTCHkLE+ybZ9Afvbp2s=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=1&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUwDxi1v2EbKqqQtiMlVGNbRmSpor878VRuuiqm3YDSBxd3TNzg/w5I1gItEAFDmOLIWAAewPKGBPY1xuMPj4YUSC8Ul/+1wq6BX3eYBBMyB0zO6aPvLFC2No8MWYZK/yCaTovHTraSKmUNoobYXsp5KERwdS6QaZ16JtacxOC9NJgQDSmPbSq86zxKKU0HRcH3mqvNRfI6xIdp0A9/dpg9vl075/e7f7FP5f7iCnvczncQCkXM/dB+eSiv7q79/4h200x4phL97TNZF7oUpTdt9NfC83ndqDun+LLxn5se8ELJZpGsCWeiaY2yiihGNfrW0Gn7AewuoKBIuUCVTD1fcLtua5flvKmIw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=2&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUU3tis+wnZVFVlERgUVGNbhqSpIv97cZQuuuqm3fAQR1f3MDconzOCAR8XaKDHdETv0YO5QSyYMpjXG4w2PRheIbzGUN/XBtyCtmwwMMLEjugdUQfaGcYM10+EGEIqv2CezovDPm6kkFJpSTUzzgunghZSUBo6KqxkrF6D1i1xSraUtEhbF7jkSolgO2qRt1yj510rcItOk48h/tpgtuV075/fzf7FPtf9gLnsS136IeZSzfqPWE59stf+7r1/yLopJRxL7Z63P5mXeKnK/bfTXwvN5+MQ3T/F14n9mPaCl5jjNIKp8YR1XEvdMSmUXN8qOhU7gFENDDHFUqEGphAy1iNb1y8bw6Sd\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=3&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kctuwyAQRf9ltnUUwGAI635CNlVVIR6Dgmpiy5A0VeR/L4nSRVfdtBtA4ujqnpkr1M8ZQUNIC3RgMDsMAQPoK6SKuYB+vcLR5gfDG4SXFNv/2oFf0NYbDIwwviFyQ4Y93WnGdK+eCNGENH7BMp0WjybdSC7EIAWVTJNBRAzcU6eCE9Q5wSVFFaQlMVDqeR+48DwKoYhHRRTuBu4QI1WSORJbdJ5CiunXBrOth3v/8q63L/a53XssdVvbYcZUajMzH6keTLYXc/fePmT9lDMea+tebjOZl3Ruyubb6a+F5pMbk/+n+LaxH9te8JxKmo6gWzxhu14K1TPG6bC+NXSqdgQ9dDCmnGqDOphiLNie/bp+ASQgqMg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=4&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kUFuwyAQRe8y2zrKGAy2WfcI2VRVZWEzKKjGtgxJU0W+eydRuuiqm3YDSDx9/Tdzhfy5EBhwYYUCOoo9OUcOzBVCppjAvF5hsvHBKIboEjz/bwUMK9l8g0GgqHZY71AfytYIYWTzhGgQmV8pzad1oC7cyEopXauyFkZp5xtZoRp6X/q+FL3VlfCIyEjViGZwLfattkit0iidbFBITVrVTjfOcXScXfDh1waLzcd7//Ru9i/2me8DpbzPfHRjSJnNuo+Qj120l+7uvX/IDnOMNGXunm4zWdZwZuXu2+mvhZZTP4bhn+J5Yz+2vdI5pDBPYDgeRStr1dSlQInbG6NztiMYXcAYYsgMFTB7n4if1bZ9AW50pNY=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&limit=1&offset=5&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"570\"\n            },\n            \"content\": \"eJy1kUFuwyAQRe8y2zoKxoAN6x4hm6qqEMaDgmpsy5A0VeS7dxKli666aTeAxNPXfzNXKJ8LgoEhrlCBxdTjMOAA5gqxYMpgXq8wufRgFEF4iYH+twr8iq7cYOCMix1rd0wdam04N41+YswwRvyKeT6tHm28kUJK1cq65UR1oXGd4Ki0bHngapCKY+eDkD5gJ/vaBx24VrJvA28bXqu6Z7oLgvXCSYpO8xBD/LXB4srx3j+/m/2Le6b7gLnsCx12jLmQmf2I5WiTu9i79/4h6+eUcCrUPd9msqzxTMr22+mvhZZTP0b/T/G0sR/bXvEcc5wnMBTPuG5aqeuaC6a3N0Ln4kYwqoIxplgIqmAOISM95bZ9ATgppb4=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_listdir_with_max_items&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOwiAQQNG7sNYyQAule+MFvMAIM2ljW0hBozHeXZb/bf5XzAexmMRcay6TlGFNz3jGvHQf3CO9u52qfCkZl/KQKdOBdUl7kcr5AL11PVkY0WAwbCN77bzWAX0wdIdBMVjrYTTRQIjaW2BwihX7QZzERnVOsb2vl1vLSltesVITxrXQ7w9gvTC1\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/179c04674e608a3ac3f6df927922ca9c3eb051f0669083d30cd2960f071f1f95?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/179c04674e608a3ac3f6df927922ca9c3eb051f0669083d30cd2960f071f1f95?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_makedirs_with_scheme.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"144\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiKD1B7pxFYbmloQmTchMfSD+u3F17zmb81ER4pJVnbpdB7VRrmCq4EQyd1qPIa12S9m3b1osXu0C0Y+dtp5nXcBpLSP4lEnc8e+aw7nZ93e61D+ApYLUMZFmWF/YPL04w6NDRK0JYg4kqP2JAuP7AxBEMz0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fdirectory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"325\"\n            },\n            \"content\": \"eJy1jk0KwkAMha8yzMaNWNSd67oXdCMIZehEO2h/mARUxIXtynN4AVFEEdQrpDcyileQkLxAXpJvo8H73OueDh3OB4aSMAfMqL9ySNj/zpraAsbeFeTyTJzDAmI3dWBVIX410VZWe8HYfE6MACkgKVFq5mCdx2jpKIkwTiCFoDAeMmr/tPPTbrAAM43EDTHlfj3Ryn4wGqTgC9ISiBQQzQwEgA985yNfJR8STz7zU/GrruqSb3/ikT8XVe/kx54voiWf6kq6sqW3b+suiaM=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"295\"\n            },\n            \"content\": \"eJytjk0KwkAMha8yzMaNWNSda7sXdCMIZehEO5T+MAkoiAvrynN4AVFEEaxXSG9kKh5BQvICSd6XrQbvC69HeuwwnRhKxgVgTuHGIWH4nXW1BYy9K8kVuWxOS4jd0oFVpeyrhbZyOgrmprWYAVJAUqLMpGCdx2jtKIkwTiCDoDQecur/dPDT4UIr23I7pOBL7gk1A0SzAiHyiZ985rvkS6LmK9eK382hqfjxrwfE+KaavZge+SZa8aU5SFf19O4Dh7F9rQ==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"279\"\n            },\n            \"content\": \"eJyljU0KwkAMha8yzMaNtOjStd0LuhEKZehEO0h/mAQUxIV15Tm8gCiiCOoV0huZFm8gIXmBvLxvq8H70uuRHjtcTQxl4xKwoGjjkDDqbn1tAVPvKnJlIc5pBalbOLCqEr+KtZXXUTg3bcQMkEKSkeRmBdZ5TNaOsgTTDHIIK+OhoMFPh7FWtuX1SEFHDISWA6JZgpD4xE8+8136JfXmK78Vf5pDU/PjX7AE3lSzl7Aj30RrvjQH2epA776aanfV\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"154\"\n            },\n            \"content\": \"eJwVjs0KwjAQhN8l0Js2VG8FEcGfF+jFU1maKQltmpDd+oP47q6nmW/mMPMxEeKTM625XTqzMb5gVPAimVtrhzmtbks51G9aHF71ArGPxrrAky3gtJYBfMwk/vDPqv2p2l3vdFbfgUVBVPpIE1wo3D+D+J4HjwjtMhUs0uiuIOaZBPpkpJnx/QEdxzaV\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"164\"\n            },\n            \"content\": \"eJw9jjsKwzAQRO8icJdY2OkMIQTyuYCbVGaxxkjYsoV2nQ8hd8+mSTVvZpr3NhHiF2cacz23ZmN8xqDFiyRurO2nZXVbSqF80ezwLGeIvVfWBR5tBi9r7sGHROL3v63YHYv6cqOTcgsWLaLRRRrhQubuEcR33HtE6JcoY5bqT7UaCGKaSKBOA02MzxdMzznu\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"174\"\n            },\n            \"content\": \"eJw9jssKgzAURP8l4K41qDuhlEIfP+CmK7mYkQSNCbnXPij996YbV3NmZnM+ykNsMKpVt0undsomjLlYkcit1sMcVrOn6Mo3LQavcoHoR6WN40kncFjTAD5GEnv4b0VzKurrnc6ZO7DkIjl6TxOMS9w/ndieBwuP/EVKWKTaqN6oyS4CH2cSZLuRZsb3B51mPUg=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"191\"\n            },\n            \"content\": \"eJw9js0KwjAQhN8l0Js2tL0VRAR/XqAXT2FJtiQ0aUN2qxbx3V0vnuabGQbmrRKyX5zq1e0yqJ3yBUcxnjlTr7WNy+r2kEO9wezwVc/I+tFoF2jSBWlZi0U6ZmB/+GVVd6ra6x3OwgMSi2ERk2BCFwqZZ2BvyHpMKF2GgjM3f2r/1AlFhNHICi0vZZNzjClHYJS7I0TCzxfrV0Ox\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"397\"\n            },\n            \"content\": \"eJy1jkFqwzAQRa8yaF1i2u6yTvaBZlMIGGFNapHaMtJAG0IXtVc9Ra8QCmpDcZMrjG7UcXBzgyI0X+jPzH87hd47r6ZqZsNmoalcOFtTWLr5sw2ENc2sx4Kc387PjVfKYCi8bci6WsbuGizs2qKBRoZhpYzsmWb3eti3xEAZSckrvUFjfcifLJV5KEqsMGu0l4DrUW9Gvc0eUa9z85e7UtCcmYAc4EgFF3siSBWGoB9QcPidj5A6/uY9f8n9kXPkPnXAp9Sllg//hCiZnxwhvUrKG0fRlj/kM6ZWooXkNDCJD2Ls5X3gHobCURAj9xP18gtWxbLw\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"194\"\n            },\n            \"content\": \"eJw9js0KwjAQhN8l0Js2tL0VRAR/XqAXT2FJtiS0aUJ2qxbx3V0vnuabGQbmrSKyT0716nYZ1E75gqMYz5yp19rOaXV7yKHeYHH4qhdk/Wi0CzTpgpTWYpGOGdgfflnVnar2eoez8IDEYljERJjQhULmGdgbsh4jSpeh4MLNn9o/dUKwJPZYjAzRciqb/GOMeQZGeTzCTPj5Ar/qRQo=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fdirectory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwVjs0KwjAQhN8l0Js2qLeCiODPC/TiKYRkSkKbJmS3ahHf3fU0M98cZj4qgUP2qlP3a682KlQMEgJzoU5rN+XFb22J7Wpnj3c7g/Vzp32kUVdQXqoDnYrlcPyz5nBu9reHvYjvQSyBRUyyI3ysZF6RgyEXkCCdIDjOdZVlRiqTZciXwU6E7w+UhTev\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme%2Fdirectory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_with_scheme&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzk0OwiAQQOG7sNYCZcpP98YLeIGhDGljLaSMRmO8u12+1fe+4kE8lyRGcb3cxEnMO+UjZubaRimntTzTGevSfXBL9O42YvnSMi3tLkulHXkpW5O5NzrahD0AEAwqOkXKOe8igc0GtCHVexjA2RBQDzZO5MNE2rjkDYRDZnrUFZmOl4xro98fMP8wXw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f231b6da2444e450b70e07787be46f3413e0284547699a156bce89ce137d8349?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f231b6da2444e450b70e07787be46f3413e0284547699a156bce89ce137d8349?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/f231b6da2444e450b70e07787be46f3413e0284547699a156bce89ce137d8349?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_makedirs_without_scheme.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwVjs0KwjAQhN8l0Js2qLeCiKD1BXrxVJZmSkKbJmS3/iC+u+tp5pvLNx8TIT4505jbtTMb4wtGBS+SubF2mNPqtpRD/abF4VUvEPvYWRd4sgWc1jKAT5nEH/9bdThX+/ZOF+0dWBREo480wYXC/TOobpWeB48IFQpinkmgF0aaGd8fszY0lQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fdirectory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"331\"\n            },\n            \"content\": \"eJy1jkGqwkAMhq8yzMaNWNSda90LunkglKET7aDtlElERVxYV57DC4giiqBeIb2RUbzCIyR/IPmTb60hBB90R3cdTvuG0q4HzKm3dEjY+87q2gImwRXkfC6bgwISN3ZgVSH7aqStWDvRn/mcGAJSRFLizEzBuoDxwlHq5xRjkkIGUWEC5NT8aeun7WgGZhyLARLyYTXSyn5IaqTgy9IQjgwQzQSEgQ985yNfJR8STz7zU/Gr2lUl3/4PSV5dVLWVN3u+iJZ8qnbSlQ29eQMpwoxT\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"301\"\n            },\n            \"content\": \"eJytjk0KwkAMha8yzMaNWNRd17oXdCMUytCJdpD+MIkoiAvblefwAqKIIqhXSG9kFI8gIXmBJO/LRoP3hdehHjhcjAylgwIwp+HaIeHwO2trC5h4V5Irctkcl5C4mQOrStlXkbZyGgZT87GYAFJAUuLMLMA6j/HKUVosKcYkhQyC0njIqfvT3k/7kVb2g26Rgi+8I+AMEM0cBMoHvvORr5IPiSef+an41dRNxbc//iDeF9XsxHfPF9GKT00tXdXR2zd3zYBd\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"285\"\n            },\n            \"content\": \"eJytjU0KwkAMha8yzMaNtOiya90LuhEKZehEO0h/mEQUxIV15Tm8gCiiCNYrpDcyikeQkLxAXt630eB96XWkBw4XI0PZoAQsaLh2SDj83rraAqbeVeTKQpzjClI3c2BVJX4VayuvUTg1n4gJIIUkI8nNAqzzmKwcZeWSEkwzyCGsjIeCej/tx1rZD7JDCr7QQIA5IJo5CIyP/OAT36SfUg1fuFH8avdtzfc/sCXzqtqd5B34Klrzud3LVgd6+wZhgnqF\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"157\"\n            },\n            \"content\": \"eJwVjssKwjAQRf8l0J02VHcFEcHHD3TjqgzNLQltmpCZ+kD8d8fVfS3O/ZgI8cmZ1twundkYXzBq8CKZW2uHOa1uSznUb1ocXvUCsY/GusCTLeC0lgF8zCT+8O+q/anaXe90Vt+BRYOo9JEmuFC4fwbFrdLz4BGhc6aCRRpFC2KeSaBnRpoZ3x/OKTft\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"167\"\n            },\n            \"content\": \"eJw9jr0KwzAQg9/FkK2NSboFSin05wWydApHrGCTODG+S38offdel07SJw3S20SIX5xpzPXcmo3xGYOCF0ncWNtPy+q2lEL5otnhWc4Qe6+sCzzaDF7W3IMPicTvf1mxOxb15UYn9S1YFESlizTChczdI+jcKh33HhFaJ8qYpfq7Wk8IYppIoLcGmhifLwqwO0Y=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJw9jrkKwzAQRP9F4C6xsN0ZQgjk+AE3qcxijZHwJbTrHIT8ezaNq3kzU8x8zATxizO1uV0aszM+oVfjRSLX1nbjsro9xZC/aXZ45TPEPgrrAg82gZc1deBjJPGHf5ZVp6y83ums3IBFjai0Ew1wIXH7DDq3SsudxwStIyXMUmxUblTpHcEURxLowZ5GxvcHaLc+oA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"194\"\n            },\n            \"content\": \"eJw9js0KwjAQhN8l0Js2tL0VRAR/XqAXT2FJtiQ0bUJ2qxbx3V0vnuabWZaZt5qRfXKqV7fLoHbKFxzFeOZMvdY2ptXtIYd6g8Xhq16Q9aPRLtCkC1Jai0U6ZmB/+GVVd6ra6x3OwgMSi2ERM8OELhQyzyB1KxuyHmeUc4aCCzd/av/UCUWE0cgjWk5lk32Mc47AKItHiISfL82ARQk=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fleaf_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"403\"\n            },\n            \"content\": \"eJy1jsFKAzEQhl9lyFm6qLee23vBXoTCEnanbqi7CclIK+LB3ZNP4SsUIVpkbV9h8kbOltU3kJD5Q/6Z+b8nhd5br6ZqZsJmoalaWNNQWNr5zgTChmbGY0HWP87PjReqxFB448jYRsZuHBZmbbAEJ8OwUqXsmWa3eti3xEAZSclrvcHS+JBvDVX2gfJQVFhj5rSXjMtRr0a9zu5Rr/PyN3qlwJ2xgCzgCAZ/9kSoagxB36EQ8RsfIXX8xXv+lPst58h96oBPqUstH/6PUmI/OEJ6kaBXjqItv8tnTK2kC8xpwBIfxNjL+8A9DIWjUEbuJ+r5B1QPtaA=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"197\"\n            },\n            \"content\": \"eJw9js0KwjAQhN8l0Js2tL0VRAR/XqAXT2FJtiS0aUJ2qxbx3V0vnuabWZaZt4rIPjnVq9tlUDvlC45iPHOmXms7p9XtIYd6g8Xhq16Q9aPRLtCkC1Jai0U6ZmB/+GVVd6ra6x3OwgMSi2ERE2FCFwqZZ5C6lQ1ZjxHlnKHgws2f2j91QrAk9liM/KLlVDaZyBjzDIwyeoSZ8PMFphtGYg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fparent1%2Fparent2%2Fparent3%2Fanother_directory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fdirectory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"159\"\n            },\n            \"content\": \"eJwVjs0KwjAQhN8l0Js2qLeCiODPC/TiKYRkSkKbJmS3ahHf3fU0M98cZj4qgUP2qlP3a682KlQMEgJzoU5rN+XFb22J7Wpnj3c7g/Vzp32kUVdQXqoDnYrlcPyz5nBu9reHvYjvQSyBRUyyI3ysZF5R5hY25AISpBYKx7muMs5IZbIMuTPYifD9AUemOQc=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme%2Fdirectory&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_makedirs_without_scheme&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzk0OgjAQQOG7dK30B2gLe+IFvMC0Mw1EoA0djcZ4d1m+1fe+YiOeM4pR3Ka7uIj5oHTGzFzqKGVc8xOvUJbmAzvSu9mJ5UtLXOpD5kIH8JL3Kn0KYeiV1UoH1cZE1hsyqotOA0RoyQ+IXa+Mc72O1iTvAtloQKM1mMwpM21lBabzJcFa6fcHaGoxjg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/8fbb9506101b03cfe682e204c71aaca3e89dd45027751c62f87be6c2a1d62df2?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/8fbb9506101b03cfe682e204c71aaca3e89dd45027751c62f87be6c2a1d62df2?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/8fbb9506101b03cfe682e204c71aaca3e89dd45027751c62f87be6c2a1d62df2?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_mkdir_and_exists.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"140\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxFJbuloQmTchupSL+u+tp5r3DzMf4SpPpjBcp3Fk7xrziHkpo37Agbe1CYl8Hi4FnW4nzWkfiSwHx579rTtfm2D/hpn0gFgXRcGnGUJ1OONoCC5udSSQ+o3497oOiUCoRhNRMEJm+P7RRMaY=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN9loTdtqN4KIoI/L9CLp7A0WxKaNCG7lYr47q6nme87zHzAV5qgBy9SuDdmjHl1eyyhfePiaGsXEvPqjAs8m0qc1zoSnwuKP/1dc7w0h/sTr9oHYlEQDZtmF6rVCUtbYGH1KjrYQSLx2enl4zYoCqUSUUjNhJHp+wMPeDOz\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir1&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir2\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Jt2sd4KIoI/L9CLp7A0WxKaNCG7lYr47q6nme87zHyMrzSZ3niRwj3AGPPq9lhC+8bF0dYuJPA6gAs8QyXOax2JzwXFn/6uOV6a7v7Eq/aBWBREw6bZhWp1wtIWWFi9is7sTCLx2enl4zYoCqUSUUjNhJHp+wMPnDO0\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir2&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists%2Fdir2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_mkdir_and_exists&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_move.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_move\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwVjEEKwjAQRe8S6E4btLuCiKD1At10JUPzS4pJEzLTooh3d1z9997if4wvmExrvEjm1toxpNXtKc/1mxaHV71A7HawbuanLeC0lhF8ziT+9G9Vc6mO3UBX5R4sKqLziGmD2ZkI8cnp//3WqwpiDiTQMlFgfH9YkCy1\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_move%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"135\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02VHcFEcHHD3TjSobmlgSTJmSmRRH/3XF1zzmb+zG+YjK98SKFe2vHmBe3pRLaN80Or3aG2LWzLvDTVnBe6gg+FhJ/+Ldmf2p21zudlQewqIjOI+UVyi7UzmxMgvjs9OZ2GVQFqUQSaJkoMr4/kREuwg==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/move?from=disk%3A%2FYaDiskTest%2Ftest_move%2Fdir1&path=disk%3A%2FYaDiskTest%2Ftest_move%2Fdir2&overwrite=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"135\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02WHcFEcHHD3TjSobmlgSTJmSmRRH/3XF1zzmb+zG+YjK98SKFe2vHmBe3pRLaN80Or3aG2HVnXeCnreC81BF8LCT+8G/N/tR01zudlQewqIjOI+UVyi7UzmxMgvjs9OZ2GVQFqUQSaJkoMr4/kTUuww==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_move%2Fdir2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_move&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOwiAURdG9MNYCLYXSuXEDbuCX90kbayEFjca4dzu8Z3K/Yt45ilHMteYyShnW9MSZ8tJ8aAO/m42rfGmJpdxlyrxTXdJWZMAUHZkWzinfeXiEKbQ6eA/TGxsH3Tm4yLCKMQxKO6NaY3uA/EQ2iJN4cJ0Tjvf1cjuy8iOvVPmQSGvh3x+3kDHk\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/cdbf7a42d770939d9dcbc21c99d4546f8137d7fed60ed88017402465dda9ba6c?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/cdbf7a42d770939d9dcbc21c99d4546f8137d7fed60ed88017402465dda9ba6c?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_none_args.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/4deb67f875582dfa8dd53c5d3b72e8fb49ce7cc1502765175dc3af1183a575b6/668ddef2/nsHIkeXKnaRGpTyn0UiRqaUl8Jt3QPRPLeFAjvpBi81sWp-27VfwQ64jjvznGt8kNwE-ofj0cgVKPtPiYwpOA==?uid=455675172&filename=CsVGRa8itZzMzH19HCCF4ceXpFpwJAUHpCRAqGOb4O6I59R-oDeDyKMqTq8daIAvY89CJ64noQqRebmQ3C08d8%3D&disposition=attachment&hash=&limit=0&contenttype=application%2Foctet-stream&owneruid=455675172&fsize=72&hid=3e96286ac2b9f0703688be31e7dd0843&media_type=data&tknv=v2&etag=747ce618999f04e43b6435ab69d7108a\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 410,\n            \"headers\": {\n                \"content-type\": \"text/html\",\n                \"content-length\": \"177\"\n            },\n            \"content\": \"eJyzySjJzbHj5bLJSE1MsbMpySzJSbUzNTBQ8MwrSS3KS8xRCE4tKkstUnAtKsovstGHKLDRBysHakvKT6kE0cmpIPV2NhmG+HQDZW30oUpBdgI1QHl56Zl5FfqGeoYWegbISvRhFuhDHQoAD8A4Lg==\"\n        }\n    }\n]\n"
  },
  {
    "path": "tests/recorded/sync/test_operation_error_triggers_retry.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"154\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxFYbmtgm2TZiZikX8d+PqnnM292MCozeNCapZGmu7MS1+SznWK80e73qG2tfO+ihPy5C0cAc5ZdJw/LfqcK72twddCrcQLaJlXMpg0phmB+bETjkOA1gcQ3k1GzNBQ/Ll+X5tiyqmPJKilJ5GwfcHzvU3sw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Ftest_file.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzFEOwiAMANC78L9SC+jcObwAShWdYVvpVGK8uzHx+yXvbbLw2Qwmq851sHad71NMLEQTpGsdocWS+AWFdfDe/b3TKBdWS0gBCd0BMfQBIWwdrJrgiI9a4pKf7SR7JtYSfMs3kW78xeQ2O+o9ms8XuncpHw==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader22o.disk.yandex.net/upload-target/20250203T005850.563.utd.b0vsnaqhwycr9e2etn54yhjrr-k22o.23172840\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrSS0uUUhJLEkEABG+A3s=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/copy?from=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Ftest_file.txt&path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Fcopy.txt&overwrite=true&force_async=true\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzU0OgjAQQOG7dK30h6Ew7I0X8AJDOw1EpA0djcZ4d1m+b/O+at45qVHNIqWOWoc1P+OZytJ8aIv8bjYW/bI6LvWuc+GdZMlb1Q4cDoY6j95ZDgzO+zRxS25wJnAP2HoLiAN0CRkmMNAFDGT64EM7WXVSD5Y5x+N9vdyOFH6UlYQPSbRW/v0BSEUwiw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/242980a569621ece4266fbe3a2820ce749361499845f9e4b4045c9ca07c6c3b1?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/242980a569621ece4266fbe3a2820ce749361499845f9e4b4045c9ca07c6c3b1?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/copy?from=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Ftest_file.txt&path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Fcopy.txt&overwrite=true&force_async=true\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUsOgjAURuG9dKz0QQvCnLgBN3Dt/QlEoA29Go1x7zI83+R81bRjVL2aRHLptY5LevKZ8lx9aGO8qw2iX1bzXB46Zewkc9qK7phNjJHhGGQ8rKsjLncbAo3GwLSNdXDwwXm2MC4EH5q6BtnWdBatOqkVMiU+3tfhdqRgzQsJDhlpKfj9AavhMUw=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/9dd0cccde2dea04e123ce8b155af00e07612e2e4524d1e025545633ea17091e7?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/9dd0cccde2dea04e123ce8b155af00e07612e2e4524d1e025545633ea17091e7?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/copy?from=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Ftest_file.txt&path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Fcopy.txt&overwrite=true&force_async=true\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgjAQQNG7dK0UaMdS9sYLeIGhMw1EoA0djcZ4d7v8b/O/aj44qlHNIrmMWoc1PemMeWk+uBO/m51FvzpNS3nolPlAWdJetKPJdWQ7sN6iA0seDFmPFFuqMrXoOXCwFzCA3jlygdvgqe8HA2EAdVIby5yovm/Xe03hLa8oXCXiWvj3B5Y7MYU=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/7db71d415494a754d953d49adf0d94ab0a9ecec46535a977d7ce0c9d22835c85?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/7db71d415494a754d953d49adf0d94ab0a9ecec46535a977d7ce0c9d22835c85?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry%2Fcopy.txt&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_operation_error_triggers_retry&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzU0OwiAQQOG7sNZSftqB7o0X8AIwDGljLaSMRmO8u12+b/O+Yt4pi0nMzLVNUuJanukc6tJ9wpbo3W3E8qVkWtpdlkp74KVsTYJ3oHuPuY85Db0ZlM4jOp9UjgYtRBvJa3I4OACLCAR2NG40SlMEBeIkHsRzScf7erkdyfSoa2A6JIe10e8PeMkw/w==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/7987209cf0bfd503512f6c89d1fb3c47b4be92e8c58774cc7e746386312eb717?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/7987209cf0bfd503512f6c89d1fb3c47b4be92e8c58774cc7e746386312eb717?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_patch.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"129\"\n            },\n            \"content\": \"eJwVjc0KwkAMhN8l0Js2qLeCiODPC/TiScJuSorb7rJJRRHf3Xia+T4G5gNSeYAOxKxohxhSXuKayti+aY78amc2fG4wjvrAypqXGlgPhUz2f9fsjs32cqOT957VHMzj7oMgsIKJTXL0g+u5dzSeSiJjNwMl5e8PhkItDg==\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVkouLS7Jz40vKMovSC0qyUwtVrJSqFYqSS0ugYlVAkWUPNVzFRIVyhJzSlMVlWprAVjPFBg=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"537\"\n            },\n            \"content\": \"eJy1kTFPwzAQhf9K8cJAq56d5BJ7ZmHvwhS59lW1aGLLcSKqqv+da4GBiQUkSyed3t377vkiRjuQMKLQVPpkizuKtaD3cBDmcl2LTFOcs6M+eBbVTYNtI1tlsNJaEbRa6xobqSxWeKi6RgOi9tgp0ug1dqzV1KpO7r13yqoKO4u+IjZx81Ti0KccE+USaGLHL4zP1pkdXx6HlV0t9jTTg2Ael8kWurEoUPUG2o2UO9kZUAbwCcAA8Ooh+nAIv8r43CNLfJjezPbVPnPdsf/2RxYuDgONhQO4A6YcFibov4P561TSvD8F90/rOcByTnS/OYvb7y5hCnEUhkeAn1YIVY2yvn4AIaeY7A==\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVkouLS7Jz40vKMovSC0qyUwtVrJSqFbKK81NSi0CMk2MamsBDR8NYw==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"549\"\n            },\n            \"content\": \"eJy1kTFvwyAQhf9KytKhiYKxfRjmLt2zdLIwnBXUYCPAVqMo/72XtB06dWklJCT0Hu+7dxc2mYBMs4K59NEUe2Rbhu9+ZPpy3bKEeV6Sxd47EjVtC7KtpNBQKyWQS6VUA20lDNQw1l2rOIBy0AlU4BR0pFUoRVcNzllhRA2dAVcjhdgllzn0Mc0RU/GYKfEL4/PpTIkvj2FjNqs5LfhAnmkJAyamG0FsNqEpeOMSXDQ7LndVdag6zYXm8MS55pwsYXZ+9L/KaPQjSZzPb3r/ap7pPhDL/kcvdg4Bp0Jl3GFj8isR9N8l/XVDcRlO3v7T91RgOUe8z5zYbdOrz36emCYLp6MEQKskNNcPzwecmA==\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVkouLS7Jz40vKMovSC0qyUwtVrJSqFYqSS0ugYlVAkXySnNydBSU8kpzk1KLoPzaWgDlExcB\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"509\"\n            },\n            \"content\": \"eJy1kc1qwzAMgN/F17XUdhL557xH6GWn4NoKNUtiYztlI/Tdpw422GG3DQQ66NPPh3a2ugWZZQ1rG7Nr/soODN/ixOx+P7CCNW3F4xgDQf0wgBqEkhY6YyRyZYzpYRDSQQdTpwfDAUwALdFAMKCJNaikFpcQvHSyA+0gdEhL/FZbWsZcUsbSIlZm122eqVDQNXzsk1z2R66OQpyFtlxaDk+cW86pfUkhTvEXTH1jpHQlJMT6ak8v7pnymVRPP3x9WhZcG0nSETvLJd7ogvFL/q/N83aZo/+n8fS09p7x07mwxwdvsca0MkstnMJIJcVAE+4fhJCPlA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_patch&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_permanent_remove.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_permanent_remove\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"140\"\n            },\n            \"content\": \"eJwVjUsKwkAQBe8ykJ1mUHcBEcHPBbJxFZrMCxOcH9OdoIh3t129qtq8j/EVk+mMFyncWTuGvLgtlbl9U3J4tQli1511Mz9tBeeljuBTIfHHf2sO52Z/e9BFuQeLiugMBTVSQpKhIuYVZmMixGenX/drryqIJZBAy0SB8f0Bt5YxtQ==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_permanent_remove%2Fdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"146\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxVYbmlgSbB5lpUcR/d1zdc87mfoyvmExnvEjhztpxzovbUgntm5LDq00Qu+6sC/y0FZyXOoJPhcQf/605nJv97UEX5R4sKqIzFNRICUmGiphXaHehmo2JEJ+dPt6vvaoglpkEWiaaGd8f5AUzkQ==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_permanent_remove%2Fdir&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2F&offset=0&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"72\"\n            },\n            \"content\": \"eJwNxzEKgDAMBdC7/DlDFpdcRUSUpBBoqNgsUnp3u703kN9jEKi/IJwWt6maQgY8LTpkPwjZ8qoQJlQPT8jGy62Ubis85w9RhBb8\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_permanent_remove&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_public_listdir.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"138\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02aHcFEcHHD3TTVRmTKRlMm5CZiCL+u+Pq3nM252MWlJC86c3tMpiNCQVnhSCSubfWxVT9FjK1b1g9vtoVxT531hM/bEFOtTjkYwYJh79rulOzv45w1j8gi4LoTLneI7kpEounoh3BJUcQ1PIMkfH7A93CMNc=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwljsEKwjAQRP8l0Js2qLeCiKD1B3rxVNZkSxbTJmQ3ooj/7oqnmfcuM28zo4TkTWcu58GsTCg4KQSRzJ21Lqbq15CpfcHi8dkuKPaxsZ74bgtyqsUhHzJI2P9cszs22/4KJ+0DsiiIxpjrLZIbI7F4Kmr/QgcF5xxBUC9MEBk/X6GcM/M=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwljsEKwjAQRP8l0Js2qLeCiKD1B3rxVNZkSxbTJmQ3ooj/7oqnmfcuM28zo4TkTWcu58GsTCg4KQSRzJ21Lqbq15CpfcHi8dkuKPaxsZ74bgtyqsUhHzJI2P9cszs22/4KJ+0DsiiIxpjrLZIbI7F4Kmr/QgcF5xxBUC9MEBk/X6GcM/M=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"768\"\n            },\n            \"content\": \"eJy1Ul1v0zAU/S9+XUccu86Hpb2MCUEHDI12DBCKnPgmtRLHqe1Gzab+d5wOtkckBC/2PdfH95577Ec0CL9FHEnlWh59FVdhX4PzkQ9LMezLTlVFp5yXykZPEC2QnwY4XbIB9ELP4PmwsiA8yJAimLBznJzHyTqmHBMe0zOMOcaBpY1Utfoj7ZeCFqaZ+CZ//8BuWjmu3Oawv9u+dtsP7X2/ucZyg7sGdjB+oWXbHrJmx/Tt5eA+2ebtxzN7jcfD9G0XrZJy0LfTzcr0a3pn7vsr0VxcvPTZ2y702Xo/OB5Fk5DqlWsjGe3eFZdaE2DwefJN4BegS5By1v/4dx52SiuPOMELZOraQYhD6IwNAZo9Nl50p5zyoB3i338cF8iCM3tbQaFm55aMJSmLU8IrVkss4ipjS5JKIBlITMokE6TCeZLiLK9YRRORhRFYKSqJUxGXNA94yfKsRHPpUTllesTjlGGcZjmlabwkOQ1varSG3oeu7jTw00y/xfxrJYNVY/hC/6l+cBEOqg5zHI8/AYjB7HY=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Ffirst.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"130\"\n            },\n            \"content\": \"eJwtzEsOgyAQANC7sHeA4aPlHF4AhWqDQQtDo2l69y7a/ct7s7XEO3NsJTqq47wd2+5DLBLTtkB41ASXzyGekCM5rdVfdOTLEomjQCOstKO0AqUF1AYaBZjU8xVOmowtVefB7/M84FWa79Kv7rG/KcE+XxZeKeE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader12klg.disk.yandex.net/upload-target/20250616T160216.245.utd.b3qvdxtb56rs4n8aocc82yrua-k12klg.727930\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJxLrUjMLchJVUjOzytJzSsBAC/sBgg=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Ffirst.txt&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"159\"\n            },\n            \"content\": \"eJwljssKwjAURP8l0J0mqLuCiODjB7pxVWJzQ4JpE3KnUhH/3Suu5szZzLzVSAjZqVZdz51aqVDJSwlA4daYIeXZrW2J+mUnR4ueCOa5MS7yw1TiPNeB+FAswv7nmt2x2V5u9iTcEUMKJPoy31Mc+hQZLlaxfyHgY2VoLJBx0FiSBckdbxPT5wsrwThG\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Fsecond.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"127\"\n            },\n            \"content\": \"eJwtzEsKwyAQANC7uI+OxozRc/QCiqZpUhI/E7CU3r0Uun7w3mytaWGOrUS5OSGu/Dx9TBVh4/HRdv7yR0ydH4mc1uPfB/L1nkgoUBOgxJtEUHLmagR+UeQhhK1gsdZE05epdI255nYO++9VYOyMaNnnC3f1KBs=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader60j.disk.yandex.net/upload-target/20250616T160218.230.utd.bbbjq6q997d7xf5qx46prpso-k60j.20798669\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrycgsVgCikoxUheLU5Py8FIW0zJxUAGVuCHI=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Fsecond.txt&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"160\"\n            },\n            \"content\": \"eJwljs0KwjAQhN8l0JsmqLeCiODPC/TiqazJlgTTJGQ3UhHf3RVP8813mXmrGdlnp3p1PQ9qpXzFSYpnLtQbY2Nubg0l6Bckh4tOyOa5MS7Qw1Sk3KpFOhRgv/+5bnfstpcbnIQHJJbCEmNp9xjsGAOxC1XsXwgQ2pyc5oVlnXEuERjlzwSR8PMFY484mg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Fthird.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"130\"\n            },\n            \"content\": \"eJwtzEsOgyAUAMC7sBd4VPmdwwsQQWwhSOGZaJvevYt2P5k32VpYiSUbYu2WsaPm3fnQlE45Un/viV6u+HDSEtCO4+0vBnQtBmSCi4lLkDNILsBQDYoe6KnBZ1lfISufHovbl4i9TqfBa0i/WnHQI5DPFzIMKrU=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader78klg.disk.yandex.net/upload-target/20250616T160219.817.utd.9tqnfzel7dkjcaocgtsp5x9ty-k78klg.701841\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrycgsVgCikoxUIM4sSlFIy8xJBQBc9ggR\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic%2Fthird.txt&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"159\"\n            },\n            \"content\": \"eJwljsEKwjAQRP8l0JsmqLeCiKD1B3rxVGKyJYtpE7IbqYj/7hZPM/PmMPNRE3BIXrXqdu3VRoUCo4TAnKk1xsVU/dZm1G87e1j0DGxeO+ORnqYApVoc0ClbDseVNYdzs+/u9iK+B2IJLDLk+ojohojEHovQP1jrgMVrXljGGaYcLYPcGW0k+P4AKp44OQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=500&sort=modified&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"3976\"\n            },\n            \"content\": \"eJzNlmlPG0kQhv/LSPGXAO77sGStEnJgzgRswma1Qn1U2xPbYzMzNoYo/31rWBLYKAFyrSLNh+lRT3VX9fs+1e+z+mIOWSeLeZmtZacw9RAjxKzzPpulVEGddchaNsmnOb5Jgu/1rHaTrMPXsryGaZV1/nqfzV09wiDtlJdVvVGvaox1HTjlE8BR4ab/jm4mhBJc3SyVMcLkOlHrVPUp7xDWoeoxIR1CcNZ0FvOU3zutyi8xPpX4Qz6F0+vFa1jV7fnE5UUTKUr8BImopFWS3AluVABnbATJo7eWenBNrJFjUuFcxyKA0N4ppoxlMjqrtSTOa8G8S0onwoAlL0UAxqOwNnmlnPSEMWYJx1jzhZ/k4XQMF00CL+zupTwYx+V2NVgtjkeb1WhvfFIMdkgckMkQzmD5hvvxeGWGZ3J6+HRevSqHW/uPyx2yXF28PWtvKz+fHl4cbM+KPj+enRTP3LDbvVlnUeLRZKO6nleddvvCxXyjGrdju/d6/2DE+mF0tDNmr5tiQMzdxzLFWVhMoWgOpYRqtigDnOZNxYWUSkuqWcdaiIK6SGli0UKToQdrXOBaeiyjd5JQR7mwjERNQzKSGxdJFIGpyMRV6GVe5bMCjwmLSLSx+K8VlmjUwmzabABXrRrpXWfzcTM/eyfzMl+i9H5R/A9rGazyhHngmyvqfJmXi+q0ql29wOyyMAHX6PHKGTeHFWfnxWTmIpQbMa/GGxeuiLDaKBftZtjmQXIfOaqQGJDBcW8DCEYJoQLF6Rj13lB88QlSAkeY45om5ZWMIIJpKyOJABrbRbXVG8PJTuEOX877FwUZ5IdnJ0912s3PisMd2fd/bo0uN+H5OAx6ZO9cbg1G4sl6bz7LRd9Evnxe1U98NRjzlztVjx2E3d2lGD7iz/D5Y5HHLmk1qTWO737yewuTmM+qvEYBdF1duzBqDrw1ctWo27riC/4XZkXdyKDRZbcx7yP24sq+LSwOlKfX0Ruzd6lsjXCo0J+aCGlYUEyawKRkwUlLo6feRte6UXr3o85b9bhYdpe8BTXa5wFEWOZwXp2G2aJoePhh7YZ4FeCe413I+8+Mu5hnHsY88xnzGL+XeYkrwNyAC+85EUQETNUIlhi1AhjcZp7GsZVaKeqFxGoGQSNhJnjNeUouMa9DhMSSE4xw7RNWWUglYozGUwm/D/MkeTsoD4+398148Pr8O5gnqYhoGMUsAOqLEGGDMARCdJpBCgw/YZEIIxTBIJJIUXCKFSHeEB/hy8yzTGlFv415P2EndzLvh+P/GuYh0UzSllmPQiSCB2ukp8Q4LU3Tf63iyroUOXMkIXo5IzoGoFKBB0H8Pcx7Y9+evdsZXqrhZnnWO1p51x8Yt/dqBnsnR+NptS2e9XqrFRwmmGwepXdb575Yri8LIC8rF175rzDvxvA/H3qMX0HPO2YdIKB8JEaD8lQL6xyeYHA6WLgfeg9AwtehV4/y8k7m3Z5wB/IYeRDybk27Rh67F3kBG3dEpjsVuBLYF63XEtNlELBR6HAbeVEbgS0AR3hzE1wHDvhFkWRto3dpTeAJjDaJYGvgSWqwMQiLnYc4beXvg7zJc7bc26+2z14cP9sbfgfyAkcSEIPmZuDximM1NYzGpABvHcJpvFe4QBP2VuwNXnKdOEFvGpp0MJrSLyJPUKkJUuWbkPcTdnIn8n44/i9CnnBAmUDZsURwGz5wKblIQIAjlqP1MhKKd1GGdpXKYkcOlGrKnRYQ+H3IGxxM+7t5sd0f0sM3u4O9lX16utp887buTbaKunzn2RO99XJ4sv9UEXPhX/OjlPb6K++TVc/XXzz5CvI++f0XEI9dEc/YxBQoIRQPUTAQeEfnePEQFIJ20d9PvAcQ4TPi/f1/+frDh38A0cXQgA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&path=%2Ffirst.txt&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&path=%2Ffirst.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"505\"\n            },\n            \"content\": \"eJxFkduOmzAURf8lUnhrMDY2MBKqkrklIdNUKEzTvoyMbWILMBc7DKTqv5dpK1U6L+c8bK191s+F7EWxuFtIa1tz57q8eddVQ7noV1yZcjVRzcW46q/ux+pCRnzPy6OcBjmmJAoQKjD3AigIhBxEoOAQQMRFiBEKKfCY5zEQEBRRQrjALgkx8IUnXG22u1KcE03T5/Y0aZCptDtvguKgOp0m+JR/38rbvXgsWbYDL+94m0l//WnXNso/hRwNj8auc5OV6DkxO3hkh8PgX5boYZ7PV8Vj4BSqEprWIi5Ub+zKjtaZS7SNUVY1OqbWUiZroa0jqZExfIoON3ws+bA32Xh9lfdGvpRnnSWAZ6C6iE4M31BelmN46XCdblrztb9svyzhpk/AME4/OndP8rZOp+O+0Sf02pz1A/3HtERr9z9HpWplZ0TWaDsDvNmpFbEVo13Cp7aiSjuzB9G/fRTxMSYBnn/sFEbdROxhR85n4gd5AHwczk4gDhnEGDKKI4/nsyBOnVpwRf8m84Zd/xS1pR7iAS1+/QYSrqbv\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/2c6411b9ba7b5a69733f5d172e622d090fd2023de85338a01c11c07639a66de5/68504e1e/nsHIkeXKnaRGpTyn0UiRqXB7fLiqnRK5TbYHhzCeEkcUI0Mw5HUh4A-Ipoi4T8d3vEstAbsUk3GKsI2OcLLv4g==?uid=0&filename=first.txt&disposition=attachment&hash=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D%3A%2Ffirst.txt&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=15&hid=647b704582c6258c2552ca591db1b9da&media_type=document&tknv=v3\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJxLrUjMLchJVUjOzytJzSsBAC/sBgg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&path=%2Fsecond.txt&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&path=%2Fsecond.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"507\"\n            },\n            \"content\": \"eJxNkctu2zAQRf/FgLWrRVEiJQYQisZG4kfdGH4kRjYBKY4kRhL1IK3ILvrvVdouCsxm7uLinJmfk7yDdHI3ya1tzJ3ryvpDlzWX0M2kMsXsyrWEYdZd3M/VlZQLliSCpShMcQhEksgjOJIpixIcBNjHRCLGGRKChNyTns8pDUjIkpBSyl0aERSAl7raLFcFnDea7x+b41Wjk9q3L+y1fd9kN5rNu3Z1GAQ/niK+3dWwPR+KyqyDxWo1DLBPoZwf0vflh9D9l14DejQ82Yls6i/G+XpRMkZOqkrQvILYQFJrObODdUaLpjbKqlrH3Fqe5BVo6+Tc5DF+YN9v5KmQ/dqchstzPjf5tjjr0wbJEyozaKF/8UVRDFHWkmp/35hdly1/TPF9t0H9cH1t3TUVTbW/Pq1rffSf67Ne8H9QU/+b+x9IqSplR8gxsCPBm702EFsY7BQ/NCVX2hk/Ad3bp0pACA2JF2InNeoGMfadfIwFx4yDFExIFIVAhRcGjI9HpwkPEwZOBVLxv82yTi5/TG2h+7j3J79+Aw9Kq1w=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/d6ab9ccb9f07f27e5d581528df98c2442325d09a90bb57a1d13a664579c7666a/68504e1f/nsHIkeXKnaRGpTyn0UiRqW9ZqjKgz6gCrqISxbaTU8aMPoeMXSkmsJ4DIIxxeRfelCSfjHwbnv-vne0GsacPbg==?uid=0&filename=second.txt&disposition=attachment&hash=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D%3A%2Fsecond.txt&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=23&hid=ba29aedb9bd087e6b1749aa1d6ca7c9e&media_type=document&tknv=v3\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"23\"\n            },\n            \"content\": \"eJwrycgsVgCikoxUheLU5Py8FIW0zJxUAGVuCHI=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&path=%2Fthird.txt&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"15\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKy8xJVaoFAClzBR0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&path=%2Fthird.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"505\"\n            },\n            \"content\": \"eJxFkW9vmzAQh79LpPBuwRhsoBKaknZpmj/NxqCJ+iYy+AweYAg4FDrtu49ukybdm7ufdHqeu5+zvAUxu5vlWjfdnWny+k2VNePQLrjsisXIFIdh0d7Mj9b0uQ+ECMS5JTyXAicJIRQTNyE+saY09VNB3RQ4TogAQMwGTFPXxuAC9sCkHkEOYGSqbvNUwHmnWPjYRKNCsQyv8bGK9lJto8wKT/v4MPiry3B/etVP5Ubp9keCl+7mMTs/ryjyxuSb/V2IQzQkifDpl0/rZTa3H6b6fJM8QIaQJShWQaBz2fKFHrQxSTR1J7WsVcC0ZmlegdJGzro8wGt//06OBe+3XTzcXvL7Lj8UZxXvEI9RmcEV+pOdFMXgZVdShaum+9pmm+c5XrU71A/j69Xc0qSpwvG4rVVkv9Rn9cD+Mc3tpfmfo5SV1BNiWis9AVz02EyYMOg5Xjclk8qY/gDt5UPEmS7sEsvFhujkOwQYG/k09nyBKVDHoXbKHQwOdyzbd4hjQeoynhgVcMn+buZ1evsjqgvVB709+/UbQqyoVA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/9d9e55f0dd1f876ed5b556257b59519d9c9cf67ced2b5fee0a3e26c732e7e28e/68504e20/nsHIkeXKnaRGpTyn0UiRqUOmTLinJTg1RWLUMx9B_xCWZtIlHntrjb2A7HGgXNB608ybQ3SffMTxbbf96E-FAg==?uid=0&filename=third.txt&disposition=attachment&hash=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D%3A%2Fthird.txt&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=22&hid=89f26e64463cd42e4d41394541ec7adb&media_type=document&tknv=v3\",\n        \"headers\": {\n            \"connection\": \"keep-alive\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"22\"\n            },\n            \"content\": \"eJwrycgsVgCikoxUIM4sSlFIy8xJBQBc9ggR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/unpublish?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir%2Fpublic\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"147\"\n            },\n            \"content\": \"eJwljsEKwjAQRP8l0Js2qLeCiKD1B3rxVNZkSxbTJmQ3ooj/7oqnmfcuM28zo4TkTWcu58GsTCg4KQSRzJ21Lqbq15CpfcHi8dkuKPaxsZ74bgtyqsUhHzJI2P9cszs22/4KJ+0DsiiIxpjrLZIbI7F4Kmr/QgcF5xxBUC9MEBk/X6GcM/M=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=2F9Lz5OkdvJsUxuVhCshMkXnUK0dU0lgeqevW3bkkx8gq5mRBpsPrgHN%2BrK0vxyZq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_listdir&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzk0OgjAQQOG7dK10Sn+g7IkX8AJDZxqIQBtajcZ4d1m+1fe+YuM6JxKDuI13cRHzwfGMudZcBinDmp50xbw0H9yJ383OVb6UpKU8ZMp8YF3SXiQF5gDQ6eAdaCTbeYDJOG9N7wDt1PYQWVHnJw1WGYutU9GhMr512ttTrrzlFSufLxHXwr8/QQIwSA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/dceec0073c9603ad57900b46954860a5b280fe1d79b305145a261f6a14926395?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/dceec0073c9603ad57900b46954860a5b280fe1d79b305145a261f6a14926395?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/dceec0073c9603ad57900b46954860a5b280fe1d79b305145a261f6a14926395?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_public_settings.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"309\"\n            },\n            \"content\": \"eJyVjcFKAzEQhl9lyFnae8/tvWAvQqGsu2Md1E1IRlDEg7snn8JXKEK0yNq+wuSN/LfoA0iYyZDJ/31PjmP00c3cXNLNstLrpZdW08ovHiQptzqXyLX6+Lg4fTxzDac6SlDxLWLngWu5Em4oIExr14Azm15UI2/FSaeKtgn3l7dSbxKrSrtNa0fh5CH1xL8mav5UE2juOKVqy1DYmx2o9PZlO/tEfeMcbCg92bH0pbP9P7TgfFim8oLkq2Xcnb3jMZcOONCPowd7wmKHeW8Djc0ytNmGiXv+AcSZkZg=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_public_settings&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"139\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4btLuCiKD1At10VcZkaoJpEjITUcS7O67+f2/zPmpFdsmqXl0vo9ooV3ARcMyZeq1NSNVuIfv2DdHiq43I+rnT1tNDF6RUi0E6ZmB3+LumOzX7YYKz/BGJBVhmzvUWvJkJmX28k4QY1xyAUdILBMLvDxFuMU0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"770\"\n            },\n            \"content\": \"eJy1kt2O0zAQhd/Ft+3iv8ROLO3F7lagVqKIpZQWhCrHdrqmcRxit0tY9d1xCogrhJDgxp6xP52ZOfYT6GR8AAJoGw4CbuUs7SsTIoxp2XXHqrFqF0yMtt0HMAVx6MwF71PSSjcmv0FVb2Q0OgEEkfwKsSvMVhgLQgTBE4QEQolyXtva/hH7IX8wQwJD8bhYb3QVPlVxWQ138fYO+ZuvzcvNZH6bQT15v5q/eD13p5ulfW6hLCa4braSou3m3duMLT/DBas6dz+8Wvh2Rdd+087k/vr6V51j36Q6DzF2QUA4SG2fhQPUUOn5fnaPDsMbd1w/Jn5nXGW0Hvt/+lsvG+tsBIKgKfB1nS6ASGHwfQrA6LWPsrmc2WhcAOLDx/MU9Cb4Y6/Mzo6eZXnOeI45EZpWmnHFuKR1WWKkKNaGsgwTnhmKs6xUJi9qznSRK1YXisoKI1RLyiVjqgSj9MkG61sgMM8R4pyhEiHCcpxe0ztn2piqhsuo36f52cy/7qTr7Sl9nv+kn1w0X2yd5jifvwHASeqs\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/public-settings?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVipILC4uzy9KUbJSUDI0MjZRqgUAR9IGGA==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=https%3A%2F%2Fyadi.sk%2Fd%2FcdIgDR0kySmuVw&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 403,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"122\"\n            },\n            \"content\": \"eJyrVkotKsovUrJScskszg6uzM3JzMsOSCwuLs8vSglKLSzNLEpNcQUr0VFKSS1OLsosKMnMzwNqgKlSKIIqA6rITS0uTkxPBcpeWHSx4cLWCxsvNl/YerHpYuPFfoUL+y9sAAruu7D7Yo9SLQCU7TbL\"\n        }\n    },\n    {\n        \"method\": \"PATCH\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/public-settings?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrVipILC4uzy9KUbJSUDI0MjZR0lFQSixLzMxJTMpJjS/NK8nMAUoZ1gIAHrUNXw==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/public-settings?path=disk%3A%2FYaDiskTest%2Ftest_public_settings&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"21\"\n            },\n            \"content\": \"eJyrVkosS8zMSUzKSY0vzSvJzFGyMqwFAFhtB9Q=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2FcdIgDR0kySmuVw&offset=0&limit=20\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/unpublish?path=disk%3A%2FYaDiskTest%2Ftest_public_settings\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"139\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4btLuCiKD1At10VcZkaoJpEjITUcS7O67+f2/zPmpFdsmqXl0vo9ooV3ARcMyZeq1NSNVuIfv2DdHiq43I+rnT1tNDF6RUi0E6ZmB3+LumOzX7YYKz/BGJBVhmzvUWvJkJmX28k4QY1xyAUdILBMLvDxFuMU0=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_public_settings&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_publish_unpublish.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 409,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"313\"\n            },\n            \"content\": \"eJyVjcFqAjEQhl9lyLno3bPehXopCLLdndZguwnJCC3Fg7unPkVfQQpRka2+wuSN+q/YByghkyEz//d9GA7BBTMyYxtX00KWU2driTM3ebNRuJaxDVyKC++T6+KdqTiWwXqxrkbs3nNpnyxX5BGmuanAGQ0fip434yhDQVn49eOLjcvFur51c0P+aiJxxDcXVX+yAUSvHGPxzJDol54pt3rSnR5wf3DO2uWW9JLb3OjxX2KQ9poob5H91IS30W98ptwACP6lN2FOGOzQH7WjvmiCOGk3MJtf0MSTWg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"141\"\n            },\n            \"content\": \"eJwtjUEKwjAQRe8y0J02qLuCiKD1At24KmMzJcE0CZmJKOLdHcHVf+9v3hsWEpcsdHA5D7ACV2hWcSKZO2OmkKpdY/btC6OlZxtJzGNjrOe7KcSplon4kFHc/vc1u2Oz7a94Uh6IRUV0xlxvwbMba/yTpoSWHFBI4zMGps8XeWMyLg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"776\"\n            },\n            \"content\": \"eJy1Ul1v0zAU/S9+bUv8lTixtIdCQWHaYJ0KWotQ5MT26jWJk9htKVP/O04B8YQQErzY51rH59x77GfQCb8FHEjjdjxai0XYV8r5yIel6PZlbdy22Lc/EJgCf+rU5cIQilY0Y/FbcjUo4ZUMFAxxPIN0hrMVopykHNIJhBzCwGqsNNr8kXaRrYqdOgWiejnp7vL89u5GLyJdfziuF5OH5SZ7t6F5jx6f+uU2fb3OyY2Zv7olqZuzFe2Wb6z42uG8Pxz76Dopu+b+9P7ativy0T60C/F4dfXLZz/UwWfrfed4FJ2ENC/cLpIR3t0fnjZvZz05knoe+IVqSiXl2P/z3+dZm8Z4wDGcAqu1UwEH6OwQABjztl7UlzPjVeMA//T5PAWDcnY/VKowY2o0jhMWI4a5RhlOM1RphhKSVJKWqIJQJJJqoQRCKJZxylSpqcjSJMUlUiXNCGEQllTIBIzSB+OMbQFHLIaQpQQncZwxhsJ72qZRrQ+u7jLs96R+NvOvO+kGcwjf5z/phxTVF6PDHOfzN6yv7Tw=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=eB%2BpPHHMPLfD%2FflUwYD%2BXQZ9NZ4Hq1gjqQh8EYH3LiACM38sA7T4pQFoazp2Hqvwq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2F2kRvjZI-q3w3lA&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=eB%2BpPHHMPLfD%2FflUwYD%2BXQZ9NZ4Hq1gjqQh8EYH3LiACM38sA7T4pQFoazp2Hqvwq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2F2kRvjZI-q3w3lA&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/unpublish?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"141\"\n            },\n            \"content\": \"eJwtjUEKwjAQRe8y0J02qLuCiKD1At24KmMzJcE0CZmJKOLdHcHVf+9v3hsWEpcsdHA5D7ACV2hWcSKZO2OmkKpdY/btC6OlZxtJzGNjrOe7KcSplon4kFHc/vc1u2Oz7a94Uh6IRUV0xlxvwbMba/yTpoSWHFBI4zMGps8XeWMyLg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"624\"\n            },\n            \"content\": \"eJy1kUFuwyAQRe/Ctokyg8HYrHuEbKqqssAMCqoxliFRqyh3L47aZVVVajfwBz2G/4crW0w5Mc1cyK/68GQe636kXA6lLsNytlPIp+E8fyq2Y+V9ofuFtRaziVvxLTyuZAq5inDgcg9iz/sjCt10GsQDgAaoVEwu+PAjNlC05NzGXX/vewoxFKY57FjyPlPVVea0VsG2XKmY6X4WCsXM9PPLbcdWyum8jjSEzZ2QslUSFdcee971OHqFbdOOTlgcAUzrhDdkEFE62SmyXpi+aztukazom0YBWGFcy7bWl5BDmplGJQFU1/AeOVcC69xSjDSX+mq+h91SjMOXmb92sqzhUr/pn/rXKdJb8DXH7fYBhoG7Uw==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=eB%2BpPHHMPLfD%2FflUwYD%2BXQZ9NZ4Hq1gjqQh8EYH3LiACM38sA7T4pQFoazp2Hqvwq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2F2kRvjZI-q3w3lA&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=eB%2BpPHHMPLfD%2FflUwYD%2BXQZ9NZ4Hq1gjqQh8EYH3LiACM38sA7T4pQFoazp2Hqvwq%2FJ6bpmRyOJonT3VoXnDag%3D%3D&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources?public_key=https%3A%2F%2Fyadi.sk%2Fd%2F2kRvjZI-q3w3lA&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJwdijEKwkAQRa8ybC05gLVaWngDSUZZxB2Z3VQiJKYR9ArewcJFg0SvMHMjR7v/33t7h8zEbuwmPm7mlGZUh2r6ZyNXYSzZ75KnYMUCI9VcIgRKsPp1hTVbjHG5RvNylQzayV1u8pK3tnoBGez0epQnyMPmRxszJ8kmBj1LDwaypZ022hbu8AXBiUjR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_publish_unpublish&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_remove_trash.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_remove_trash\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"136\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02aHcFEcHHD3TTVRmaW1JMmpCZFkX8d8fVPeds7sf4gsm0xotkbq0dQ1rdnvJcv2lxeNULxG4H62Z+2gJOaxnB50ziT/9WNZfqeO/pqtyBRUV0hoKYNgxSiL3ZmQjxyenP49apCmIOJNAyUWB8f+cvMA0=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_remove_trash%2Fdir-to-remove\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"152\"\n            },\n            \"content\": \"eJwlzc0KwjAQBOB3CfRmGtRbQUTw5wV68VSWZkuCSRN2t0UR390VTzPzXeZtAuFkOhNEKnfOjaks3kKN7Qtmj892RnHr1vnID0fIZaER+VhBwuFnzf7U7K53OGvvkUWHaAyEuaw4CAEHNR/JSrF/NRuTUULx+nu79DoFc00gqDJBYvx8ASNYNbQ=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_remove_trash%2Fdir-to-remove&permanently=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2F&offset=0&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"696\"\n            },\n            \"content\": \"eJy1kt1KAzEQRt8lt7Z0NpufTa59hN6IyDLZzNrgbrdk06KUvrvTWoUK4o0SSAg5+eaQzFGUtx0JL2LKYiFaGgPFSFH4o0iFxln4x6PY4nhllmVaZhqnAzFNr6ln8LQQXSYs51tCglRLsEsw68p5WXuwdwAegPlIA/1EuS9qyuk5bdsdls2l5vziVw94z+ua5rIqPLUfCm3JOG9W37XGKaY+/Von0zztc0dtOpNKa2N1ZaXHTvUksavJKd0FVauAlmytySqQAbWV0cpaKhmaoBQGiIYAoQctJaHj6Kv7Rc/f+rUS+6YxPGyFVVOhsY0NnGwsGiRXY3CgKxc5ppvGkbaFBefzf+xyOvArt5/if269D0Pq/imem+Sm0zId0pymrfAcD9LVtnGNsZXRpydGp4IDHy3EkMZUhNcA3Bl9PxNv4HR6ByvGy9E=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir-to-remove_2af88686871a181a6787b74067a6ae93ab90519d&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir-to-remove_2af88686871a181a6787b74067a6ae93ab90519d&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_remove_trash&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_rename.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"130\"\n            },\n            \"content\": \"eJwVjUsKwkAQBe8ykJ1m0OwCIoKfC2STlTSZFyY4P6Y7ooh3t129qtq8j/EVs+mNFyncWzuFvLotlaV9U3J4tQlinzvrFn7YCs5rncDHQuIP/9Z0p2Z/HemsPIBFRXTuFYkizMZEiM9OH26XQVUQSyCBlpkC4/sDtpYtdg==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir2%2F&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4bqruCiKD1At24kqH5JcGkCZmpKOLdHVf/vbf5H+MrZtMbL1K4t3aKeXVbKqF90+LwaheIfXbWBX7YCs5rncDHQuIP/9bsT81uuNFZeQSLiujcKxZKUHOhdmZjEsRnp0fXy6gqSCWSQMtMkfH9AfReL4M=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/move?from=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1&path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir2&overwrite=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJwVjUEKwjAQRe8S6E4brLuCiKD1At24kqH5JcGkCZmpKOLdHVf/vbf5H+MrZtMbL1K4t3aKeXVbKqF90+LwaheIfe6sC/ywFZzXOoGPhcQf/q3Zn5puuNFZeQSLiujcKxZKUHOhdmZjEsRnp0fXy6gqSCWSQMtMkfH9AfSCL4Q=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir1&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"145\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh8KF7UDm/osNQJmOC1uBEnsvdl/YqQAU2ApU2nyx4WKjnpKOUkpqcXJRZkFJZn4e0Myg1OL80qLkVIW8/BKFtPzSvBSQmtSiovwioKxLZnG2X36JG0jcFSxWCwATl0jR\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename%2Fdir2&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_rename&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzU0OgjAQQOG7dK0U+kNa9sQLeIFpZxqIQBs6Go3x7nb5vs37iuWkJCaxMJc6SRm3/MQrlLX7wIH07g5i+RokrvUhc6ETeM1HldhD9BhdSNiTGq0ZE4TkndIAUUGEBM7YocdgDBrvnR6s0075QForsuIiduIlY3vf5ntLpr1swNQkwVbp9wfWITH9\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/d0ac9dc8bfd0e26546fabf9823aac2acafa84510db44d499831583829be332e5?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_restore_trash.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxVJZmyxbTJmSnooj/7nqaeY+B+TgpPLrGCZC18X6IaQ1bylP9piXwq14Y/rnzYdKHL6xpLQPrKRPk+HfV4Vzt2ztdrHesMIBFb1Okwj0KqbiNmxmSgh3drp0heM6RwGZGisrfHxzpMIM=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash%2Fdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"143\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxVJZmS4JtE3anooj/7nqaeY+B+bgoPLrGRaBo4/0w5TVsqaT6TUvgV70w/HPnQ9KHF9a8ysB6KoR4/LvqcK727Z0u1jtWGMCitymycA8hjSZDErdxMyPmYHe3a2cInstEYDMjTcrfH0IsMl8=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash%2Fdir&permanently=false&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2F&offset=0&limit=500&fields=type%2C_embedded%2C_embedded.offset%2C_embedded.limit%2C_embedded.total%2C_embedded.items\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"667\"\n            },\n            \"content\": \"eJy1kstOAzEMRf8lW1rVzuQxZM0ndIMQGqWJAxHzqDJpBarm33HLSywQG8jCUeTjm6srn0R92ZNwIuYiVqKjYUcxUhTuJHKlYRbu7iRGP3wx9JwTt5eVCIV8PbNCglRrsGvELVqn0Em8AnAAzEfq6SdKflJTyQ957Pa+Pl5+mp/c5tbf8L2luW4ql65wmQp1tfj5cfPmZphiTvlXeR6dDiVQl8+k0tpYjVY68JYPGYnGQtMgWU9SGalCUgZRq0gesPXSAxiKqK3yCKh000opE7H0u+WLKXd21bVWshoEHVTCRBoshsYno4IPlKIyprXG28DDYRoGGivbms+R70s+cqTdh90/93rY9Tn8kzxvxLdlKnTMc55G4VieM7g2rWykRQPLPaNT9T23VqLPQ67CaQBeg5Rm4gcsyyvFkbyC\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir_8726700c5c4f1fe5071c3af64cacefd466876a7c&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir_8726700c5c4f1fe5071c3af64cacefd466876a7c&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources?path=trash%3A%2Fdir_8726700c5c4f1fe5071c3af64cacefd466876a7c&offset=0&limit=20&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/trash/resources/restore?path=trash%3A%2Fdir_8726700c5c4f1fe5071c3af64cacefd466876a7c&overwrite=false&force_async=false&name=%2FYaDiskTest%2Ftest_restore_trash%2Fdir\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"143\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxVJZmS4JtE3anooj/7nqaeY+B+bgoPLrGRaBo4/0w5TVsqaT6TUvgV70w/HPnQ9KHF9a8ysB6KoR4/LvqcK727Z0u1jtWGMCitymycA8hjSZDErdxMyPmYHe3a2cInstEYDMjTcrfH0IsMl8=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash%2Fdir&fields=type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"14\"\n            },\n            \"content\": \"eJyrViqpLEhVslJKySxSqgUAJDMEvA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_restore_trash&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOwiAQQNG7sNbSAezQ7o0X8AKUGUJjW0hBozHeXZbvb/5XxIODmESsNZdJSr+mJ51dXrqP24nf3c5VvkDSUh4yZT5cXdJepFI+kEUwaBXAMATCcfYMaC+NI7FRpE0wI3vdQ7AEFrBHPbNmVNaJk9i4xkTtfbveGytveXWVWwluLfz7A19PMMA=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/22cfd87147821166fd79bce17851169de42d34f49ec301f8d1817073be3e728a?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/22cfd87147821166fd79bce17851169de42d34f49ec301f8d1817073be3e728a?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_save_to_disk.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"136\"\n            },\n            \"content\": \"eJwVjcEKwjAQRP8l0Js2qLeCiKD1B3rxFJZmSoppE7Lbooj/7vY084aB9zUTJCRvGvO4d2ZnQsGgEEQyN9b2MS1+T3msPzR7vOsZYteD9SO/bAGnpfTgSyYJ522rTtfq2D7ppr0Di4JoOKYVTpLbPmoRTDmSQL0DRcbvD3lAL/k=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk%2Fpublic_file.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"130\"\n            },\n            \"content\": \"eJwtzEkOwiAUANC7sO9npsA5egES6CAEkX6MQ7y7C92/vDfZe1qJJztiOz2lo5VriKkrm8sG8TgzPEON6QE1oVdK/sWEoW8JqWBCM8PNwrWWzAKTBgZGcPfxKi5vc2n1GHq+oBN83dfblH/1zI0Ulny+Gv0p3A==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader48klg.disk.yandex.net/upload-target/20250616T155308.036.utd.9vuzl9kg7lpniu57jt921fhfq-k48klg.716328\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrSS0uUUjLzElVSM7PK0nNKykGAEGtBw8=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/publish?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk%2Fpublic_file.txt&allow_address_access=false\",\n        \"headers\": {\n            \"content-type\": \"application/json\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJyrViooTcrJTI4vTi0pycxLL1ayUqiurQUAa34I3g==\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"154\"\n            },\n            \"content\": \"eJwdjsEKwjAQRP8l0Js2WG8FEUHbH+jFU1iTDQmmTchuSkX8d6OnmTcMzLzFjOyiEb0Yb5PYCZfRVnDMiXopdYjF7CH59gWLwa1dkOV6kMbTU2akWLJGOidgd/plzfHSdMMdrtVPSFyBqyiCFRVH9e90QyqP4LWyPmDLG9ddxjkFYKxPLATCzxcZ1jai\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk%2Fpublic_file.txt\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1317\"\n            },\n            \"content\": \"eJy1VNty0zAQ/ZfM4JfSWLJ1c2Y8TCBtCeXWkJaUl8zKkohIfKkt51KGf0cKlM7AAy8w47Gt1Wp3z+45+jpowK0Go4Gy3XoU38LEf+e6c7Hzr2UHW7109TLsxk0vN7ZYGrvRQ7d3g6cDd2i0PxssflVBGVZ/uhWtBqeV30tQQk8RO8VsjpMRTUdInCA0Qsh7lbWyxv7VrbP3PgsW/oAtfXE/SnB67+JmA7YKkRT1JpFhWaiUI8RwBoZiiqXJqBQpMyaTOMRaQUKZ9y2IgYwJ4IRSwQwAoBQhSvwpI3EBRlGdgU6oASZxyqFghHOOqVGFwMdYP2Gv9cHHu32+7y/ev9Mf3k77Hdvcv3dnN2t8//IO7T6O38BhdaK2i+kuPbtSJ+a16LBe6PL+4vnY9ERV4+ld/IrJppwd3r2qq3l6Uy+qCXzO88c8fbvxeVbONd0ojg+g7NCPSMX9F9rR2afJ/qYVZ59DM7Sy8NAmVRd9qaswlFZ3dd8WemlDxz1uxinmySjFCpI0Q0wIYiTTicZKYArGUEWA60yngiUFB4UNlylhSiCqJcGMmQISdQy9tZ2tKz8mThHiIhUio0hg4rlQl6EAn7UbjL4+oHko5l9X0rR266n3n+J/ezrQe2s8Dv8HlbNb2/bdsnPg+i6waqMh8PGoj8dhqXpXbWpQuh0GXQ0PUCm9H7Z9fJSZEZykvFDUFAXXnIpMpBghjAQkSUYEGClZohXRIEBIkBQo8piMAEKQkjETFBFpaFx1L6drvbisYHbRzA8VurazuzlvJrevS3Z9ysg5//BGvB2fczWdL67WO0fRdTVuzTk5XffkxrVTWL+w0xkVlxjvx1W9vYLxk3Tin2e9VfmvXkYBYtB//pv6Iw+pqTvrPB1ycA6KVRh/tIJulUcbW1qXo6ioKxdIEViaByk/Sc6PYo58q3S7/C1XuAJyLKKVN8ssoxikRgnXyBijEuVHSjOCITFao+iR//kD+yO3rrb5No2086L66z3x7TuucJio\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk?public_key=https%3A%2F%2Fyadi.sk%2Fd%2Fuj5s5RZDxVr8Eg&name=saved_public_file.txt&save_path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"160\"\n            },\n            \"content\": \"eJwdjsEKwjAQRP8l0Js2WG8FEUHrD/TiKazJhgTTJmQ3pSL+u6mnmTcMzHzEhOyiEb2430axEy6jreCYE/VS6hCL2UPy7Rtmg2s7I8vlII2nl8xIsWSNdE7A7rRlzfHSdMMDrtWPSFyBqyiCBRVH9e90w4ZGpfIMXivrA7a8cl1nnFIAxvrHQiD8/gBxTDkU\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk%2Fsaved_public_file.txt\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1183\"\n            },\n            \"content\": \"eJy1U1tr1EAU/i+B5sW2mcncA0EWS7VUhdattE/LmZs77G4Sk9nt1tL/7sxqFUTxRSEkOWfOfOf2fY/FAHFZNIUN06qp7uAsfeduilVMr8UEO7eI/SKfVtmwi2Gr18EsfFi707iPxXERHwaXELInWR1ssvWnYDM6iM6miBrV7ATxE8znuG4YaZB6gVCDUIra9Db48NewKXxJubBMF8ImFfqtkOj2sRrWELqMZFlySYW1sUQgxLECzzDD2iumJeHeK40z1hJqxlOsoR4UlyAoY5J7AEAEIUbTLa+xAW+ZU+Bq5oFrTAQYToUQmHlrJD5gbZwN8FyO7c1247rc/Oimfjsatwi5s4TPBcOibsAbjgkyREttwdcgjLZaWoQtoFpoxMAgi2VKriRIYb2iDCFsTC1rieQBehem0HdpHCIdCUmkEpgSqtLM+00uIGWdiuax+L6U52L+dSXDGHZpxf8J/+m4cPvgUx/pD7oYdmHcTospQtxOeXtrB3nvBzY2xTLGYWqqyvb33boH68bTzOXTB+is25+O2+pAbdAKAYhaCWmowKAdMZI7izRJRCEOa60tBcDUeG4IY0ojioS1jALRRFRcMkS151U3vblYudvLDq5fD/OHDt2E689zMZzdvd3wmxNOz8WHd/L97FzYi/nt1eo+MnTTzUZ/Tk9WW/oxjhewehUurpm8xHg/6/rdFcyOyFl6Xm6DbX/MsswtZrW1v9VamRob+inERIoWYgSzzCQolzAt23IdNiG2qDR9FzM1MlfbLJyj+vwgnTINzI2LXzJmwbVYlsvk1kqxPKm0Noe897a2RCGmKIbaO4fKnyponzVQxlW3a3ekdBE+tX9V5dNXMNVuWQ==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_save_to_disk&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzkEOgjAQQNG7dK20hU5t2Rsv4AUGZiYQgTa0Go3x7rL8q/e/auU6JVK9ul3v6qSmneWIqdZceq3HJT3pjHluPrgRv5uNq35ZTXN56JR5xzqnrWhofexaBgHTCaI4a9xFWhQrRJGCExiMF/Y4dM6MRiyAD6O3AUKMAQ658poXrHy8CC6Ff39hhjEh\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/526932e5f503faaf41047f2af1fdd9d84f5b06fe6ab340c0f15568c618589985?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/526932e5f503faaf41047f2af1fdd9d84f5b06fe6ab340c0f15568c618589985?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_streaming_requests.json",
    "content": "[\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/0000?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 404,\n            \"headers\": {\n                \"content-type\": \"application/json\",\n                \"content-length\": \"137\"\n            },\n            \"content\": \"eJyrVspNLS5OTE9VslK6MPfCVoWLzRe2XNhwYfeFfRcbL/YoXNgL5Oy82HRhh4LChX0X9l/YerHhwoaLbRd2XOzTU9JRSkktTi7KLCjJzM8DmuBfkFqUCGIr5OWXKKTll+algBSlFhXlFwGlXTKLs+FK/PJL3EAKXMGStQAQHEAr\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/last-uploaded?limit=10&fields=items.type\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"171\"\n            },\n            \"content\": \"eJyrVsosSc0tVrKKrlYqqSxIVbJSSsvMSVWq1Rlk/NhaACXZOPU=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_upload_and_download.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"143\"\n            },\n            \"content\": \"eJwVjc0KwjAQhN8l0Js2qLeCiKD1BXrxFJbulhTTJGQ3/iC+u9vTzPcdZr7GF5pMZ7xI5s7aMaSKW8hz+4GI9G4jiX3uLM78sIU41TISnzKIP66uOZybfX+Hi/aBWBREw9UcEqDTDYfpFVcwG7OQ+IR6d7sOikJLDiCkZoLA9PsDUgsyzA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download%2Fzeroes.txt&overwrite=true&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"127\"\n            },\n            \"content\": \"eJwtzEEOwiAQQNG7sC8MAy2Rc3gB6tCiNJXAtNUY764m/u1L/kukGifhRWIuzSu1leUeKFbdz5KuLctnWCk+5BrZW2v+3nGoc2SFgBYcDGf8Zk/SGZAbk9QjakTql33MU6FjZ7i1dMmuy7+xAXQ4gHh/AG9fKAI=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader15g.disk.yandex.net/upload-target/20240706T222249.730.utd.1b2122d5lvbkfpdwvt0jshck7-k15g.3027260\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJztwTEBAAAAwqBK65/OEL5AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8BjCrLQE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/download?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download%2Fzeroes.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"450\"\n            },\n            \"content\": \"eJxdUNtq20AQ/RdD9FZrL9qLAqIU4sRNDaV2XEJfzGhnVG0kr1RpFV9K/z1K+1Y4L3MGzu33oh6oWtwu6hj78TZNsTuFtgOkYYl+bJYXCEjn5TCl72dKoEzJM1sxq0DZXGrIudKmynQphEDGNaugtDMpFbi8dLIUDiwKlaEkl2ptc+QO0jCuPzf0/CXA9qF/ugS299tf2An33T8E/PHtxHZmu9sMzSd6sXx1meJVbJ5Xj2u1f2SH3d2GnVZS26dm+tquP+w7xQKq0428m/Fx8lhkas6luBFJ5VsKcKTiSkNH4zKeYzK36bvRR9+FAmIEVx8pxKSGsS6S1h99LFjiuhBn9hAvPRWRzvFG3Pct+JDMK9Fw+M9m9FcqOMusMjqp55+RTgLnYJ2stJaZltxYI1CQcrwUNjkSevgnj52b/kaITXgtXkVCEX4WaDFzYh7MUlayDHNdOhCzjEJmuFOLP2/Nv5CJ\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/ea57b148f085a58936a91567f46b222d0160fab891535ac9bc3b2ca8d254d3ec/6689d1ca/nsHIkeXKnaRGpTyn0UiRqdo2cViGndZQw0S7RSLrkAej81Eyutz2LXEJH5UJ0_SDL0wE368TkuOlH-Uo50nd5w==?uid=455675172&filename=zeroes.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=1048576&hid=73c3a11a8c3f66346317872d2e5c1b28&media_type=document&tknv=v2&etag=d8d4c2d1c8e4b04d96bca23175d071c5\",\n        \"headers\": {\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"1048576\"\n            },\n            \"content\": \"eJztwTEBAAAAwqBK65/OEL5AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8BjCrLQE=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_and_download&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzU0OgjAQQOG7dK30l5ayJ17AC0zbmUAE2tBqNMa7y/J9m/dl84HERja3VurIeVzzM12hLN0H9oTvbsfGX5KnpT54LnhAW/JeuYxEvdfKJqt6cDLowShhnCVpAlFIKkZS1vSD8NIbGQTEGLQXGsg46diFbdjmnM73bbqf2XArKzQ8hWCt+PsDdXQxBA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/1cff59326d625a71b38420476f14bffbd2ccf26458091941b0accb3903af4717?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/1cff59326d625a71b38420476f14bffbd2ccf26458091941b0accb3903af4717?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_upload_download_non_seekable.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_download_non_seekable\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"152\"\n            },\n            \"content\": \"eJwdjcsKwjAQRf8l0J02qLuCiKD1B7pxFcbmlpSmSehMfCD+u9HVPeds7lu5BYNqlBNJ3Gjd+5jtmtJYvyhYPOsA0feNtiNPegHHvPTgQyJx+1+rdsdq217pVLgDSxEpY3Lykayx8RH+EGIwDEx081ArNUNctOX3cu6KCubkSVDKQJ7x+QJKJjZ/\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_upload_download_non_seekable%2Fzeroes.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzEkOAiEQAMC/cB/o9LAN7/ADKK3oKCI0LjH+3Zh4rqTeIjfaiyAyc+1BqVHP15ioOTzJdOyrfMWS6CkLcdB6/vvEsR2IFQJqcGA3iDgjSA2LHJyk5wL1kiltb+zN/eFwMYN6303rL9baIhjrxecLqAwogg==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader72j.disk.yandex.net/upload-target/20240706T222320.409.utd.8tn0pmhedbqt85vw7295uessc-k72j.44620568\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwzMBgFo2AUDHcAAK0au4E=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/download?path=disk%3A%2FYaDiskTest%2Ftest_upload_download_non_seekable%2Fzeroes.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"447\"\n            },\n            \"content\": \"eJxdUEtrGzEY/C+G6FavHqtXQBSbpEnjUIiJW/dktNKnrLCtVXe1qe2Q/55teyvMZWZghpm3WdtDmF3P2lLycF1VvvudDp310M99HPbzs00eTvN+rP7QSoFzvHYiCBcYtbVoPPDAFKVKKtlwESbfUYmVFEphYKJm3GuBm5pYRkglhNKegK7ScP91D9tVsuu7/HxOeBPXv9zDU/u4+V4vst5v4yLTp9Isl/wCZdztctSrn+Np80Oe7+9IvHlefcphuV3f0vDSuNtvCrPFFbuZ8HmM3tScC8mJpCjEAyR7BHOBvoNhXk4FTWtyN8QSu2RsKda1R0gFtXZoDTrEYywGI9elMqm7cs5gCpzKFf2SDzYmNL0E/e6/miFewBCMMWonI2jKbFA8YEmpFjWwmtIgtJaCcKExOoKP9l+279z4t7/s06t5pQiKfTFKNY3QlnsOmIKTNvAglFc0QEMC8bP3Dwmxj/Y=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/8ecc54c6f6cf32a46bde5f38228787b56fcc5c270876880e36435d960b41a311/6689d1e9/nsHIkeXKnaRGpTyn0UiRqcJQhLUV4Ap9kXiAp2QtbBB5zetu__pi9KYuxUW7yHG1iDTK-pfBXRE2fgbcEN803A==?uid=455675172&filename=zeroes.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=1000&hid=f923af85f0722964e3422f6997615690&media_type=document&tknv=v2&etag=88bb69a5d5e02ec7af5f68d82feb1f1d\",\n        \"headers\": {\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"1000\"\n            },\n            \"content\": \"eJwzMBgFo2AUDHcAAK0au4E=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_download_non_seekable&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgyAQQNG7sG6FQRRxb3qBXmCAmWiqQoQ2bZrevS7/2/yvmA9iMYq51lxGKcOanvGKeWk+uEd6NztV+QIZl/KQKdOBdUl7kUNvKGh2BnpllYuKSOuujUAKAIGd99CiYetcgI4DeaOsxg6C5Xbwg7iIjeqc4vm+TfczK215xUqnMK6Ffn93yTE2\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/864ec2f94160709d0ee2253d1e011a1f9bb13a4f799c15fceb4072a51c7f38b8?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/864ec2f94160709d0ee2253d1e011a1f9bb13a4f799c15fceb4072a51c7f38b8?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_upload_generator.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_generator\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"140\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxVYbm1hTTJGQmooj/7ri655zN/RhfMJnOeJHMnbVjSNWtKc/tm6LDq40Q+9xYN/PDFnCqZQQfMonf/1uzOzbby41Oyj1YVERnqDkkcsMdEYUkFbMyC8Qnp1/Xc68qWHIggZaJAuP7A7WGMak=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_upload_generator%2Fzeroes.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzEsKwyAQANC7uM9oRxOj58gFLKNNG4liRvqjdy+Frh+8t1hbTMKLlbkeXspecwkUm51uQNdjg2fYKT5gj+yN0X8fOLRLZIkKjbJqWhBRowaHCjoTOArnbMfUiiuh21czlRLGfB+2X6znkx21mcXnC6k4KKQ=\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader76j.disk.yandex.net/upload-target/20240706T222323.920.utd.9dabl75fro9oau7zr4pdf2elw-k76j.38175348\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwzMBgFo2AUDHcAAK0au4E=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/download?path=disk%3A%2FYaDiskTest%2Ftest_upload_generator%2Fzeroes.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"447\"\n            },\n            \"content\": \"eJxdUF2P0zAQ/C+Vzm/X2G7s2CdZ6I7eB7oC4nQgeKoc7/pitXFSx2mbIv47Ad6Q9mF3RprZmZ+LJqFf3CyanPvhpiigO8V9ZwHTEsKwW042Ap6XaSz+nEXtFGMlo/W8lFp7TxX3K+1UxWpEzjmzDJjiVCshBABIDpqiAyY1CqwLKZUGhljE4enDDr8/R/vy2L9OkX4NL4cv95u1u72k+tR8c4Ien67H02FTtf5tFJ9v0/tPPHxM18e0ya932k6MUsvvHtL68XA/+e3zj9PVaj3PuzGAKYWQlWAVJz7sMdoWzQVTh8MynzOZ0/TdEHLoorE5W9e0GDNp7NAYsg9tyIYS18U8o9s89WgynvMVf+j3NkQyt4Rp+5/NEC5o5p8oaWbCa76yXglPK861LHFVcu6l1pVkQmpKWoRg/2lD58a//nkXj+bICWb7ZpSqa6mtAIGUo6usF14qmBvHmnkGi1+/AVKZkSc=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://downloader.disk.yandex.ru/disk/bc811410bbc8499ff082f39c871bee2221a1d182098555ddd62d90ecd169e5eb/6689d1ee/nsHIkeXKnaRGpTyn0UiRqQELDcAzrbwhVc50vH-uwqL7mfgu5OArCN2iMr-vrLtTB9ay100a2BFrDGqEyf_KYw==?uid=455675172&filename=zeroes.txt&disposition=attachment&hash=&limit=0&content_type=text%2Fplain&owner_uid=455675172&fsize=1000&hid=f923af85f0722964e3422f6997615690&media_type=document&tknv=v2&etag=88bb69a5d5e02ec7af5f68d82feb1f1d\",\n        \"headers\": {\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"text/plain\",\n                \"content-length\": \"1000\"\n            },\n            \"content\": \"eJwzMBgFo2AUDHcAAK0au4E=\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_generator&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUEOgyAQQNG7sG6FGQXEvekFeoERhmiqQoQ2bZrevS7/2/yvmA+OYhBzrbkMUvo1PcOV8tJ8aA/8bnau8gUyLOUhU+aD6pL2Ii0pAECkEJzvlYNeY6cRNUcdyajoO5xAm0n3EVtUrTeO2EyE1jqwQVzExnVO4XzfxvuZlbe8UuVTIq2Ff39TMDCh\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/7a011122add9c809185245225ef5fa60fc42b156b58f23203c69ae6ba277917d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/7a011122add9c809185245225ef5fa60fc42b156b58f23203c69ae6ba277917d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_upload_url.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_url\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"134\"\n            },\n            \"content\": \"eJwVjUEKwkAMRe8S6E4btLuCiKD1At10VUInZYrTzjDJiCLe3bj6773N/4DPPEMLXjVJiziFWNye0lK/aXP8qjdWfB7QLfLAzBJLnljOidSf/q1qLtWxG+hq3LOoidqMJYVIbiw5wA5WVh+dvdxvvanymgIpW5kpCH9/gL8vNQ==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?path=disk%3A%2FYaDiskTest%2Ftest_upload_url%2Fexample_file.txt&overwrite=false&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"128\"\n            },\n            \"content\": \"eJwtzFEKwyAMANC7+F9NY5zUc+wCglntWmqxkW2O3X0M9v3gvVWufFNBZZHjDMa0YysxcR2p6LScq37FPfFT7yyByP59kFhnFoOABB78FcHR6LTFi26SNLa6zDLZXtj2E1y5Z370LeOw/mLyMIF1pD5fsEAozA==\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://uploader14o.disk.yandex.net/upload-target/20240707T205415.326.utd.2urigt93zoe3zs05ojhewzlh2-k14o.47090354\",\n        \"headers\": {\n            \"content-type\": \"application/octet-stream\",\n            \"connection\": \"close\"\n        },\n        \"content\": \"eJwrSS0uUUjLzElVSM7PK0nNKykGAEGtBw8=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {},\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/download?path=disk%3A%2FYaDiskTest%2Ftest_upload_url%2Fexample_file.txt&fields=href\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"451\"\n            },\n            \"content\": \"eJxdkMtu2zAQRf/FQLi0+BTJAEKQpIjrPmDEcYzYG4MihxVriVIt2pFa5N+jtLsCdzNnMRf3/JlVJ/Cz61mVUtdfZ5lrX2PdGgenuQv9cT6a6GCYn87Zx5lJSQXOlafAcu5AKsosWCMZ11gIoUnufUlpTogDrkBJz7mhWjMD2jBLsjxXJQalsth/Xh7h5Ws060W3GSN+DutfL9svbFVt7P6bhQsflqPe0jLdLo5A5Irvd/vX7/XPzXb/eM93d7vFQzi75Z2AZv20Al6P949X7NOUm3NwBRcil4JIinyoIZoGChhM09Vw+ADzNCQ0beraPqTQxsKkZGzVQEyoMn1VoDo0IRUY2TamiR7S2EGRYEhX9KGrTYhocgWnw39lffgNBVGomnCptSCmBEwlYO+9o45NojQnhnoAjBpwwfz77Fp7/tuejvFSXCiCZH4USpPSOiYxzok2XhBBSq9FqdhkWpdk9vYOwJaSXw==\"\n        }\n    },\n    {\n        \"method\": \"POST\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources/upload?url=https%3A%2F%2Fdownloader.disk.yandex.ru%2Fdisk%2F7725068f2e364de7823ceca73490555916ffb22611de48e87f44a2993ae9a3c1%2F668b0e88%2FnsHIkeXKnaRGpTyn0UiRqXVJ3OhTcZLcev4xIy9V2btAGke17O4ZYZwMljTVZQC4YBYGFiudIB5emRSOe4lyCQ%253D%253D%3Fuid%3D455675172%26filename%3Dexample_file.txt%26disposition%3Dattachment%26hash%3D%26limit%3D0%26content_type%3Dtext%252Fplain%26owner_uid%3D455675172%26fsize%3D18%26hid%3Db9951abe027e0fffd2d3905941a2fee0%26media_type%3Ddocument%26tknv%3Dv2%26etag%3D891bcd3700619af5151bf95b836ff9b1&path=disk%3A%2FYaDiskTest%2Ftest_upload_url%2Fuploaded_from_url.txt&disable_redirects=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzU0OgjAQQOG7dK209A9kb7yAF5h2poEItKGj0Rjvbpfv27yvmA9KYhIzc6mTlHHNTzxDWboP7EjvbieWr17iUh8yFzqAl7xXGWzs0Y/KjjqhIrQhKSSjowtoxkh+IHUxLuhgAbw2KlG0g9POelAAUZzERjxnbO/b9d6SaSsrMDVJsFb6/QG/2jIS\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/b4c1d680482fd0ed4bf0de32c5bd38ce67e0935b2b4aa6230fec4752546a0aac?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/b4c1d680482fd0ed4bf0de32c5bd38ce67e0935b2b4aa6230fec4752546a0aac?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_url%2Fuploaded_from_url.txt\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"1181\"\n            },\n            \"content\": \"eJy1VFmP1DgQ/i+RyAuzE9+OW4rQAmJ29tCIoRkx89Kq2OVt7+ToTZymG8R/x24uCbFaHkCxEtmpVH1HVd4WMMSwD9Myb+YIcZmLVWE7hKE4K+bwBosVrc8KO/Y9DnETXHr/tthNYQ8RNxPO4zLZFFQIKZWWVLOVr40ilqLV1BLCHNbSeInIpdPKEsV0q4xriRLMcE88sy2jghiWPqLcs1R4t7RdsD8p/buzYoA+J1123QgO3cZPY79Zpu48HmIqj4fgE80UaCdMPF2KZYSJX4hOa031SooVVQ8JWRGS4j/hTPL8aCX60QUf/hdBH3rcxOMus4p4iNWug5At9KHLZ9sYd/Oqqtz4ejhxns5dmO/PjzA4PJxPS5W3lW+xTpczQDTTTIJmXKBTNZfeoGe14txabUXtuHfKSsGZSnRAukSTtpVSdUuwhmqYf7u8x1d/DHB9sVsfB/IyXP/76uZ3frVd27s/Le7F4fJoblgbf724R6qvxN3t3eu/un/WN3fPn4jbx7cXz8LiLh9L7K9fXKHojk+eP+BP03q0BNd8VrnMFLOhzTftLBOx3TiHGMahgRjBbnMnl1uYt03ZhT7EhpR2HGLu7yxhkwV8wJ6dJCyTYDhtvqqYB6OhdblNx60xkkKLhGkk3nvHHDdEGkGBeURS9ugCfMjsRrucqsf7Yd/sWYkR/m5qQ1vruCZEUQNeUklbb2Rbc+W9aWkeCIjbZGM2aVXdwtP0XOMcq5humw+8M+Hqvzr6C4ac5SOKPOFbYFLlkRcejKpBJ5a18gBAOCFSJDS+pRa8k2gAmfSgWso1WCW01lR6Z2t6wvgx+6njUkUn0+Y7qE24D3MyJ/1oNCNci1pqyiQ16t17RFVqpA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_upload_url&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUsOwjAMANG7ZA1N3PS/R1yAC7i2o1aUJmoMAiHuTpZvNvM1yyHBTGZRTXmylrb45DOmtfrgzvKudlH7AstrvtuY5EBd454tM7R+aJGYJdRNAOyJ644J3TD7MBfOI/jgGhpBupr6kRgGTw5c33RkTuYhukQu7+vlVqjySBuqlBJwy/L7A+NiMk0=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/dd15385acddef24f1a7cd26dca08b3fba7cb913f04c91e62c79cd183c010746c?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/dd15385acddef24f1a7cd26dca08b3fba7cb913f04c91e62c79cd183c010746c?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    }\n]"
  },
  {
    "path": "tests/recorded/sync/test_wait_for_operation.json",
    "content": "[\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_wait_for_operation\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"142\"\n            },\n            \"content\": \"eJwVjcsKwjAQRf8l0J02qLuCiODjB7pxFYZmQoJpJmSmPhD/3XF1zzmb+zGxYTCDiSKVB2unTItfQ039G4rHV19Q7GNjfeK7bci0tAn5UEHi/t+63bHbXm5wUh6RRUV03BOSuEDNUcUGkqiYlZlRInl9u55HVcG5ZhDUEiAzfn8iTjKJ\"\n        }\n    },\n    {\n        \"method\": \"PUT\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2Fdirectory\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 201,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"115\"\n            },\n            \"content\": \"eJwVzEEKwkAMQNG7BLrTBnVXEHGhvYAXCJOUGZx2hiQVi3h3x+V/i/+BqDLBANG92oAYcll5TzX1Gy0s734Rx9cBOdkTVaysGsQulTye/9adrt3xzkkleNENdjCLx8JtOd4eLV3mmsmlyUTZ5PsDK2QoMg==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2Fdirectory&permanently=true&force_async=true\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 202,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"156\"\n            },\n            \"content\": \"eJwNzUsOgjAUQNG9dKz0S+ljTtyAG+jnNRCBNvRpNMa9y/Ceyf2y+cDMRjYT1TZyHtfyTFdfl+7j94TvbkfiL8nT0h68VDw8LWVv3HgMUcesrBNGBZM8BBwAc4/QZwtRKh1FUgLCANoCCis0CrDOSSNdYhe2Ic0lne/bdD+TcKurJzwl+7Xh7w+bcTEi\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4aebc3cf268042b4da9be79ef5e95f69c123c0d209b79369e0603e096881418d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"24\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUsrM0y0oyk8vSi0uVqoFAG0lCNg=\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4aebc3cf268042b4da9be79ef5e95f69c123c0d209b79369e0603e096881418d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"GET\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/operations/4aebc3cf268042b4da9be79ef5e95f69c123c0d209b79369e0603e096881418d?fields=status\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 200,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"20\"\n            },\n            \"content\": \"eJyrViouSSwpLVayUiouTU5OLS5WqgUATRwHWA==\"\n        }\n    },\n    {\n        \"method\": \"DELETE\",\n        \"url\": \"https://cloud-api.yandex.net/v1/disk/resources?path=disk%3A%2FYaDiskTest%2Ftest_wait_for_operation&permanently=true&force_async=false\",\n        \"headers\": {\n            \"content-type\": \"application/x-www-form-urlencoded\",\n            \"connection\": \"keep-alive\",\n            \"authorization\": \"OAuth supposedly_valid_token\"\n        },\n        \"content\": \"eJwDAAAAAAE=\",\n        \"response\": {\n            \"status_code\": 204,\n            \"headers\": {\n                \"content-type\": \"application/json; charset=utf-8\",\n                \"content-length\": \"0\"\n            },\n            \"content\": \"eJwDAAAAAAE=\"\n        }\n    }\n]"
  },
  {
    "path": "tests/test_session.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport yadisk\nfrom yadisk.types import HTTPMethod\n\nfrom urllib.parse import urljoin, urlparse\n\nfrom typing import Optional\n\n__all__ = [\"AsyncTestSession\", \"TestSession\"]\n\ndef _ensure_trailing_slash(s: str) -> str:\n    if not s.endswith(\"/\"):\n        return s + \"/\"\n\n    return s\n\nclass TestSession(yadisk.Session):\n    __test__ = False\n\n    def __init__(\n        self,\n        session:           yadisk.Session,\n        disk_base_url:     Optional[str] = None,\n        auth_base_url:     Optional[str] = None,\n        download_base_url: Optional[str] = None,\n        upload_base_url:   Optional[str] = None\n    ):\n        self._session          = session\n        self.disk_base_url     = disk_base_url\n        self.auth_base_url     = auth_base_url\n        self.download_base_url = download_base_url\n        self.upload_base_url   = upload_base_url\n\n    def send_request(self, method: HTTPMethod, url: str, **kwargs) -> yadisk.Response:\n        url_parsed = urlparse(url)\n        kwargs.setdefault(\"headers\", {})\n\n        new_base_url: Optional[str] = None\n\n        if url_parsed.hostname == \"cloud-api.yandex.net\":\n            new_base_url = self.disk_base_url\n        elif url_parsed.hostname == \"oauth.yandex.ru\":\n            new_base_url = self.auth_base_url\n        elif url_parsed.hostname == \"downloader.disk.yandex.ru\":\n            new_base_url = self.download_base_url\n        else:\n            subdomain, _, domain = (url_parsed.hostname or \"\").partition(\".\")\n\n            assert domain == \"disk.yandex.net\", f\"Got unexpected URL: {url}\"\n            assert subdomain.startswith(\"uploader\"), f\"Got unexpected URL: {url}\"\n\n            if self.upload_base_url is not None:\n                new_base_url = f\"{self.upload_base_url.rstrip('/')}/{subdomain}\"\n\n        if new_base_url is not None:\n            url = urljoin(_ensure_trailing_slash(new_base_url), url_parsed.path.lstrip(\"/\"))\n            if url_parsed.query:\n                url += \"?\" + url_parsed.query\n\n        return self._session.send_request(method, url, **kwargs)\n\n    def close(self) -> None:\n        self._session.close()\n\nclass AsyncTestSession(yadisk.AsyncSession):\n    __test__ = False\n\n    def __init__(\n        self,\n        session:           yadisk.AsyncSession,\n        disk_base_url:     Optional[str] = None,\n        auth_base_url:     Optional[str] = None,\n        download_base_url: Optional[str] = None,\n        upload_base_url:   Optional[str] = None,\n    ):\n        self._session          = session\n        self.disk_base_url     = disk_base_url\n        self.auth_base_url     = auth_base_url\n        self.download_base_url = download_base_url\n        self.upload_base_url   = upload_base_url\n\n    async def send_request(self, method: HTTPMethod, url: str, **kwargs) -> yadisk.AsyncResponse:\n        url_parsed = urlparse(url)\n        kwargs.setdefault(\"headers\", {})\n\n        new_base_url: Optional[str] = None\n\n        if url_parsed.hostname == \"cloud-api.yandex.net\":\n            new_base_url = self.disk_base_url\n        elif url_parsed.hostname == \"oauth.yandex.ru\":\n            new_base_url = self.auth_base_url\n        elif url_parsed.hostname == \"downloader.disk.yandex.ru\":\n            new_base_url = self.download_base_url\n        else:\n            subdomain, _, domain = (url_parsed.hostname or \"\").partition(\".\")\n\n            assert domain == \"disk.yandex.net\", f\"Got unexpected URL: {url}\"\n            assert subdomain.startswith(\"uploader\"), f\"Got unexpected URL: {url}\"\n\n            if self.upload_base_url is not None:\n                new_base_url = f\"{self.upload_base_url.rstrip('/')}/{subdomain}\"\n\n        if new_base_url is not None:\n            url = urljoin(_ensure_trailing_slash(new_base_url), url_parsed.path.lstrip(\"/\"))\n            if url_parsed.query:\n                url += \"?\" + url_parsed.query\n\n        return await self._session.send_request(method, url, **kwargs)\n\n    async def close(self) -> None:\n        await self._session.close()\n"
  }
]