[
  {
    "path": ".Rbuildignore",
    "content": "^.*\\.Rproj$\n^\\.Rproj\\.user$\n^scratch.R$\n^internal$\n^data-raw$\n^\\.httr-oauth$\n^\\.httr-oauth-SUSPENDED$\n^\\.travis\\.yml$\n^codecov\\.yml$\n^appveyor\\.yml$\n^README\\.Rmd$\n^README-.*\\.png$\n^man-roxygen$\n^docs$\n^_pkgdown\\.yml$\n^index\\.Rmd$\n^cran-comments\\.md$\n^\\.github$\n^pkgdown$\n^vignettes/articles$\n^revdep$\n^index\\.md$\n^LICENSE\\.md$\n^CRAN-RELEASE$\n^\\.covrignore$\n^tests/testthat/all-test.+\n^CRAN-SUBMISSION$\n^[.]?air[.]toml$\n^\\.vscode$\n"
  },
  {
    "path": ".covrignore",
    "content": "R/aaa.R\nR/deprecated.R\nR/dplyr-compat.R\n"
  },
  {
    "path": ".github/.gitignore",
    "content": "*.html\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# CODEOWNERS for googledrive\n# https://www.tidyverse.org/development/understudies\n.github/CODEOWNERS @jennybc @lucymcgowan\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at codeofconduct@posit.co. \nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.1, available at\n<https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][https://github.com/mozilla/inclusion].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n<https://www.contributor-covenant.org/faq>. Translations are available at <https://www.contributor-covenant.org/translations>.\n\n[homepage]: https://www.contributor-covenant.org\n"
  },
  {
    "path": ".github/CONTRIBUTING.Rmd",
    "content": "---\ntitle: \"Contributing to googledrive\"\noutput:\n  github_document:\n    toc: true\n    toc_depth: 3\n---\n\n## Making a pull request\n\n  * Uphold the design principles and package mechanics outlined below.\n  * When in doubt, discuss in an issue before doing lots of work.\n  * Make sure the package still passes `R CMD check` locally for you. It's a good idea to do that before you touch anything, so you have a baseline.\n  * Match the existing code style. Our intent is to follow <https://style.tidyverse.org>. Please use the [styler package](https://styler.r-lib.org) to re-style any code that you touch.\n  * Tests: please *try* to run our tests or at least those that exercise your PR. Add tests, if relevant. If things go sideways, just say so. We are painfully aware that it's not easy to test API-wrapping, auth-requiring packages like googledrive and are open to constructive feedback. More below.\n  * Documentation: Update the documentation source, if your PR changes any behavior. We use [roxygen2](https://cran.r-project.org/package=roxygen2), so you must edit the roxygen comments above the function; never edit `NAMESPACE` or `.Rd` files by hand. More below.\n  * Website: The pkgdown-created website is built and deployed automatically via Travis-CI. Some changes require an edit to the `reference` section of `_pkgdown.yml`, i.e. to make sure that a function appears there.\n  * If the PR is related to an issue, link to it in the description, with [the `#15` syntax](https://help.github.com/articles/autolinked-references-and-urls/) and the issue slug for context. If the PR is meant to close an issue, make sure one of the commit messages includes [text like `closes #44` or `fixes #101`](https://help.github.com/articles/closing-issues-using-keywords/). Provide the issue number and slug in the description, even if the issue is mentioned in the title, because auto-linking does not work in the PR title.\n    - GOOD PR title: \"Obtain user's intent via mind-reading; fixes #86\".\n    - BAD PR title: \"Fixes #1043\". Please remind us all what issue #1043 is about!\n    - BAD PR title: \"Something about #345\". This will not actually close issue #345 upon merging. [Use the magic words](https://help.github.com/articles/closing-issues-using-keywords/).\n  * Add a bullet to `NEWS.md` with a concise description of the change, if it's something a user would want to know when updating the package. [dplyr's `NEWS.md`](https://github.com/tidyverse/dplyr/blob/main/NEWS.md) is a good source of examples. Note the sentence format, the inclusion of GitHub username, and links to relevant issue(s)/PR(s). We will handle any organization into sub-sections just prior to a release. What merits a bullet?\n    - Fixing a typo in the docs does not, but it is still awesome and deeply appreciated.\n    - Fixing a bug or adding a new feature is bullet-worthy.\n\n## Package philosophy\n\n  * When in doubt, take a cue from the Unix file system commands or the Google Drive browser UI.\n  * Have a reasonable default whenever humanly possible. This applies to auth, file name, file location, etc.\n  * Be pipe-friendly.\n  * If it's not well-documented (e.g. working example!), it doesn't really exist.\n  * Accommodate initial file specification via path or name, but constantly push downstream work to be based on file id.\n  * Return a tidy tibble, almost always a [`dribble`](https://tidyverse.github.io/googledrive/reference/dribble.html), whenever it makes sense.\n\nThere is a high-level interface for the typical user. These functions help you accomplish the most common tasks, hopefully in a natural way. Examples: `drive_find()`, `drive_upload()`, `drive_download()`. A few hand-picked functions support passing extra parameters through to the API request via `...`, but we don't do this across the board.\n\nThere is also a low-level interface that is used internally. An example is the function `request_generate()`. These functions are exported for use by programming-oriented users who are willing to read [Drive API docs](https://developers.google.com/drive/v3/web/about-sdk) and want to do things we haven't made available in the high-level interface.\n\n## Package mechanics\n\n### Documentation\n\nWe use [roxygen2](https://cran.r-project.org/package=roxygen2), specifically with the [Markdown syntax](https://cran.r-project.org/web/packages/roxygen2/vignettes/markdown.html), to create `NAMESPACE` and all `.Rd` files. All edits to documentation should be done in roxygen comments above the associated function \nor object.\n\nUse templates or inheritance to repeat documentation whenever it is helpful, but without actually repeating its source.\n\nUse internal and external links liberally, i.e. to other docs in googledrive or to Drive API resources.\n\nWe encourage working examples that include any necessary setup and teardown. In most cases, you'll have to put them inside a `\\dontrun{}`.\n\nIt's nice if a pull request includes the result of running `devtools::document()`, to update `NAMESPACE` and the `.Rd` files, but that's optional. A good reason to NOT `document()` is if you have a different version of roxygen2 installed and that sprays minor formatting changes across `.Rd` files that have nothing to do with the PR.\n\n### Testing\n\nWe use [testthat](https://cran.r-project.org/package=testthat).\n\nWe have many tests that (1) require authorization and that (2) rely on the existence of specific files and folders. Therefore, to fully test googledrive, you have to do some setup.\n\nFor small changes, it's fine to test your specific change locally and make a PR. Keep reading for an explanation of how to run full tests for googledrive.\n\n#### Auth\n\nA token is put into force at the beginning of a test run by the first few lines of [tests/testthat/helper.R](https://github.com/tidyverse/googledrive/blob/main/tests/testthat/helper.R).\n\n  * This reflects the approach documented in the gargle vignette [Managing tokens securely](https://gargle.r-lib.org/articles/articles/managing-tokens-securely.html). We use embedded, encrypted service account token.\n  * If you want to use a token you already have, edit those lines to use any of the techniques described in the gargle vignette [Non-interactive auth](https://gargle.r-lib.org/articles/non-interactive-auth.html). Don't commit and submit this change as part of a pull request; just use it as a pragmatic way to run tests with a token you have on hand.\n\n#### R scripts for setup and clean\n\nFor speed reasons, the googledrive tests expect to find certain pre-existing files and folders, i.e. we don't do full setup and tear down on each run. You do setup at the beginning of your googledrive development and leave these files in place while you work. When you're done, e.g., when your PR is complete, you can clean up these files. Each test run also creates and destroys files, both locally and on Drive, but that is different and not what we're talking about here.\n\n1. Source `tests/testthat/driver.R` to extract and aggregate the current setup and clean code across all test files.\n    ```{r eval = FALSE}\n    ## gather all the test setup and clean code from individual test files\n    source(testthat::test_path(\"driver.R\"))\n    ## leaves behind:\n    ##   * all-test-setup.R\n    ##   * all-test-clean.R\n    ```\n    - This creates two R scripts: `tests/testthat/all-test-setup.R` and `tests/testthat/all-test-clean.R`. Inspect them.\n1. When you are truly ready to perform setup or clean, edit the code to set the `SETUP` or `CLEAN` variable to `TRUE` instead of `FALSE`. This friction is intentional, so you don't accidentally create or delete lots of Drive files without meaning to.\n1. Render `all-test-setup.R` with the Knit button in RStudio or like so:\n```{r eval = FALSE}\nrmarkdown::render(testthat::test_path(\"all-test-setup.R\"))\n```\nYou could also just source it, but it's nice to have a report that records what actually happened.\n\nYou should now be able to run the tests via *Build > Test Package* or *Build > Check Package* in RStudio or via `devtools::test()`.\n\nYou can leave the setup in place for as long as you're working on googledrive, i.e. you don't need to do this for every test run. In fact, that is the whole point!\n\nWhen your googledrive development is over, render the clean script:\n```{r eval = FALSE}\nrmarkdown::render(testthat::test_path(\"all-test-clean.R\"))\n```\n\nAgain, read the report to look over what happened, in case anything was trashed that should not have been (btw, let us know about that so we can fix!). Once you're satisfied that your own files were not touched, you can `drive_empty_trash()` to truly delete the test files.\n\n#### Adding tests\n\nIf you're going to add or modify tests, follow these conventions:\n\n  * Test files are marked up with knitr chunk headers in comments, e.g. `# ---- clean ----` or `# ---- tests ----`. This is what enables the `driver.R` script to isolate the setup or cleaning code. Don't break that.\n  * Any file that is truly necessary and can be setup in advance and persist? Do it, in order to make future test runs faster. Put the associated setup and clean code at the top of the test file.\n  * All test files should have a name that documents why they exist and who made them. Use the `# ---- nm_fun ----` chunk to define naming functions used in that test file (see existing files for examples). Always use one of these functions to generate file names. Use `nm_()` for test files that persist. Use `me_()` for ephemeral test files that are created and destroyed in one test run.\n  \nExample and structure of a self-documenting name for a persistent test file:\n\n```\nmove-files-into-me-TEST-drive-mv\n<informative-slug>-TEST-<test-context>\n```\n\nExample and structure of a self-documenting name for an ephemeral test file:\n\n```\nDESCRIPTION-TEST-drive-upload-travis\n<informative-slug>-TEST-<test-context>-<user>\n```\n\nNote that the current user is appended! This is so that concurrent test runs do not attempt to edit the same files.\n\n### Continuous integration\n\ngoogledrive is checked on a large matrix of R versions and operating systems via GitHub Actions.\nWe use [codecov](https://codecov.io/github/tidyverse/googledrive?branch=main) to track the test coverage.\nIn general, the package is subjected to `R CMD check`, unit tests, and test coverage analysis after every push to GitHub.\nFor internal branches, an encrypted service account token is available on GHA, so tests against the Drive API can be run.\n\nThings are a bit different for pull requests from outside contributors, however. These PRs do not have access to the encrypted tokens, therefore many tests must be skipped. The PR will still be vetted via `R CMD check` and tests that do not call the Drive API can still be run. After you make a PR, it's a good idea to check back after a few minutes to see all of these results. If there are problems, read the log and try to correct the problem proactively. We \"squash and merge\" most pull requests, internal or external, so don't agonize over the commit history.\n\n## Code of Conduct\n\nPlease note that the googledrive project is released with a\n[Contributor Code of Conduct](CODE_OF_CONDUCT.md). By contributing to this\nproject you agree to abide by its terms.\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "Contributing to googledrive\n================\n\n-   [Making a pull request](#making-a-pull-request)\n-   [Package philosophy](#package-philosophy)\n-   [Package mechanics](#package-mechanics)\n    -   [Documentation](#documentation)\n    -   [Testing](#testing)\n    -   [Continuous integration](#continuous-integration)\n-   [Code of Conduct](#code-of-conduct)\n\n## Making a pull request\n\n-   Uphold the design principles and package mechanics outlined below.\n-   When in doubt, discuss in an issue before doing lots of work.\n-   Make sure the package still passes `R CMD check` locally for you.\n    It’s a good idea to do that before you touch anything, so you have a\n    baseline.\n-   Match the existing code style. Our intent is to follow\n    <https://style.tidyverse.org>. Please use the [styler\n    package](https://styler.r-lib.org) to re-style any code that you\n    touch.\n-   Tests: please *try* to run our tests or at least those that exercise\n    your PR. Add tests, if relevant. If things go sideways, just say so.\n    We are painfully aware that it’s not easy to test API-wrapping,\n    auth-requiring packages like googledrive and are open to\n    constructive feedback. More below.\n-   Documentation: Update the documentation source, if your PR changes\n    any behavior. We use\n    [roxygen2](https://cran.r-project.org/package=roxygen2), so you must\n    edit the roxygen comments above the function; never edit `NAMESPACE`\n    or `.Rd` files by hand. More below.\n-   Website: The pkgdown-created website is built and deployed\n    automatically via Travis-CI. Some changes require an edit to the\n    `reference` section of `_pkgdown.yml`, i.e. to make sure that a\n    function appears there.\n-   If the PR is related to an issue, link to it in the description,\n    with [the `#15`\n    syntax](https://help.github.com/articles/autolinked-references-and-urls/)\n    and the issue slug for context. If the PR is meant to close an\n    issue, make sure one of the commit messages includes [text like\n    `closes #44` or\n    `fixes #101`](https://help.github.com/articles/closing-issues-using-keywords/).\n    Provide the issue number and slug in the description, even if the\n    issue is mentioned in the title, because auto-linking does not work\n    in the PR title.\n    -   GOOD PR title: “Obtain user’s intent via mind-reading; fixes\n        #86”.\n    -   BAD PR title: “Fixes #1043”. Please remind us all what issue\n        #1043 is about!\n    -   BAD PR title: “Something about #345”. This will not actually\n        close issue #345 upon merging. [Use the magic\n        words](https://help.github.com/articles/closing-issues-using-keywords/).\n-   Add a bullet to `NEWS.md` with a concise description of the change,\n    if it’s something a user would want to know when updating the\n    package. [dplyr’s\n    `NEWS.md`](https://github.com/tidyverse/dplyr/blob/main/NEWS.md) is\n    a good source of examples. Note the sentence format, the inclusion\n    of GitHub username, and links to relevant issue(s)/PR(s). We will\n    handle any organization into sub-sections just prior to a release.\n    What merits a bullet?\n    -   Fixing a typo in the docs does not, but it is still awesome and\n        deeply appreciated.\n    -   Fixing a bug or adding a new feature is bullet-worthy.\n\n## Package philosophy\n\n-   When in doubt, take a cue from the Unix file system commands or the\n    Google Drive browser UI.\n-   Have a reasonable default whenever humanly possible. This applies to\n    auth, file name, file location, etc.\n-   Be pipe-friendly.\n-   If it’s not well-documented (e.g. working example!), it doesn’t\n    really exist.\n-   Accommodate initial file specification via path or name, but\n    constantly push downstream work to be based on file id.\n-   Return a tidy tibble, almost always a\n    [`dribble`](https://tidyverse.github.io/googledrive/reference/dribble.html),\n    whenever it makes sense.\n\nThere is a high-level interface for the typical user. These functions\nhelp you accomplish the most common tasks, hopefully in a natural way.\nExamples: `drive_find()`, `drive_upload()`, `drive_download()`. A few\nhand-picked functions support passing extra parameters through to the\nAPI request via `...`, but we don’t do this across the board.\n\nThere is also a low-level interface that is used internally. An example\nis the function `request_generate()`. These functions are exported for\nuse by programming-oriented users who are willing to read [Drive API\ndocs](https://developers.google.com/drive/v3/web/about-sdk) and want to\ndo things we haven’t made available in the high-level interface.\n\n## Package mechanics\n\n### Documentation\n\nWe use [roxygen2](https://cran.r-project.org/package=roxygen2),\nspecifically with the [Markdown\nsyntax](https://cran.r-project.org/web/packages/roxygen2/vignettes/markdown.html),\nto create `NAMESPACE` and all `.Rd` files. All edits to documentation\nshould be done in roxygen comments above the associated function or\nobject.\n\nUse templates or inheritance to repeat documentation whenever it is\nhelpful, but without actually repeating its source.\n\nUse internal and external links liberally, i.e. to other docs in\ngoogledrive or to Drive API resources.\n\nWe encourage working examples that include any necessary setup and\nteardown. In most cases, you’ll have to put them inside a `\\dontrun{}`.\n\nIt’s nice if a pull request includes the result of running\n`devtools::document()`, to update `NAMESPACE` and the `.Rd` files, but\nthat’s optional. A good reason to NOT `document()` is if you have a\ndifferent version of roxygen2 installed and that sprays minor formatting\nchanges across `.Rd` files that have nothing to do with the PR.\n\n### Testing\n\nWe use [testthat](https://cran.r-project.org/package=testthat).\n\nWe have many tests that (1) require authorization and that (2) rely on\nthe existence of specific files and folders. Therefore, to fully test\ngoogledrive, you have to do some setup.\n\nFor small changes, it’s fine to test your specific change locally and\nmake a PR. Keep reading for an explanation of how to run full tests for\ngoogledrive.\n\n#### Auth\n\nA token is put into force at the beginning of a test run by the first\nfew lines of\n[tests/testthat/helper.R](https://github.com/tidyverse/googledrive/blob/main/tests/testthat/helper.R).\n\n-   This reflects the approach documented in the gargle vignette\n    [Managing tokens\n    securely](https://gargle.r-lib.org/articles/articles/managing-tokens-securely.html).\n    We use embedded, encrypted service account token.\n-   If you want to use a token you already have, edit those lines to use\n    any of the techniques described in the gargle vignette\n    [Non-interactive\n    auth](https://gargle.r-lib.org/articles/non-interactive-auth.html).\n    Don’t commit and submit this change as part of a pull request; just\n    use it as a pragmatic way to run tests with a token you have on\n    hand.\n\n#### R scripts for setup and clean\n\nFor speed reasons, the googledrive tests expect to find certain\npre-existing files and folders, i.e. we don’t do full setup and tear\ndown on each run. You do setup at the beginning of your googledrive\ndevelopment and leave these files in place while you work. When you’re\ndone, e.g., when your PR is complete, you can clean up these files. Each\ntest run also creates and destroys files, both locally and on Drive, but\nthat is different and not what we’re talking about here.\n\n1.  Source `tests/testthat/driver.R` to extract and aggregate the\n    current setup and clean code across all test files.\n\n    ``` r\n    ## gather all the test setup and clean code from individual test files\n    source(testthat::test_path(\"driver.R\"))\n    ## leaves behind:\n    ##   * all-test-setup.R\n    ##   * all-test-clean.R\n    ```\n\n    -   This creates two R scripts: `tests/testthat/all-test-setup.R`\n        and `tests/testthat/all-test-clean.R`. Inspect them.\n\n2.  When you are truly ready to perform setup or clean, edit the code to\n    set the `SETUP` or `CLEAN` variable to `TRUE` instead of `FALSE`.\n    This friction is intentional, so you don’t accidentally create or\n    delete lots of Drive files without meaning to.\n\n3.  Render `all-test-setup.R` with the Knit button in RStudio or like\n    so:\n\n``` r\nrmarkdown::render(testthat::test_path(\"all-test-setup.R\"))\n```\n\nYou could also just source it, but it’s nice to have a report that\nrecords what actually happened.\n\nYou should now be able to run the tests via *Build \\> Test Package* or\n*Build \\> Check Package* in RStudio or via `devtools::test()`.\n\nYou can leave the setup in place for as long as you’re working on\ngoogledrive, i.e. you don’t need to do this for every test run. In fact,\nthat is the whole point!\n\nWhen your googledrive development is over, render the clean script:\n\n``` r\nrmarkdown::render(testthat::test_path(\"all-test-clean.R\"))\n```\n\nAgain, read the report to look over what happened, in case anything was\ntrashed that should not have been (btw, let us know about that so we can\nfix!). Once you’re satisfied that your own files were not touched, you\ncan `drive_empty_trash()` to truly delete the test files.\n\n#### Adding tests\n\nIf you’re going to add or modify tests, follow these conventions:\n\n-   Test files are marked up with knitr chunk headers in comments,\n    e.g. `# ---- clean ----` or `# ---- tests ----`. This is what\n    enables the `driver.R` script to isolate the setup or cleaning code.\n    Don’t break that.\n-   Any file that is truly necessary and can be setup in advance and\n    persist? Do it, in order to make future test runs faster. Put the\n    associated setup and clean code at the top of the test file.\n-   All test files should have a name that documents why they exist and\n    who made them. Use the `# ---- nm_fun ----` chunk to define naming\n    functions used in that test file (see existing files for examples).\n    Always use one of these functions to generate file names. Use\n    `nm_()` for test files that persist. Use `me_()` for ephemeral test\n    files that are created and destroyed in one test run.\n\nExample and structure of a self-documenting name for a persistent test\nfile:\n\n    move-files-into-me-TEST-drive-mv\n    <informative-slug>-TEST-<test-context>\n\nExample and structure of a self-documenting name for an ephemeral test\nfile:\n\n    DESCRIPTION-TEST-drive-upload-travis\n    <informative-slug>-TEST-<test-context>-<user>\n\nNote that the current user is appended! This is so that concurrent test\nruns do not attempt to edit the same files.\n\n### Continuous integration\n\ngoogledrive is checked on a large matrix of R versions and operating\nsystems via GitHub Actions. We use\n[codecov](https://codecov.io/github/tidyverse/googledrive?branch=main)\nto track the test coverage. In general, the package is subjected to\n`R CMD check`, unit tests, and test coverage analysis after every push\nto GitHub. For internal branches, an encrypted service account token is\navailable on GHA, so tests against the Drive API can be run.\n\nThings are a bit different for pull requests from outside contributors,\nhowever. These PRs do not have access to the encrypted tokens, therefore\nmany tests must be skipped. The PR will still be vetted via\n`R CMD check` and tests that do not call the Drive API can still be run.\nAfter you make a PR, it’s a good idea to check back after a few minutes\nto see all of these results. If there are problems, read the log and try\nto correct the problem proactively. We “squash and merge” most pull\nrequests, internal or external, so don’t agonize over the commit\nhistory.\n\n## Code of Conduct\n\nPlease note that the googledrive project is released with a [Contributor\nCode of Conduct](CODE_OF_CONDUCT.md). By contributing to this project\nyou agree to abide by its terms.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue_template.md",
    "content": "Please briefly describe your problem and what output you expect. If you have a question, please don't use this form. Instead, ask on <https://stackoverflow.com/> or <https://community.rstudio.com/>.\n\nPlease include a minimal reproducible example (AKA a reprex). If you've never heard of a [reprex](https://reprex.tidyverse.org/) before, start by reading <https://www.tidyverse.org/help/#reprex>.\n\n---\n\nBrief description of the problem\n\n```r\n# insert reprex here\n```\n"
  },
  {
    "path": ".github/SUPPORT.md",
    "content": "# Getting help with googledrive\n\nThanks for using googledrive. Before filing an issue, there are a few places\nto explore and pieces to put together to make the process as smooth as possible.\n\nStart by making a minimal **repr**oducible **ex**ample using the \n[reprex](https://reprex.tidyverse.org/) package. If you haven't heard of or used \nreprex before, you're in for a treat! Seriously, reprex will make all of your \nR-question-asking endeavors easier (which is a pretty insane ROI for the five to \nten minutes it'll take you to learn what it's all about). For additional reprex\npointers, check out the [Get help!](https://www.tidyverse.org/help/) section of\nthe tidyverse site.\n\nArmed with your reprex, the next step is to figure out [where to ask](https://www.tidyverse.org/help/#where-to-ask). \n\n  * If it's a question: start with [community.rstudio.com](https://community.rstudio.com/), \n    and/or StackOverflow. There are more people there to answer questions.  \n  * If it's a bug: you're in the right place, file an issue.  \n  * If you're not sure: let the community help you figure it out! If your \n    problem _is_ a bug or a feature request, you can easily return here and \n    report it. \n\nBefore opening a new issue, be sure to [search issues and pull requests](https://github.com/tidyverse/googledrive/issues) to make sure the \nbug hasn't been reported and/or already fixed in the development version. By \ndefault, the search will be pre-populated with `is:issue is:open`. You can \n[edit the qualifiers](https://help.github.com/articles/searching-issues-and-pull-requests/) \n(e.g. `is:pr`, `is:closed`) as needed. For example, you'd simply\nremove `is:open` to search _all_ issues in the repo, open or closed.\n\n\nIf you _are_ in the right place, and need to file an issue, please review the \n[\"File issues\"](https://www.tidyverse.org/contribute/#issues) paragraph from \nthe tidyverse contributing guidelines.\n\nThanks for your help!\n"
  },
  {
    "path": ".github/workflows/R-CMD-check.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\n#\n# NOTE: This workflow is overkill for most R packages and\n# check-standard.yaml is likely a better choice.\n# usethis::use_github_action(\"check-standard\") will install it.\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\nname: R-CMD-check.yaml\n\npermissions: read-all\n\njobs:\n  R-CMD-check:\n    runs-on: ${{ matrix.config.os }}\n\n    name: ${{ matrix.config.os }} (${{ matrix.config.r }})\n\n    strategy:\n      fail-fast: false\n      matrix:\n        config:\n          - {os: macos-latest,   r: 'release'}\n\n          - {os: windows-latest, r: 'release'}\n          # use 4.0 or 4.1 to check with rtools40's older compiler\n          - {os: windows-latest, r: 'oldrel-4'}\n\n          - {os: ubuntu-latest,  r: 'devel', http-user-agent: 'release'}\n          - {os: ubuntu-latest,  r: 'release'}\n          - {os: ubuntu-latest,  r: 'oldrel-1'}\n          - {os: ubuntu-latest,  r: 'oldrel-2'}\n          - {os: ubuntu-latest,  r: 'oldrel-3'}\n          - {os: ubuntu-latest,  r: 'oldrel-4'}\n\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n      R_KEEP_PKG_SOURCE: yes\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-pandoc@v2\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          r-version: ${{ matrix.config.r }}\n          http-user-agent: ${{ matrix.config.http-user-agent }}\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::rcmdcheck\n          needs: check\n\n      - uses: r-lib/actions/check-r-package@v2\n        with:\n          upload-snapshots: true\n          build_args: 'c(\"--no-manual\",\"--compact-vignettes=gs+qpdf\")'\n"
  },
  {
    "path": ".github/workflows/format-suggest.yaml",
    "content": "# Workflow derived from https://github.com/posit-dev/setup-air/tree/main/examples\n\non:\n  # Using `pull_request_target` over `pull_request` for elevated `GITHUB_TOKEN`\n  # privileges, otherwise we can't set `pull-requests: write` when the pull\n  # request comes from a fork, which is our main use case (external contributors).\n  #\n  # `pull_request_target` runs in the context of the target branch (`main`, usually),\n  # rather than in the context of the pull request like `pull_request` does. Due\n  # to this, we must explicitly checkout `ref: ${{ github.event.pull_request.head.sha }}`.\n  # This is typically frowned upon by GitHub, as it exposes you to potentially running\n  # untrusted code in a context where you have elevated privileges, but they explicitly\n  # call out the use case of reformatting and committing back / commenting on the PR\n  # as a situation that should be safe (because we aren't actually running the untrusted\n  # code, we are just treating it as passive data).\n  # https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/\n  pull_request_target:\n\nname: format-suggest.yaml\n\njobs:\n  format-suggest:\n    name: format-suggest\n    runs-on: ubuntu-latest\n\n    permissions:\n      # Required to push suggestion comments to the PR\n      pull-requests: write\n\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          ref: ${{ github.event.pull_request.head.sha }}\n\n      - name: Install\n        uses: posit-dev/setup-air@v1\n\n      - name: Format\n        run: air format .\n\n      - name: Suggest\n        uses: reviewdog/action-suggester@v1\n        with:\n          level: error\n          fail_level: error\n          tool_name: air\n"
  },
  {
    "path": ".github/workflows/pkgdown.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  schedule:\n    # * is a special character in YAML so we have to quote this string\n    # 13:30 (UTC) - 7 or 8 (offset for Pacific) = 5:30 or 6:30 am\n    # try to avoid overlap other jobs in googledrive and googlesheets4 because quota\n    # https://crontab.guru is your friend\n    - cron:  '30 13 * * *'\n  release:\n    types: [published]\n  workflow_dispatch:\n\nname: pkgdown.yaml\n\npermissions: read-all\n\njobs:\n  pkgdown:\n    runs-on: ubuntu-latest\n    if: |\n      github.event_name == 'schedule' ||\n      github.event_name == 'workflow_dispatch' ||\n      github.event_name == 'release' ||\n      contains(github.event.head_commit.message, '[pkgdown]')\n\n    env:\n      GOOGLEDRIVE_KEY: ${{ secrets.GOOGLEDRIVE_KEY }}\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    permissions:\n      contents: write\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-pandoc@v2\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::pkgdown, local::.\n          needs: website\n\n      - name: Build site\n        run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE)\n        shell: Rscript {0}\n\n      - name: Deploy to GitHub pages 🚀\n        if: github.event_name != 'pull_request'\n        uses: JamesIves/github-pages-deploy-action@v4.5.0\n        with:\n          clean: false\n          branch: gh-pages\n          folder: docs\n"
  },
  {
    "path": ".github/workflows/pr-commands.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  issue_comment:\n    types: [created]\n\nname: pr-commands.yaml\n\npermissions: read-all\n\njobs:\n  document:\n    if: ${{ github.event.issue.pull_request && (github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER') && startsWith(github.event.comment.body, '/document') }}\n    name: document\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    permissions:\n      contents: write\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/pr-fetch@v2\n        with:\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::roxygen2\n          needs: pr-document\n\n      - name: Document\n        run: roxygen2::roxygenise()\n        shell: Rscript {0}\n\n      - name: commit\n        run: |\n          git config --local user.name \"$GITHUB_ACTOR\"\n          git config --local user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n          git add man/\\* NAMESPACE\n          git commit -m 'Document'\n\n      - uses: r-lib/actions/pr-push@v2\n        with:\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n\n  style:\n    if: ${{ github.event.issue.pull_request && (github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER') && startsWith(github.event.comment.body, '/style') }}\n    name: style\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    permissions:\n      contents: write\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/pr-fetch@v2\n        with:\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n\n      - uses: r-lib/actions/setup-r@v2\n\n      - name: Install dependencies\n        run: install.packages(\"styler\")\n        shell: Rscript {0}\n\n      - name: Style\n        run: styler::style_pkg()\n        shell: Rscript {0}\n\n      - name: commit\n        run: |\n          git config --local user.name \"$GITHUB_ACTOR\"\n          git config --local user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n          git add \\*.R\n          git commit -m 'Style'\n\n      - uses: r-lib/actions/pr-push@v2\n        with:\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/test-coverage.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n  schedule:\n    # * is a special character in YAML so we have to quote this string\n    # 2am Pacific = 10am UTC\n    # https://crontab.guru is your friend\n    - cron:  '0 10 * * *'\n\nname: test-coverage.yaml\n\npermissions: read-all\n\njobs:\n  test-coverage:\n    runs-on: ubuntu-latest\n    if: \"github.event_name == 'schedule' || contains(github.event.head_commit.message, '[covr]')\"\n\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n      GOOGLEDRIVE_KEY: ${{ secrets.GOOGLEDRIVE_KEY }}\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::covr, any::xml2\n          needs: coverage\n\n      - name: Test coverage\n        run: |\n          cov <- covr::package_coverage(\n            quiet = FALSE,\n            clean = FALSE,\n            install_path = file.path(normalizePath(Sys.getenv(\"RUNNER_TEMP\"), winslash = \"/\"), \"package\")\n          )\n          print(cov)\n          covr::to_cobertura(cov)\n        shell: Rscript {0}\n\n      - uses: codecov/codecov-action@v5\n        with:\n          # Fail if error if not on PR, or if on PR and token is given\n          fail_ci_if_error: ${{ github.event_name != 'pull_request' || secrets.CODECOV_TOKEN }}\n          files: ./cobertura.xml\n          plugins: noop\n          disable_search: true\n          token: ${{ secrets.CODECOV_TOKEN }}\n\n      - name: Show testthat output\n        if: always()\n        run: |\n          ## --------------------------------------------------------------------\n          find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \\; || true\n        shell: bash\n\n      - name: Upload test results\n        if: failure()\n        uses: actions/upload-artifact@v4\n        with:\n          name: coverage-test-failures\n          path: ${{ runner.temp }}/package\n"
  },
  {
    "path": ".github/workflows/with-auth.yml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\nname: with-auth\n\npermissions: read-all\n\njobs:\n  with-auth:\n    runs-on: ubuntu-latest\n\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-pandoc@v2\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          r-version: release\n          http-user-agent: 'release'\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::rcmdcheck\n          needs: check\n\n      - uses: r-lib/actions/check-r-package@v2\n        env:\n          GOOGLEDRIVE_KEY: ${{ secrets.GOOGLEDRIVE_KEY }}\n        with:\n          upload-snapshots: true\n          build_args: 'c(\"--no-manual\",\"--compact-vignettes=gs+qpdf\")'\n"
  },
  {
    "path": ".gitignore",
    "content": "sandbox\nscratch.R\n*.Rproj.user\n.Rhistory\n.Rproj.user\n.RData\n.httr-oauth*\n.Rapp.history\n*token.rds\ninst/doc\ndocs/\ninternal\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n    \"recommendations\": [\n        \"Posit.air-vscode\"\n    ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"[r]\": {\n        \"editor.formatOnSave\": true,\n        \"editor.defaultFormatter\": \"Posit.air-vscode\"\n    },\n    \"[quarto]\": {\n        \"editor.formatOnSave\": true,\n        \"editor.defaultFormatter\": \"quarto.quarto\"\n    }\n}\n"
  },
  {
    "path": "DESCRIPTION",
    "content": "Package: googledrive\nTitle: An Interface to Google Drive\nVersion: 2.1.2.9000\nAuthors@R: c(\n    person(\"Lucy\", \"D'Agostino McGowan\", , role = \"aut\"),\n    person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"),\n           comment = c(ORCID = \"0000-0002-6983-2759\")),\n    person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"))\n  )\nDescription: Manage Google Drive files from R.\nLicense: MIT + file LICENSE\nURL: https://googledrive.tidyverse.org,\n    https://github.com/tidyverse/googledrive\nBugReports: https://github.com/tidyverse/googledrive/issues\nDepends:\n    R (>= 4.1)\nImports:\n    cli (>= 3.0.0),\n    gargle (>= 1.6.0),\n    glue (>= 1.4.2),\n    httr,\n    jsonlite,\n    lifecycle,\n    magrittr,\n    pillar (>= 1.9.0),\n    purrr (>= 1.0.1),\n    rlang (>= 1.0.2),\n    tibble (>= 2.0.0),\n    utils,\n    uuid,\n    vctrs (>= 0.3.0),\n    withr\nSuggests:\n    curl,\n    dplyr (>= 1.0.0),\n    knitr,\n    rmarkdown,\n    spelling,\n    testthat (>= 3.1.5)\nVignetteBuilder:\n    knitr\nConfig/Needs/website:\n    tidyverse,\n    tidyverse/tidytemplate\nConfig/testthat/edition: 3\nEncoding: UTF-8\nLanguage: en-US\nRoxygen: list(markdown = TRUE)\nRoxygenNote: 7.3.3\n"
  },
  {
    "path": "LICENSE",
    "content": "YEAR: 2023\nCOPYRIGHT HOLDER: googledrive authors\n"
  },
  {
    "path": "LICENSE.md",
    "content": "# MIT License\n\nCopyright (c) 2023 googledrive authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "NAMESPACE",
    "content": "# Generated by roxygen2: do not edit by hand\n\nS3method(\"[\",dribble)\nS3method(\"names<-\",dribble)\nS3method(as_dribble,\"NULL\")\nS3method(as_dribble,character)\nS3method(as_dribble,data.frame)\nS3method(as_dribble,default)\nS3method(as_dribble,drive_id)\nS3method(as_dribble,list)\nS3method(as_id,\"NULL\")\nS3method(as_id,character)\nS3method(as_id,data.frame)\nS3method(as_id,default)\nS3method(as_id,dribble)\nS3method(as_id,drive_id)\nS3method(as_shared_drive,\"NULL\")\nS3method(as_shared_drive,character)\nS3method(as_shared_drive,data.frame)\nS3method(as_shared_drive,default)\nS3method(as_shared_drive,dribble)\nS3method(as_shared_drive,drive_id)\nS3method(as_shared_drive,list)\nS3method(as_tibble,dribble)\nS3method(format,drive_user)\nS3method(gargle_map_cli,dribble)\nS3method(gargle_map_cli,drive_id)\nS3method(pillar_shaft,drive_id)\nS3method(print,drive_user)\nS3method(tbl_sum,dribble)\nS3method(vec_cast,character.drive_id)\nS3method(vec_cast,data.frame.dribble)\nS3method(vec_cast,dribble.data.frame)\nS3method(vec_cast,dribble.dribble)\nS3method(vec_cast,dribble.tbl_df)\nS3method(vec_cast,drive_id.character)\nS3method(vec_cast,drive_id.drive_id)\nS3method(vec_cast,tbl_df.dribble)\nS3method(vec_ptype2,character.drive_id)\nS3method(vec_ptype2,data.frame.dribble)\nS3method(vec_ptype2,dribble.data.frame)\nS3method(vec_ptype2,dribble.dribble)\nS3method(vec_ptype2,dribble.tbl_df)\nS3method(vec_ptype2,drive_id.character)\nS3method(vec_ptype2,drive_id.drive_id)\nS3method(vec_ptype2,tbl_df.dribble)\nS3method(vec_ptype_abbr,drive_id)\nS3method(vec_restore,dribble)\nexport(\"%>%\")\nexport(as_dribble)\nexport(as_id)\nexport(as_shared_drive)\nexport(as_team_drive)\nexport(confirm_dribble)\nexport(confirm_single_file)\nexport(confirm_some_files)\nexport(do_paginated_request)\nexport(do_request)\nexport(drive_about)\nexport(drive_api_key)\nexport(drive_auth)\nexport(drive_auth_config)\nexport(drive_auth_configure)\nexport(drive_browse)\nexport(drive_cp)\nexport(drive_create)\nexport(drive_deauth)\nexport(drive_download)\nexport(drive_empty_trash)\nexport(drive_endpoint)\nexport(drive_endpoints)\nexport(drive_example)\nexport(drive_example_local)\nexport(drive_example_remote)\nexport(drive_examples_local)\nexport(drive_examples_remote)\nexport(drive_extension)\nexport(drive_fields)\nexport(drive_find)\nexport(drive_get)\nexport(drive_has_token)\nexport(drive_link)\nexport(drive_ls)\nexport(drive_mime_type)\nexport(drive_mkdir)\nexport(drive_mv)\nexport(drive_oauth_app)\nexport(drive_oauth_client)\nexport(drive_publish)\nexport(drive_put)\nexport(drive_read_raw)\nexport(drive_read_string)\nexport(drive_rename)\nexport(drive_reveal)\nexport(drive_rm)\nexport(drive_scopes)\nexport(drive_share)\nexport(drive_share_anyone)\nexport(drive_token)\nexport(drive_trash)\nexport(drive_unpublish)\nexport(drive_untrash)\nexport(drive_update)\nexport(drive_upload)\nexport(drive_user)\nexport(expose)\nexport(is_dribble)\nexport(is_folder)\nexport(is_folder_shortcut)\nexport(is_mine)\nexport(is_native)\nexport(is_parental)\nexport(is_shared_drive)\nexport(is_shortcut)\nexport(is_team_drive)\nexport(local_drive_quiet)\nexport(no_file)\nexport(prep_fields)\nexport(request_generate)\nexport(request_make)\nexport(shared_drive_create)\nexport(shared_drive_find)\nexport(shared_drive_get)\nexport(shared_drive_rm)\nexport(shared_drive_update)\nexport(shortcut_create)\nexport(shortcut_resolve)\nexport(single_file)\nexport(some_files)\nexport(team_drive_create)\nexport(team_drive_find)\nexport(team_drive_get)\nexport(team_drive_rm)\nexport(team_drive_update)\nexport(with_drive_quiet)\nimport(rlang)\nimport(vctrs)\nimportFrom(gargle,bulletize)\nimportFrom(gargle,gargle_map_cli)\nimportFrom(glue,glue)\nimportFrom(glue,glue_collapse)\nimportFrom(glue,glue_data)\nimportFrom(lifecycle,deprecated)\nimportFrom(magrittr,\"%>%\")\nimportFrom(pillar,pillar_shaft)\nimportFrom(purrr,map)\nimportFrom(purrr,map2)\nimportFrom(purrr,map_chr)\nimportFrom(purrr,map_if)\nimportFrom(purrr,map_int)\nimportFrom(purrr,map_lgl)\nimportFrom(purrr,pluck)\nimportFrom(tibble,as_tibble)\nimportFrom(tibble,tbl_sum)\nimportFrom(tibble,tibble)\n"
  },
  {
    "path": "NEWS.md",
    "content": "# googledrive (development version)\n\n# googledrive 2.1.2\n\n* `drive_upload()` and `drive_download()` support the conversion of a local\n  markdown file to a Google Doc and vice versa (#465, @ateucher).\n\n# googledrive 2.1.1\n\n* `drive_auth(subject =)` is a new argument that can be used with\n  `drive_auth(path =)`, i.e. when using a service account. The `path` and\n  `subject` arguments are ultimately processed by\n  `gargle::credentials_service_account()` and support the use of a service\n  account to impersonate a normal user (#413).\n\n* All requests now route through `gargle::request_retry()` (#380).\n\n* `drive_scopes()` is a new function to access scopes relevant to the Drive API.\n  When called without arguments, `drive_scopes()` returns a named vector of\n  scopes, where the names are the associated short aliases. `drive_scopes()` can\n  also be called with a character vector; any element that's recognized as a\n  short alias is replaced with the associated full scope (#430).\n  \n* Various internal changes to sync up with gargle v1.5.0.\n\n# googledrive 2.1.0\n\n## Syncing up with gargle\n\nVersion 1.3.0 of gargle introduced some changes around OAuth and googledrive is syncing up that:\n\n* `drive_oauth_client()` is a new function to replace the now-deprecated `drive_oauth_app()`.\n* The new `client` argument of `drive_auth_configure()` replaces the now-deprecated `app` argument.\n* The documentation of `drive_auth_configure()` emphasizes that the preferred way to \"bring your own OAuth client\" is by providing the JSON downloaded from Google Developers Console.\n\n## Shared drives\n\n`drive_ls(recursive = TRUE)` now works when the target folder is on a shared drive (#265, @Falnesio).\n\n`drive_mv()` no longer errors with \"A shared drive item must have exactly one parent.\" when moving a file on a shared drive (#377).\n\n## Other\n\n`drive_auth()` now warns if the user specifies both `email` and `path`, because this is almost always an error (#420).\n\n`drive_auth_config()` was deprecated in googledrive 1.0.0 (released 2019-08-19) and is now defunct.\n\n`drive_example()` was deprecated in googledrive 2.0.0 (released 2021-07-08) and is now defunct.\n\n# googledrive 2.0.0\n\n## Team Drives are dead! Long live shared drives!\n\nGoogle Drive has rebranded Team Drives as **shared drives**.\nWhile anyone can have a **My Drive**, shared drives are only available for Google Workspace (previously known as G Suite).\nShared drives and the files within are owned by a team/organization, as opposed to an individual.\n\nIn googledrive, all `team_drive_*()` functions have been deprecated, in favor of\ntheir `shared_drive_*()` successors.\nLikewise, any `team_drive` argument has been deprecated, in favor of a new `shared_drive` argument.\nThe terms used to describe which collections to search have also changed slightly, with `\"allDrives\"` replacing `\"all\"`.\nThis applies to the `corpus` argument of `drive_find()` and `drive_get()`.\n\nWhere to learn more:\n\n* [Team Drives is being renamed to shared drives](https://workspaceupdates.googleblog.com/2019/04/shared-drives.html) from Google Workspace blog\n* [Upcoming changes to the Google Drive API and Google Picker API](https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api) from the Google Cloud blog\n\n## Single parenting and shortcuts\n\nAs of 2020-09-30, Drive no longer allows a file to be placed in multiple folders; going forward, every file will have exactly 1 parent folder.\nIn many cases that parent is just the top-level or root folder of your \"My Drive\" or of a shared drive.\n\nThis change has been accompanied by the introduction of file **shortcuts**, which function much like symbolic or \"soft\" links.\nShortcuts are the new way to make a file appear to be in more than one place or, said another way, the new way for one Drive file to be associated with more than one Drive filepath.\nA shortcut is a special type of Drive file, characterized by the `application/vnd.google-apps.shortcut` MIME type.\nYou can make a shortcut to any Drive file, including to a Drive folder.\n\nDrive has been migrating existing files to the one-parent state, i.e., \"single parenting\" them.\nDrive selects the most suitable parent folder to keep, \"based on the hierarchy's properties\", and replaces any other parent-child relationships with a shortcut.\n\nNew functions related to shortcuts:\n\n* `shortcut_create()`: creates a shortcut to a specific Drive file (or folder).\n* `shortcut_resolve()`: resolves a shortcut to its target, i.e. the file it\n  refers to. Works for multiple files at once, i.e. the input can be a mix of\n  shortcuts and non-shortcuts. The non-shortcuts are passed through and the\n  shortcuts are replaced by their targets.\n  \nHow interacts with googledrive's support for specifying file by filepath:\n\n* Main principle: shortcuts are first-class Drive files that we assume users\n  will need to manipulate with googledrive. In general, there is no automatic\n  resolution to the target file.\n* `drive_reveal(what = \"path\")` returns the canonical path, i.e. there will be\n  no shortcuts among the non-terminal \"folder\" parts of the returned path.\n* `drive_get(path = \"foo/\")` can retrieve a folder named \"foo\" or a shortcut\n  named \"foo\", whose target is a folder.\n* When a shortcut-to-a-folder is specified as the `path`, in a context where it\n  unambiguously specifies a parent folder, the `path` **is** auto-resolved to\n  its target folder. This is the exception to the \"no automatic resolution\"\n  rule. Functions affected:\n  - `drive_ls(path, ...)`\n  - `drive_create(name, path, ...)` and its convenience wrappers `drive_mkdir()`\n    and `shortcut_create()`\n  - `drive_cp(file, path, ...)`\n  - `drive_mv(file, path, ...)`\n  - `drive_upload(media, path, ...)` and its close friend `drive_put()`\n\nFurther reading about changes to the Drive folder model:\n\n* [Simplifying Google Drive’s folder structure and sharing models](https://workspace.google.com/blog/product-announcements/simplifying-google-drives-folder-structure-and-sharing-models)\n* [Single-parenting behavior changes](https://developers.google.com/drive/api/v3/ref-single-parent)\n* [Create a shortcut to a Drive file](https://developers.google.com/drive/api/v3/shortcuts)\n* Find files & folders with Google Drive shortcuts: `https://support.google.com/drive/answer/9700156`\n\n## User interface\n\nThe user interface has gotten more stylish, thanks to the cli package (<https://cli.r-lib.org>).\nAll informational messages, warnings, and errors are now emitted via cli, which uses rlang's condition functions under-the-hood.\n\n`googledrive_quiet` is a new option to suppress informational messages from googledrive.\nUnless it's explicitly set to `TRUE`, the default is to message.\n\nThe `verbose` argument of all `drive_*()` functions is deprecated and will be removed in a future release.\nIn the current release, `verbose = FALSE` is still honored, but generates a warning.\n\n`local_drive_quiet()` and `with_drive_quiet()` are [withr-style](https://withr.r-lib.org) convenience helpers for setting `googledrive_quiet = TRUE` for some limited scope.\n\n## Other changes\n\n* We now share a variety of world-readable, persistent example files on Drive,\n  for use in examples and documentation. These remote example files complement\n  the local example files that were already included in googledrive.\n  \n  `drive_example()` is deprecated in favor of these accessors for example files:\n  - Plural forms:`drive_examples_remote()`, `drive_examples_local()`\n  - Singular forms: `drive_example_remote()`, `drive_example_local()`\n\n* `drive_read_string()` and `drive_read_raw()` are new functions that read the\n  content of a Drive file directly into R, skipping the step of downloading to a\n  local file (#81).\n\n* `drive_reveal(what = \"property_name\")` now works for any property found in\n  the file metadata stored in the `drive_resource` column. The new column is\n  also simplified in more cases now, e.g. to `character` or `logical`. If the\n  `property_name` suggests it's a date-time, we return `POSIXct`.\n\n* We've modernized the mechanisms by which the `dribble` class is (or is not)\n  retained by various data frame operations.\n  This boils down to updating or adding methods used by the base, dplyr,\n  pillar/tibble, and vctrs packages.\n  \n  We focus on compatibility with dplyr >= 1.0.0, which was released a year ago.\n  googledrive only Suggests dplyr, so all this really means is that `dribble`\n  manipulation via dplyr now works best with dplyr >= 1.0.0.\n\n* The `drive_id` S3 class is now implemented more fully, using the vctrs\n  package (#93, #364):\n\n  - The `drive_id` class will persist after mundane operations, like subsetting.\n  - You can no longer put strings that are obviously invalid into a `drive_id`\n    object.\n  - The `id` column of a `dribble` is now an instance of `drive_id`.\n\n## Dependency changes\n\ncli, lifecycle, and withr are new in Imports.\n\npillar and vctrs are new in Imports, but were already indirect hard dependencies via tibble.\n\nmockr is new in Suggests.\n\ncurl moves from Imports to Suggests, but remains an indirect hard dependency.\n\n# googledrive 1.0.1\n\nPatch release to modify a test for compatibility with an upcoming release of gargle.\n\n`drive_share()` gains awareness of the `\"fileOrganizer\"` role (#302).\n\nBetter handling of filenames that include characters that have special meaning in a regular expression (#292).\n\n`drive_find()` explicitly checks for and eliminates duplicate records for a file ID, guarding against repetition in the paginated results returned by the API. It would seem that this should never happen, but there is some indication that it does. (#272, #277, #279, #281)\n\n`drive_share_anyone()` is a new convenience wrapper that makes a file readable by \"anyone with a link\".\n\n`as_tibble()` method for `dribble` objects now passes `...` through, which could apply, for example, to tibble's `.name_repair` argument.\n\n# googledrive 1.0.0\n\nThe release of version 1.0.0 marks two events:\n\n  * The overall design of googledrive has survived ~2 years on CRAN, with very little need for change. The API and feature set is fairly stable.\n  * There are changes in the auth interface that are not backwards compatible.\n  \nThere is also new functionality that makes it less likely you'll create multiple files with the same name, without actually meaning to.\n\n## Auth from gargle\n\ngoogledrive's auth functionality now comes from the [gargle package](https://gargle.r-lib.org), which provides R infrastructure to work with Google APIs, in general. The same transition is happening in several other packages, such as [bigrquery](https://bigrquery.r-dbi.org) and [gmailr](https://gmailr.r-lib.org). This makes user interfaces more consistent and makes two new token flows available in googledrive:\n\n  * Application Default Credentials\n  * Service account tokens from the metadata server available to VMs running on GCE\n  \nWhere to learn more:\n  \n  * Help for [`drive_auth()`](https://googledrive.tidyverse.org/reference/drive_auth.html) *all that most users need*\n  * *details for more advanced users*\n    - Bring your own OAuth app or API key *article no longer available*\n    - [How to get your own API credentials](https://gargle.r-lib.org/articles/get-api-credentials.html) \n    - [Non-interactive auth](https://gargle.r-lib.org/articles/non-interactive-auth.html)\n    - [Auth when using R in the browser](https://gargle.r-lib.org/articles/auth-from-web.html)\n    - [How gargle gets tokens](https://gargle.r-lib.org/articles/how-gargle-gets-tokens.html)\n    - [Managing tokens securely](https://gargle.r-lib.org/articles/articles/managing-tokens-securely.html)\n\n### Changes that a user will notice\n\nOAuth2 tokens are now cached at the user level, by default, instead of in `.httr-oauth` in the current project. We recommend that you delete any vestigial `.httr-oauth` files lying around your googledrive projects and re-authorize googledrive, i.e. get a new token, stored in the new way.\n\ngoogledrive uses a new OAuth \"app\", owned by a verified Google Cloud Project entitled \"Tidyverse API Packages\", which is the project name you will see on the OAuth consent screen. See our new [Privacy Policy](https://www.tidyverse.org/google_privacy_policy/) for details.\n\nThe local OAuth2 token key-value store now incorporates the associated Google user when indexing, which makes it easier to switch between Google identities.\n\nThe arguments and usage of `drive_auth()` have changed.\n\n  * Previous signature (v0.1.3 and earlier)\n  \n    ``` r  \n    drive_auth(\n      oauth_token = NULL,                       # use `token` now\n      service_token = NULL,                     # use `path` now\n      reset = FALSE,                            \n      cache = getOption(\"httr_oauth_cache\"),\n      use_oob = getOption(\"httr_oob_default\"),\n      verbose = TRUE\n    )\n    ```\n  \n  * Current signature (>= v1.0.0)\n  \n    ``` r\n    drive_auth(\n      email = gargle::gargle_oauth_email(),             # NEW!\n      path = NULL,                                      # was `service_token`\n      scopes = \"https://www.googleapis.com/auth/drive\", # NEW!\n      cache = gargle::gargle_oauth_cache(),\n      use_oob = gargle::gargle_oob_default(),\n      token = NULL                                      # was `oauth_token`\n    )\n    ```\n\nFor full details see the resources listed in *Where to learn more* above. The change that probably affects the most code is the way to provide a service account token:\n  - Previously: `drive_auth(service_token = \"/path/to/your/service-account-token.json\")` (v0.1.3 and earlier)\n  - Now: `drive_auth(path = \"/path/to/your/service-account-token.json\")` (>= v1.0.0)\n\nAuth configuration has also changed:\n\n  * `drive_auth_configure()` is a variant of the now-deprecated `drive_auth_config()` whose explicit and only job is to *set* aspects of the configuration, i.e. the OAuth app or API key.\n    - Use `drive_oauth_app()` (new) and `drive_api_key()` to *retrieve* a user-configured app or API key, if such exist.\n    - These functions no longer return built-in auth assets, although built-in assets still exist and are used in the absence of user configuration.\n  * `drive_deauth()` is how you go into a de-authorized state, i.e. send an API key in lieu of a token.\n  \n`drive_has_token()` is a new helper that simply reports whether a token is in place, without triggering the auth flow.\n\nThere are other small changes to the low-level developer-facing API:\n\n  - `generate_request()` has been renamed to `request_generate()`.\n  - `make_request()` had been renamed to `request_make()` and is a very thin wrapper around `gargle::request_make()` that only adds googledrive's user agent.\n  - `build_request()` has been removed. If you can't do what you need with `request_generate()`, use `gargle::request_develop()` or `gargle::request_build()` directly.\n  - `process_response()` has been removed. Instead, use `gargle::response_process(response)`, as we do inside googledrive.\n  \n## `overwrite = NA / TRUE / FALSE` and `drive_put()`\n\nGoogle Drive doesn't impose a 1-to-1 relationship between files and filepaths, the way your local file system does. Therefore, when working via the Drive API (instead of in the browser), it's fairly easy to create multiple Drive files with the same name or filepath, without actually meaning to. This is perfectly valid on Drive, which identifies file by ID, but can be confusing and undesirable for humans.\n\ngoogledrive v1.0.0 offers some new ways to fight this:\n\n  * All functions that create a new item or rename/move an existing item have\n    gained an `overwrite` argument.\n  * `drive_put()` is a new convenience wrapper that figures out whether to call\n    `drive_upload()` or `drive_update()`.\n    \nChanges inspired by #230.\n\n### `overwrite = NA / TRUE / FALSE`\n\nThese functions gain an `overwrite` argument:\n\n  * `drive_create()` *this whole function is new*\n  * `drive_cp()`\n  * `drive_mkdir()`\n  * `drive_mv()`\n  * `drive_rename()`\n  * `drive_upload()`\n  \nThe default of `overwrite = NA` corresponds to the current behaviour, which is to \"Just. Do. It.\", i.e. to not consider pre-existing files at all.\n\n`overwrite = TRUE` requests to move a pre-existing file at the target filepath to the trash, prior to creating the new item. If 2 or more files are found, an error is thrown, because it's not clear which one(s) to trash.\n\n`overwrite = FALSE` means the new item will only be created if there is no pre-existing file at that filepath.\n\nExistence checks based on filepath (or name) can be expensive. This is why the default is `overwrite = NA`, in addition to backwards compatibility.\n\n### `drive_put()`\n\nSometimes you have a file you will repeatedly send to Drive, i.e. the first time you run an analysis, you create the file and, when you re-run it, you update the file. Previously this was hard to express with googledrive.\n\n`drive_put()` is useful here and refers to the HTTP verb `PUT`: create the thing if it doesn't exist or, if it does, replace its contents. A good explanation of `PUT` is [RESTful API Design -- PUT vs PATCH](https://medium.com/backticks-tildes/restful-api-design-put-vs-patch-4a061aa3ed0b).\n\nIn pseudo-code, here's the basic idea of `drive_put()`:\n\n``` r\ntarget_filepath <- <determined from arguments `path`, `name`, and `media`>\nhits <- <get all Drive files at target_filepath>\nif (no hits) {\n drive_upload(media, path, name, type, ..., verbose)\n} else if (exactly 1 hit) {\n drive_update(hit, media, ..., verbose)\n} else {\n ERROR\n}\n```\n\n## Other changes\n\nAll functions that support `...` as a way to pass more parameters to the Drive API now have \"tidy dots semantics\": `!!!` is supported for splicing and `!!` can be used on the LHS of `:=`. Full docs are in [dynamic dots](https://rlang.r-lib.org/reference/dyn-dots.html).\n\n`drive_find()` now sorts by \"recency\", by default.\n\n`drive_create()` is a new function that creates a new empty file, with an optional file type specification (#258, @ianmcook). `drive_mkdir()` becomes a thin wrapper around `drive_create()`, with the file type hard-wired to \"folder\".\n\nIn `drive_mkdir()`, the optional parent directory is now known as `path` instead of `parent`. This is more consistent with everything else in googledrive, which became very obvious when adding `drive_create()` and the general `overwrite` functionality.\n\n`drive_empty_trash()` now exploits the correct endpoint (as opposed to deleting individual files) and is therefore much faster (#203).\n\nColaboratory notebooks now have some MIME type support, in terms of the `type` argument in various functions (<https://colab.research.google.com/>). The internal table of known MIME types includes `\"application/vnd.google.colab\"`, which is associated with the file extension `.ipynb` and the human-oriented nickname `\"colab\"` (#207).\n\n`drive_endpoints()` gains a singular friend, `drive_endpoint()` which returns exactly one endpoint. These helpers index into the internal list of Drive API endpoints with `[` and `[[`, respectively.\n\n## Dependency changes\n\nR 3.1 is no longer explicitly supported or tested. Our general practice is to support the current release (3.6), devel, and the 4 previous versions of R (3.5, 3.4, 3.3, 3.2). See [Which versions of R do tidyverse packages support?](https://www.tidyverse.org/blog/2019/04/r-version-support/).\n\ngargle and magrittr are newly Imported.\n\nrprojroot has been removed from Suggests, because we can now use a version of testthat recent enough to offer `testthat::test_path()`.\n\n# googledrive 0.1.3\n\nMinor patch release for compatibility with the imminent release of purrr 0.3.0.\n\n# googledrive 0.1.2\n\n* Internal usage of `glue::collapse()` modified to call `glue::glue_collapse()` if glue v1.3.0 or later is installed and `glue::collapse()` otherwise. Eliminates a deprecation warning emanating from glue. (#222 @jimhester)\n\n# googledrive 0.1.1\n\n* initial CRAN release\n"
  },
  {
    "path": "R/aaa.R",
    "content": "# environment to hold data about the Drive API\n.drive <- new.env(parent = emptyenv())\n\n.drive$translate_mime_types <-\n  system.file(\n    \"extdata\",\n    \"data\",\n    \"translate_mime_types.csv\",\n    package = \"googledrive\",\n    mustWork = TRUE\n  ) |>\n  utils::read.csv(stringsAsFactors = FALSE) |>\n  as_tibble()\n\n.drive$mime_tbl <-\n  system.file(\n    \"extdata\",\n    \"data\",\n    \"mime_tbl.csv\",\n    package = \"googledrive\",\n    mustWork = TRUE\n  ) |>\n  utils::read.csv(stringsAsFactors = FALSE) |>\n  as_tibble()\n\n.drive$files_fields <-\n  system.file(\n    \"extdata\",\n    \"data\",\n    \"files_fields.csv\",\n    package = \"googledrive\",\n    mustWork = TRUE\n  ) |>\n  utils::read.csv(stringsAsFactors = FALSE) |>\n  as_tibble()\n\n# environment to hold other data that is convenient to cache\n.googledrive <- new.env(parent = emptyenv())\n"
  },
  {
    "path": "R/camelCase.R",
    "content": "# camelCase() and toCamel() taken from\n# https://github.com/r-dbi/bigrquery/blob/main/R/camelCase.R\n\n# in theory, belongs in gargle\n# but then we'd need to export it and I'm not sure it's worth it\n# https://github.com/r-lib/gargle\n\n# camelCase vs snake_case policy\n# ** all arguments in functions exported by googledrive shall be snake_case**\n#\n# HOWEVER, the Drive API is camelCase\n# both wrt parameter names and many of their string values\n# examples: `pageSize`, `mimeType`, `corpora = \"allDrives\"`\n# therefore, whenever we pass `...` through, we process with toCamel()\n# this means user can say `page_size = 20` and we send `pageSize = 20`\n#\n# we do not trumpet this snake_case to camelCase conversion in the docs,\n# because many of the strings/values we handle are camelCase and we ARE not\n# going to alter them\n# there's too much potential for confusion\n#\n# at this point, snake_case to camelCase is a very quiet feature\ncamelCase <- function(x) {\n  gsub(\"_(.)\", \"\\\\U\\\\1\", x, perl = TRUE)\n}\n\ntoCamel <- function(x) {\n  if (is.list(x)) {\n    x[] <- lapply(x, toCamel)\n  }\n\n  if (!is.null(names(x))) {\n    names(x) <- camelCase(names(x))\n  }\n\n  x\n}\n\n# added later\nsnake_case <- function(x) {\n  gsub(\"([a-z0-9])([A-Z])\", \"\\\\1_\\\\L\\\\2\", x, perl = TRUE)\n}\n"
  },
  {
    "path": "R/compat-dplyr.R",
    "content": "dribble_maybe_reconstruct <- function(data, template) {\n  if (dribble_is_reconstructable(data)) {\n    # in workflowsets, davis uses new_workflow_set0(x) here\n    new_dribble(data)\n  } else {\n    # @davis tells me there can be internal-to-vctrs-or-dplyr situations where\n    # reconstruction starts with a conformable list, instead of data.frame\n    new_tibble0(data)\n  }\n}\n\ndribble_is_reconstructable <- function(data) {\n  # see above for why this is is_list() instead of is.data.frame()\n  is_list(data) &&\n    has_dribble_cols(data) &&\n    has_dribble_coltypes(data) &&\n    id_can_be_drive_id(data$id) &&\n    has_drive_resource(data)\n}\n\nnew_tibble0 <- function(x, ..., class = NULL) {\n  # Handle the 0-column case correctly by using `new_data_frame()`.\n  # This also correctly strips any attributes except `names` off `x`.\n  x <- new_data_frame(x)\n  tibble::new_tibble(x, nrow = nrow(x), class = class)\n}\n"
  },
  {
    "path": "R/compat-vctrs.R",
    "content": "# based on https://github.com/tidymodels/workflowsets/blob/main/R/compat-vctrs.R\n\n# ------------------------------------------------------------------------------\n\n# `vec_restore()`\n#\n# Called at the end of `vec_slice()` and `vec_ptype()` after all slicing has\n# been done on the proxy object.\n\n#' @export\nvec_restore.dribble <- function(x, to, ...) {\n  dribble_maybe_reconstruct(x)\n}\n\n# ------------------------------------------------------------------------------\n\n# `vec_ptype2()`\n#\n# When combining two dribbles together, `x` and `y` will be zero-row slices\n# which should always result in a new dribble, as long as\n# `df_ptype2()` can compute a common type.\n#\n# Combining a dribble with a tibble/data.frame will only ever happen if\n# the user calls `vec_c()` or `vec_rbind()` with one of each of those inputs.\n# Although I could probably make this work, it feels pretty weird and exotic\n# and I think that user, if they even exist, should just turn that \"other\"\n# tibble/data.frame into a dribble first.\n# So I'll follow workflowsets and not attempt to return dribble for these\n# combinations.\n\n#' @export\nvec_ptype2.dribble.dribble <- function(x, y, ..., x_arg = \"\", y_arg = \"\") {\n  out <- df_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg)\n  dribble_maybe_reconstruct(out)\n}\n#' @export\nvec_ptype2.dribble.tbl_df <- function(x, y, ..., x_arg = \"\", y_arg = \"\") {\n  tib_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg)\n}\n#' @export\nvec_ptype2.tbl_df.dribble <- function(x, y, ..., x_arg = \"\", y_arg = \"\") {\n  tib_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg)\n}\n#' @export\nvec_ptype2.dribble.data.frame <- function(x, y, ..., x_arg = \"\", y_arg = \"\") {\n  tib_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg)\n}\n#' @export\nvec_ptype2.data.frame.dribble <- function(x, y, ..., x_arg = \"\", y_arg = \"\") {\n  tib_ptype2(x, y, ..., x_arg = x_arg, y_arg = y_arg)\n}\n\n# ------------------------------------------------------------------------------\n\n# `vec_cast()`\n#\n# These methods are designed with `vec_ptype2()` in mind.\n#\n# Casting from one dribble to another will happen \"automatically\" when\n# two dribbles are combined with `vec_c()`. The common type will be\n# computed with `vec_ptype2()`, then each input will be `vec_cast()` to that\n# common type. It should always be possible to reconstruct the dribble\n# if `df_cast()` is able to cast the underlying data frames successfully.\n#\n# Casting a tibble or data.frame to a dribble should never happen\n# automatically, because the ptype2 methods always push towards\n# tibble / data.frame. Since it is so unlikely that this will be done\n# correctly, we don't ever allow it.\n#\n# Casting a dribble to a tibble or data.frame is easy, the underlying\n# vctrs function does the work for us. This is used when doing\n# `vec_c(<dribble>, <tbl>)`, as the `vec_ptype2()` method will compute\n# a common type of tibble, and then each input will be cast to tibble.\n\n#' @export\nvec_cast.dribble.dribble <- function(x, to, ..., x_arg = \"\", to_arg = \"\") {\n  out <- df_cast(x, to, ..., x_arg = x_arg, to_arg = to_arg)\n  dribble_maybe_reconstruct(out)\n}\n#' @export\nvec_cast.dribble.tbl_df <- function(x, to, ..., x_arg = \"\", to_arg = \"\") {\n  stop_incompatible_cast_dribble(x, to, x_arg = x_arg, to_arg = to_arg)\n}\n#' @export\nvec_cast.tbl_df.dribble <- function(x, to, ..., x_arg = \"\", to_arg = \"\") {\n  tib_cast(x, to, ..., x_arg = x_arg, to_arg = to_arg)\n}\n#' @export\nvec_cast.dribble.data.frame <- function(x, to, ..., x_arg = \"\", to_arg = \"\") {\n  stop_incompatible_cast_dribble(x, to, x_arg = x_arg, to_arg = to_arg)\n}\n#' @export\nvec_cast.data.frame.dribble <- function(x, to, ..., x_arg = \"\", to_arg = \"\") {\n  df_cast(x, to, ..., x_arg = x_arg, to_arg = to_arg)\n}\n\n# ------------------------------------------------------------------------------\n\nstop_incompatible_cast_dribble <- function(x, to, ..., x_arg, to_arg) {\n  details <- \"Can't cast to a <dribble> because the resulting structure is likely invalid.\"\n  stop_incompatible_cast(\n    x,\n    to,\n    x_arg = x_arg,\n    to_arg = to_arg,\n    details = details\n  )\n}\n"
  },
  {
    "path": "R/deprecated.R",
    "content": "#' Deprecated googledrive functions\n#'\n#' @description\n#' `r lifecycle::badge(\"deprecated\")`\n#'\n#' @section `drive_auth_config()`:\n#'\n#' This function is defunct.\n#' * Use [drive_auth_configure()] to configure your own OAuth client or API key.\n#' * Use [drive_deauth()] to go into a de-authorized state.\n#' * Use [drive_oauth_client()] to retrieve a user-configured client, if it\n#'   exists.\n#' * Use [drive_api_key()] to retrieve a user-configured API key, if it exists.\n#'\n#' @section `drive_oauth_app()`:\n#'\n#' In light of the new [gargle::gargle_oauth_client()] constructor and class of\n#' the same name, `drive_oauth_app()` is being replaced by\n#' [drive_oauth_client()].\n#'\n#' @section `drive_example()`:\n#'\n#' This function is defunct. Access example files with [drive_examples_local()],\n#' [drive_example_local()], [drive_examples_remote()], and\n#' [drive_example_remote()].\n#'\n#' @keywords internal\n#' @name googledrive-deprecated\nNULL\n\n#' @rdname googledrive-deprecated\n#' @inheritParams drive_auth_configure\n#' @export\ndrive_auth_config <- function(active, app, path, api_key) {\n  lifecycle::deprecate_stop(\n    \"1.0.0\",\n    \"drive_auth_config()\",\n    details = c(\n      \"Use `drive_auth_configure()` to configure your own OAuth client or API key.\",\n      \"Use `drive_deauth()` to go into a de-authorized state.\",\n      \"Use `drive_oauth_client()` to retrieve a user-configured client, if it exists.\",\n      \"Use `drive_api_key()` to retrieve a user-configured API key, if it exists.\"\n    )\n  )\n}\n\n#' @rdname googledrive-deprecated\n#' @export\ndrive_oauth_app <- function() {\n  lifecycle::deprecate_warn(\n    \"2.1.0\",\n    \"drive_oauth_app()\",\n    \"drive_oauth_client()\"\n  )\n  drive_oauth_client()\n}\n\n#' @rdname googledrive-deprecated\n#' @export\ndrive_example <- function(path = NULL) {\n  lifecycle::deprecate_stop(\n    \"2.0.0\",\n    what = \"drive_example()\",\n    with = I(\"`drive_examples_local()` or `drive_example_local()`\")\n  )\n}\n"
  },
  {
    "path": "R/dribble.R",
    "content": "#' dribble object\n#'\n#' @description googledrive stores the metadata for one or more Drive files or\n#'   shared drives as a `dribble`. It is a \"Drive\n#'   [tibble][tibble::tibble-package]\" with one row per file or shared drive\n#'   and, at a minimum, these columns:\n#'   * `name`: a character column containing file or shared drive names\n#'   * `id`: a character column of file or shared drive ids\n#'   * `drive_resource`: a list-column, each element of which is either a\n#'   [Files resource](https://developers.google.com/drive/api/v3/reference/files#resource-representations)\n#'   or a [Drives resource](https://developers.google.com/drive/api/v3/reference/drives#resource-representations)\n#'   object. Note there is no guarantee that all documented fields are always\n#'   present. We do check if the `kind` field is present and equal to one of\n#'   `drive#file` or `drive#drive`.\n#'\n#' @description The `dribble` format is handy because it exposes the file name,\n#'   which is good for humans, but keeps it bundled with the file's unique id\n#'   and other metadata, which are needed for API calls.\n#'\n#' @description In general, the `dribble` class will be retained even after\n#'   manipulation, as long as the required variables are present and of the\n#'   correct type. This works best for manipulations via the dplyr and vctrs\n#'   packages.\n#'\n#' @name dribble\n#' @seealso [as_dribble()]\nNULL\n\n# implementing dribble as advised here:\n# https://github.com/hadley/adv-r/blob/master/S3.Rmd\n\nnew_dribble <- function(x) {\n  # new_tibble0() strips attributes\n  out <- structure(\n    new_tibble0(x),\n    class = c(\"dribble\", \"tbl_df\", \"tbl\", \"data.frame\")\n  )\n  out$id <- new_drive_id(unclass(out$id))\n  out\n}\n\nvalidate_dribble <- function(x) {\n  stopifnot(inherits(x, \"dribble\"))\n\n  if (!has_dribble_cols(x)) {\n    missing_cols <- setdiff(dribble_cols, colnames(x))\n    drive_abort(c(\n      \"Invalid {.cls dribble}. \\\\\n       {cli::qty(length(missing_cols))}{?This/These} required column{?s} \\\\\n       {?is/are} missing:\",\n      bulletize(gargle_map_cli(missing_cols, template = \"{.code <<x>>}\"))\n    ))\n  }\n\n  if (!has_dribble_coltypes(x)) {\n    mistyped_cols <- dribble_cols[!dribble_coltypes_ok(x)]\n    drive_abort(c(\n      \"Invalid {.cls dribble}. \\\\\n       {cli::qty(length(mistyped_cols))}{?This/These} column{?s} {?has/have} \\\\\n       the wrong type:\",\n      bulletize(gargle_map_cli(mistyped_cols, template = \"{.code <<x>>}\"))\n    ))\n  }\n\n  # TODO: should I make sure there are no NAs in the id column?\n  # let's wait and see if we ever experience any harm from NOT checking this\n  # also, that feels more like something to enforce by creating a proper\n  # S3 vctr for Drive file ids and it might be odd to make NAs unacceptable\n\n  if (!has_drive_resource(x)) {\n    # \\u00a0 is a nonbreaking space\n    drive_abort(c(\n      'Invalid {.cls dribble}. Can\\'t confirm \\\\\n       {.code kind\\u00a0=\\u00a0\"drive#file\"} or \\\\\n       {.code kind\\u00a0=\\u00a0\"drive#drive\"} \\\\\n       for all elements of the {.code drive_resource} column.'\n    ))\n  }\n  x\n}\n\ndribble <- function(x = NULL) {\n  x <- x %||%\n    list(\n      name = character(),\n      id = character(),\n      drive_resource = list()\n    )\n  validate_dribble(new_dribble(x))\n}\n\n#' @export\n`[.dribble` <- function(x, i, j, drop = FALSE) {\n  dribble_maybe_reconstruct(NextMethod())\n}\n\n#' @export\n`names<-.dribble` <- function(x, value) {\n  dribble_maybe_reconstruct(NextMethod())\n}\n\n#' @export\ntbl_sum.dribble <- function(x) {\n  orig <- NextMethod()\n  c(\"A dribble\" = unname(orig))\n}\n\n#' @export\nas_tibble.dribble <- function(x, ...) {\n  as_tibble(new_tibble0(x), ...)\n}\n\ndribble_cols <- c(\"name\", \"id\", \"drive_resource\")\n\nhas_dribble_cols <- function(x) {\n  all(dribble_cols %in% colnames(x))\n}\n\ndribble_coltypes_ok <- function(x) {\n  c(\n    name = is.character(x$name),\n    id = is.character(x$id),\n    drive_resource = inherits(x$drive_resource, \"list\")\n  )\n}\n\nhas_dribble_coltypes <- function(x) {\n  all(dribble_coltypes_ok(x))\n}\n\nid_can_be_drive_id <- function(x) {\n  all(is_valid_drive_id(x))\n}\n\nhas_drive_resource <- function(x) {\n  kind <- map_chr(x$drive_resource, \"kind\", .default = NA_character_)\n  # TODO: remove `drive#teamDrive` here, when possible\n  all(\n    !is.na(kind) & kind %in% c(\"drive#file\", \"drive#drive\", \"drive#teamDrive\")\n  )\n}\n\n#' Coerce to a `dribble`\n#'\n#' @description\n#' Converts various representations of Google Drive files into a [`dribble`],\n#' the object used by googledrive to hold Drive file metadata. Files can be\n#' specified via:\n#'   * File path. File name is an important special case.\n#'   * File id. Mark with [as_id()] to distinguish from file path.\n#'   * Data frame or [`dribble`]. Once you've successfully used googledrive to\n#'     identify the files of interest, you'll have a [`dribble`]. Pass it into\n#'     downstream functions.\n#'   * List representing [Files resource](https://developers.google.com/drive/api/v3/reference/files)\n#'     objects. Mostly for internal use.\n#'\n#' This is a generic function.\n#'\n#' For maximum clarity, get your files into a [`dribble`] (or capture file id)\n#' as early as possible. When specifying via path, it's best to include the\n#' trailing slash when you're targeting a folder. If you want the folder `foo`,\n#' say `foo/`, not `foo`.\n#'\n#' Some functions, such as [drive_cp()], [drive_mkdir()], [drive_mv()], and\n#' [drive_upload()], can accept the new file or folder name as the last part of\n#' `path`, when `name` is not given. But if you say `a/b/c` (no trailing slash)\n#' and a folder `a/b/c/` already exists, it's unclear what you want. A file\n#' named `c` in `a/b/` or a file with default name in `a/b/c/`? You get an\n#' error and must make your intent clear.\n#'\n#' @param x A vector of Drive file paths, a vector of file ids marked\n#'   with [as_id()], a list of Files Resource objects, or a suitable data\n#'   frame.\n#' @param ... Other arguments passed down to methods. (Not used.)\n#' @export\n#' @examplesIf drive_has_token()\n#' # create some files for us to re-discover by name or filepath\n#' alfa <- drive_create(\"alfa\", type = \"folder\")\n#' bravo <- drive_create(\"bravo\", path = alfa)\n#'\n#' # as_dribble() can work with file names or paths\n#' as_dribble(\"alfa\")\n#' as_dribble(\"bravo\")\n#' as_dribble(\"alfa/bravo\")\n#' as_dribble(c(\"alfa\", \"alfa/bravo\"))\n#'\n#' # specify the file id (substitute a real file id of your own!)\n#' # as_dribble(as_id(\"0B0Gh-SuuA2nTOGZVTXZTREgwZ2M\"))\n#'\n#' # Clean up\n#' drive_find(\"alfa\") |> drive_rm()\nas_dribble <- function(x, ...) UseMethod(\"as_dribble\")\n\n#' @export\nas_dribble.default <- function(x, ...) {\n  drive_abort(\n    \"\n    Don't know how to coerce an object of class {.cls {class(x)}} into \\\\\n    a {.cls dribble}.\"\n  )\n}\n\n#' @export\nas_dribble.NULL <- function(x, ...) dribble()\n\n#' @export\nas_dribble.character <- function(x, ...) {\n  with_drive_quiet(drive_get(path = x))\n}\n\n#' @export\nas_dribble.drive_id <- function(x, ...) drive_get(id = x)\n\n#' @export\nas_dribble.data.frame <- function(x, ...) validate_dribble(new_dribble(x))\n\n#' @export\nas_dribble.list <- function(x, ...) {\n  if (length(x) == 0) {\n    return(dribble())\n  }\n\n  required_nms <- c(\"name\", \"id\", \"kind\")\n  stopifnot(map_lgl(x, ~ all(required_nms %in% names(.x))))\n\n  as_dribble(\n    tibble(\n      name = map_chr(x, \"name\"),\n      id = map_chr(x, \"id\"),\n      drive_resource = x\n    )\n  )\n}\n\n# used across several functions that create a file or modify \"parentage\"\n# processes a putative parent folder or shared drive\nas_parent <- function(d) {\n  in_var <- deparse(substitute(d))\n  if (is_path(d)) {\n    d <- append_slash(d)\n  }\n  d <- as_dribble(d)\n  # wording chosen to work for folder and shared drive\n  invalid_parent <- \"Parent specified via {.arg {in_var}} is invalid:\"\n  if (no_file(d)) {\n    drive_abort(c(invalid_parent, x = \"Does not exist.\"))\n  }\n  if (!single_file(d)) {\n    drive_abort(c(\n      invalid_parent,\n      x = \"Doesn't uniquely identify exactly one folder or shared drive.\"\n    ))\n  }\n  if (is_folder_shortcut(d)) {\n    drive_bullets(c(\n      i = \"Parent specified via {.arg {in_var}} is a shortcut; resolving to \\\\\n           its target folder\"\n    ))\n    d <- shortcut_resolve(d)\n  }\n  if (!is_parental(d)) {\n    drive_abort(c(\n      invalid_parent,\n      x = \"Is neither a folder nor a shared drive.\"\n    ))\n  }\n  d\n}\n\n#' Check facts about a dribble\n#'\n#' Sometimes you need to check things about a [`dribble`]` or about the files it\n#' represents, such as:\n#'   * Is it even a dribble?\n#'   * Size: Does the dribble hold exactly one file? At least one file? No file?\n#'   * File type: Is this file a folder?\n#'   * File ownership and access: Is it mine? Published? Shared?\n#'\n#' @name dribble-checks\n#' @param d A [`dribble`].\n#' @examplesIf drive_has_token()\n#' ## most of us have multiple files or folders on Google Drive\n#' d <- drive_find()\n#' is_dribble(d)\n#' no_file(d)\n#' single_file(d)\n#' some_files(d)\n#'\n#' # this will error\n#' # confirm_single_file(d)\n#'\n#' confirm_some_files(d)\n#' is_folder(d)\n#' is_mine(d)\nNULL\n\n#' @export\n#' @rdname dribble-checks\nis_dribble <- function(d) {\n  inherits(d, \"dribble\")\n}\n\n#' @export\n#' @rdname dribble-checks\nno_file <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  nrow(d) == 0\n}\n\n#' @export\n#' @rdname dribble-checks\nsingle_file <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  nrow(d) == 1\n}\n\n#' @export\n#' @rdname dribble-checks\nsome_files <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  nrow(d) > 0\n}\n\n#' @export\n#' @rdname dribble-checks\nconfirm_dribble <- function(d) {\n  if (!is_dribble(d)) {\n    drive_abort(\"Input is not a {.cls dribble}.\")\n  }\n  d\n}\n\n#' @export\n#' @rdname dribble-checks\nconfirm_single_file <- function(d) {\n  in_var <- deparse(substitute(d))\n  if (no_file(d)) {\n    drive_abort(\"{.arg {in_var}} does not identify at least one Drive file.\")\n  }\n  if (!single_file(d)) {\n    drive_abort(\"{.arg {in_var}} identifies more than one Drive file.\")\n  }\n  d\n}\n\n#' @export\n#' @rdname dribble-checks\nconfirm_some_files <- function(d) {\n  in_var <- deparse(substitute(d))\n  if (no_file(d)) {\n    drive_abort(\"{.arg {in_var}} does not identify at least one Drive file.\")\n  }\n  d\n}\n\n#' @export\n#' @rdname dribble-checks\nis_folder <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  map_chr(d$drive_resource, \"mimeType\", .default = NA) ==\n    \"application/vnd.google-apps.folder\"\n}\n\n#' @export\n#' @rdname dribble-checks\nis_shortcut <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  map_chr(d$drive_resource, \"mimeType\", .default = NA) ==\n    \"application/vnd.google-apps.shortcut\"\n}\n\n#' @export\n#' @rdname dribble-checks\nis_folder_shortcut <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  is_shortcut(d) &\n    (map_chr(\n      d$drive_resource,\n      c(\"shortcutDetails\", \"targetMimeType\"),\n      .default = \"\"\n    ) ==\n      \"application/vnd.google-apps.folder\")\n}\n\n#' @export\n#' @rdname dribble-checks\nis_native <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  d <- promote(d, \"mimeType\")\n  grepl(\"application/vnd.google-apps.\", d$mimeType) & !is_folder(d)\n}\n\n#' @export\n#' @rdname dribble-checks\nis_parental <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  kind <- map_chr(d$drive_resource, \"kind\")\n  mime_type <- map_chr(d$drive_resource, \"mimeType\", .default = \"\")\n  # TODO: remove `drive#teamDrive` here, when possible\n  kind == \"drive#teamDrive\" |\n    kind == \"drive#drive\" |\n    mime_type == \"application/vnd.google-apps.folder\"\n}\n\n#' @export\n#' @rdname dribble-checks\n## TO DO: do I need to do anything about shared drives here?\nis_mine <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  map_lgl(d$drive_resource, list(\"owners\", 1, \"me\"))\n}\n\n#' @export\n#' @rdname dribble-checks\nis_shared_drive <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  map_chr(d$drive_resource, \"kind\") == \"drive#drive\"\n}\n"
  },
  {
    "path": "R/drive_about.R",
    "content": "#' Get info on Drive capabilities\n#'\n#' Gets information about the user, the user's Drive, and system capabilities.\n#' This function mostly exists to power [drive_user()], which extracts the most\n#' useful information (the information on current user) and prints it nicely.\n#'\n#' @seealso Wraps the `about.get` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/about/get>\n#'\n#' @return A list representation of a Drive\n#'   [about resource](https://developers.google.com/drive/api/v3/reference/about)\n#' @export\n#'\n#' @examplesIf drive_has_token()\n#' drive_about()\n#'\n#' # explore the export formats available for Drive files, by MIME type\n#' about <- drive_about()\n#' about[[\"exportFormats\"]] |>\n#'   purrr::map(unlist)\ndrive_about <- function() {\n  request <- request_generate(\n    endpoint = \"drive.about.get\",\n    params = list(fields = \"*\")\n  )\n  response <- request_make(request)\n  gargle::response_process(response)\n}\n"
  },
  {
    "path": "R/drive_auth.R",
    "content": "# This file is the interface between googledrive and the\n# auth functionality in gargle.\n\n# Initialization happens in .onLoad()\n.auth <- NULL\n\n## The roxygen comments for these functions are mostly generated from data\n## in this list and template text maintained in gargle.\ngargle_lookup_table <- list(\n  PACKAGE = \"googledrive\",\n  YOUR_STUFF = \"your Drive files\",\n  PRODUCT = \"Google Drive\",\n  API = \"Drive API\",\n  PREFIX = \"drive\"\n)\n\n#' Authorize googledrive\n#'\n#' @eval gargle:::PREFIX_auth_description(gargle_lookup_table)\n#' @eval gargle:::PREFIX_auth_details(gargle_lookup_table)\n#' @eval gargle:::PREFIX_auth_params()\n#'\n#' @param scopes One or more API scopes. Each scope can be specified in full or,\n#'   for Drive API-specific scopes, in an abbreviated form that is recognized by\n#'   [drive_scopes()]:\n#'   * \"drive\" = \"https://www.googleapis.com/auth/drive\" (the default)\n#'   * \"full\" = \"https://www.googleapis.com/auth/drive\" (same as \"drive\")\n#'   * \"drive.readonly\" = \"https://www.googleapis.com/auth/drive.readonly\"\n#'   * \"drive.file\" = \"https://www.googleapis.com/auth/drive.file\"\n#'   * \"drive.appdata\" = \"https://www.googleapis.com/auth/drive.appdata\"\n#'   * \"drive.metadata\" = \"https://www.googleapis.com/auth/drive.metadata\"\n#'   * \"drive.metadata.readonly\" = \"https://www.googleapis.com/auth/drive.metadata.readonly\"\n#'   * \"drive.photos.readonly\" = \"https://www.googleapis.com/auth/drive.photos.readonly\"\n#'   * \"drive.scripts\" = \"https://www.googleapis.com/auth/drive.scripts\n#'\n#'   See <https://developers.google.com/drive/api/guides/api-specific-auth> for\n#'   details on the permissions for each scope.\n#'\n#' @family auth functions\n#' @export\n#'\n#' @examplesIf rlang::is_interactive()\n#' # load/refresh existing credentials, if available\n#' # otherwise, go to browser for authentication and authorization\n#' drive_auth()\n#'\n#' # see user associated with current token\n#' drive_user()\n#'\n#' # force use of a token associated with a specific email\n#' drive_auth(email = \"jenny@example.com\")\n#' drive_user()\n#'\n#' # force the OAuth web dance\n#' drive_auth(email = NA)\n#'\n#' # use a 'read only' scope, so it's impossible to edit or delete files\n#' drive_auth(scopes = \"drive.readonly\")\n#'\n#' # use a service account token\n#' drive_auth(path = \"foofy-83ee9e7c9c48.json\")\ndrive_auth <- function(\n  email = gargle::gargle_oauth_email(),\n  path = NULL,\n  subject = NULL,\n  scopes = \"drive\",\n  cache = gargle::gargle_oauth_cache(),\n  use_oob = gargle::gargle_oob_default(),\n  token = NULL\n) {\n  gargle::check_is_service_account(path, hint = \"drive_auth_configure\")\n  scopes <- drive_scopes(scopes)\n  env_unbind(.googledrive, \"root_folder\")\n\n  # If `token` is not `NULL`, it's much better to error noisily now, before\n  # getting silently swallowed by `token_fetch()`.\n  force(token)\n\n  cred <- gargle::token_fetch(\n    scopes = scopes,\n    client = drive_oauth_client() %||% gargle::tidyverse_client(),\n    email = email,\n    path = path,\n    subject = subject,\n    package = \"googledrive\",\n    cache = cache,\n    use_oob = use_oob,\n    token = token\n  )\n  if (!inherits(cred, \"Token2.0\")) {\n    drive_abort(c(\n      \"Can't get Google credentials.\",\n      \"i\" = \"Are you running {.pkg googledrive} in a non-interactive session? \\\\\n             Consider:\",\n      \"*\" = \"Call {.fun drive_deauth} to prevent the attempt to get credentials.\",\n      \"*\" = \"Call {.fun drive_auth} directly with all necessary specifics.\",\n      \"i\" = \"See gargle's \\\"Non-interactive auth\\\" vignette for more details:\",\n      \"i\" = \"{.url https://gargle.r-lib.org/articles/non-interactive-auth.html}\"\n    ))\n  }\n  .auth$set_cred(cred)\n  .auth$set_auth_active(TRUE)\n\n  invisible()\n}\n\n#' Suspend authorization\n#'\n#' @eval gargle:::PREFIX_deauth_description_with_api_key(gargle_lookup_table)\n#'\n#' @family auth functions\n#' @export\n#' @examplesIf rlang::is_interactive()\n#' drive_deauth()\n#' drive_user()\n#'\n#' # in a deauth'ed state, we can still get metadata on a world-readable file\n#' public_file <- drive_example_remote(\"chicken.csv\")\n#' public_file\n#' # we can still download it too\n#' drive_download(public_file)\ndrive_deauth <- function() {\n  .auth$set_auth_active(FALSE)\n  .auth$clear_cred()\n  env_unbind(.googledrive, \"root_folder\")\n  invisible()\n}\n\n#' Produce configured token\n#'\n#' @eval gargle:::PREFIX_token_description(gargle_lookup_table)\n#' @eval gargle:::PREFIX_token_return()\n#'\n#' @family low-level API functions\n#' @export\n#' @examplesIf drive_has_token()\n#' req <- request_generate(\n#'   \"drive.files.get\",\n#'   list(fileId = \"abc\"),\n#'   token = drive_token()\n#' )\n#' req\ndrive_token <- function() {\n  if (isFALSE(.auth$auth_active)) {\n    return(NULL)\n  }\n  if (!drive_has_token()) {\n    drive_auth()\n  }\n  httr::config(token = .auth$cred)\n}\n\n#' Is there a token on hand?\n#'\n#' @eval gargle:::PREFIX_has_token_description(gargle_lookup_table)\n#' @eval gargle:::PREFIX_has_token_return()\n#'\n#' @family low-level API functions\n#' @export\n#'\n#' @examples\n#' drive_has_token()\ndrive_has_token <- function() {\n  inherits(.auth$cred, \"Token2.0\")\n}\n\n#' Edit and view auth configuration\n#'\n#' @eval gargle:::PREFIX_auth_configure_description(gargle_lookup_table)\n#' @eval gargle:::PREFIX_auth_configure_params()\n#' @eval gargle:::PREFIX_auth_configure_return(gargle_lookup_table)\n#'\n#' @family auth functions\n#' @export\n#' @examples\n#' # see and store the current user-configured OAuth client (probaby `NULL`)\n#' (original_client <- drive_oauth_client())\n#'\n#' # see and store the current user-configured API key (probaby `NULL`)\n#' (original_api_key <- drive_api_key())\n#'\n#' # the preferred way to configure your own client is via a JSON file\n#' # downloaded from Google Developers Console\n#' # this example JSON is indicative, but fake\n#' path_to_json <- system.file(\n#'   \"extdata\", \"client_secret_installed.googleusercontent.com.json\",\n#'   package = \"gargle\"\n#' )\n#' drive_auth_configure(path = path_to_json)\n#'\n#' # this is also obviously a fake API key\n#' drive_auth_configure(api_key = \"the_key_I_got_for_a_google_API\")\n#'\n#' # confirm the changes\n#' drive_oauth_client()\n#' drive_api_key()\n#'\n#' # restore original auth config\n#' drive_auth_configure(client = original_client, api_key = original_api_key)\ndrive_auth_configure <- function(client, path, api_key, app = deprecated()) {\n  if (lifecycle::is_present(app)) {\n    lifecycle::deprecate_warn(\n      \"2.1.0\",\n      \"drive_auth_configure(app)\",\n      \"drive_auth_configure(client)\"\n    )\n    drive_auth_configure(client = app, path = path, api_key = api_key)\n  }\n\n  if (!missing(client) && !missing(path)) {\n    drive_abort(\n      \"Must supply exactly one of {.arg client} or {.arg path}, not both\"\n    )\n  }\n  stopifnot(missing(api_key) || is.null(api_key) || is_string(api_key))\n\n  if (!missing(path)) {\n    stopifnot(is_string(path))\n    client <- gargle::gargle_oauth_client_from_json(path)\n  }\n  stopifnot(\n    missing(client) ||\n      is.null(client) ||\n      inherits(client, \"gargle_oauth_client\")\n  )\n\n  if (!missing(client) || !missing(path)) {\n    .auth$set_client(client)\n  }\n\n  if (!missing(api_key)) {\n    .auth$set_api_key(api_key)\n  }\n\n  invisible(.auth)\n}\n\n#' @export\n#' @rdname drive_auth_configure\ndrive_api_key <- function() {\n  .auth$api_key\n}\n\n#' @export\n#' @rdname drive_auth_configure\ndrive_oauth_client <- function() {\n  .auth$client\n}\n\n#' Produce scopes specific to the Drive API\n#'\n#' When called with no arguments, `drive_scopes()` returns a named character vector\n#' of scopes associated with the Drive API. If `drive_scopes(scopes =)` is given,\n#' an abbreviated entry such as `\"drive.readonly\"` is expanded to a full scope\n#' (`\"https://www.googleapis.com/auth/drive.readonly\"` in this case).\n#' Unrecognized scopes are passed through unchanged.\n#'\n#' @inheritParams drive_auth\n#'\n#' @seealso <https://developers.google.com/drive/api/guides/api-specific-auth> for details on\n#'   the permissions for each scope.\n#' @returns A character vector of scopes.\n#' @family auth functions\n#' @export\n#' @examples\n#' drive_scopes(\"full\")\n#' drive_scopes(\"drive.readonly\")\n#' drive_scopes()\ndrive_scopes <- function(scopes = NULL) {\n  if (is.null(scopes)) {\n    drive_api_scopes\n  } else {\n    resolve_scopes(user_scopes = scopes, package_scopes = drive_api_scopes)\n  }\n}\n\ndrive_api_scopes <- c(\n  drive = \"https://www.googleapis.com/auth/drive\",\n  full = \"https://www.googleapis.com/auth/drive\",\n  drive.readonly = \"https://www.googleapis.com/auth/drive.readonly\",\n  drive.file = \"https://www.googleapis.com/auth/drive.file\",\n  drive.appdata = \"https://www.googleapis.com/auth/drive.appdata\",\n  drive.metadata = \"https://www.googleapis.com/auth/drive.metadata\",\n  drive.metadata.readonly = \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n  drive.photos.readonly = \"https://www.googleapis.com/auth/drive.photos.readonly\",\n  drive.scripts = \"https://www.googleapis.com/auth/drive.scripts\"\n)\n\nresolve_scopes <- function(user_scopes, package_scopes) {\n  m <- match(user_scopes, names(package_scopes))\n  ifelse(is.na(m), user_scopes, package_scopes[m])\n}\n\n# unexported helpers that are nice for internal use ----\ndrive_auth_internal <- function(account = c(\"docs\", \"testing\"), scopes = NULL) {\n  account <- match.arg(account)\n  can_decrypt <- gargle::secret_has_key(\"GOOGLEDRIVE_KEY\")\n  online <- !is.null(curl::nslookup(\"drive.googleapis.com\", error = FALSE))\n  if (!can_decrypt || !online) {\n    drive_abort(\n      message = c(\n        \"Auth unsuccessful:\",\n        if (!can_decrypt) {\n          c(\"x\" = \"Can't decrypt the {.field {account}} service account token.\")\n        },\n        if (!online) {\n          c(\n            \"x\" = \"We don't appear to be online. Or maybe the Drive API is down?\"\n          )\n        }\n      ),\n      class = \"googledrive_auth_internal_error\",\n      can_decrypt = can_decrypt,\n      online = online\n    )\n  }\n\n  if (!is_interactive()) {\n    local_drive_quiet()\n  }\n  filename <- glue(\"googledrive-{account}.json\")\n  # TODO: revisit when I do PKG_scopes()\n  # https://github.com/r-lib/gargle/issues/103\n  scopes <- scopes %||% \"https://www.googleapis.com/auth/drive\"\n  drive_auth(\n    scopes = scopes,\n    path = gargle::secret_decrypt_json(\n      system.file(\"secret\", filename, package = \"googledrive\"),\n      \"GOOGLEDRIVE_KEY\"\n    )\n  )\n  print(drive_user())\n  invisible(TRUE)\n}\n\ndrive_auth_docs <- function(scopes = NULL) {\n  drive_auth_internal(\"docs\", scopes = scopes)\n}\n\ndrive_auth_testing <- function(scopes = NULL) {\n  drive_auth_internal(\"testing\", scopes = scopes)\n}\n\nlocal_deauth <- function(env = parent.frame()) {\n  original_cred <- .auth$get_cred()\n  original_auth_active <- .auth$auth_active\n  drive_bullets(c(\"i\" = \"Going into deauthorized state.\"))\n  withr::defer(\n    drive_bullets(c(\"i\" = \"Restoring previous auth state.\")),\n    envir = env\n  )\n  withr::defer(\n    {\n      .auth$set_cred(original_cred)\n      .auth$set_auth_active(original_auth_active)\n    },\n    envir = env\n  )\n  drive_deauth()\n}\n"
  },
  {
    "path": "R/drive_browse.R",
    "content": "#' Retrieve Drive file links\n#'\n#' Returns the `\"webViewLink\"` for one or more files, which is the \"link for\n#' opening the file in a relevant Google editor or viewer in a browser\".\n#'\n#' @template file-plural\n#'\n#' @return Character vector of file hyperlinks.\n#' @export\n#' @examplesIf drive_has_token()\n#' # get a few files into a dribble\n#' three_files <- drive_find(n_max = 3)\n#'\n#' # get their browser links\n#' drive_link(three_files)\ndrive_link <- function(file) {\n  file <- as_dribble(file)\n  links <- map_chr(\n    file$drive_resource,\n    \"webViewLink\",\n    .default = NA_character_\n  )\n  # no documented, programmatic way to get browser links for shared drives\n  # but this seems to work ... I won't document it either, though\n  sd <- is_shared_drive(file)\n  links[sd] <- glue(\n    \"https://drive.google.com/drive/folders/{id}\",\n    id = as_id(file)[sd]\n  )\n  links\n}\n\n#' Visit Drive file in browser\n#'\n#' Visits a file on Google Drive in your default browser.\n#'\n#' @template file-singular\n#'\n#' @return Character vector of file hyperlinks, from [drive_link()], invisibly.\n#' @export\n#' @examplesIf drive_has_token() && rlang::is_interactive()\n#' drive_find(n_max = 1) |> drive_browse()\ndrive_browse <- function(file = .Last.value) {\n  file <- as_dribble(file)\n  links <- drive_link(file)\n  if (!interactive() || no_file(file)) {\n    return(invisible(links))\n  }\n  if (!single_file(file)) {\n    drive_bullets(c(\"v\" = \"Browsing the first file of {nrow(file)}.\"))\n  }\n  utils::browseURL(links[1])\n  invisible(links)\n}\n"
  },
  {
    "path": "R/drive_cp.R",
    "content": "#' Copy a Drive file\n#'\n#' Copies an existing Drive file into a new file id.\n#'\n#' @seealso Wraps the `files.copy` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/files/copy>\n#'\n#' @template file-singular\n#' @eval param_path(\n#'   thing = \"new file\",\n#'   default_notes = \"By default, the new file has the same parent folder as the\n#'      source file.\"\n#' )\n#' @eval param_name(\n#'   thing = \"file\",\n#'   default_notes = \"Defaults to \\\"Copy of `FILE-NAME`\\\".\"\n#' )\n#' @template dots-metadata\n#' @template overwrite\n#' @template verbose\n#' @eval return_dribble()\n#' @export\n#'\n#' @examplesIf drive_has_token()\n#' # Target one of the official example files\n#' (src_file <- drive_example_remote(\"chicken.txt\"))\n#'\n#' # Make a \"Copy of\" copy in your My Drive\n#' cp1 <- drive_cp(src_file)\n#'\n#' # Make an explicitly named copy, in a different folder, and star it.\n#' # The starring is an example of providing metadata via `...`.\n#' # `starred` is not an actual argument to `drive_cp()`,\n#' # it just gets passed through to the API.\n#' folder <- drive_mkdir(\"drive-cp-folder\")\n#' cp2 <- drive_cp(\n#'   src_file,\n#'   path = folder,\n#'   name = \"chicken-cp.txt\",\n#'   starred = TRUE\n#' )\n#' drive_reveal(cp2, \"starred\")\n#'\n#' # `overwrite = FALSE` errors if file already exists at target filepath\n#' # THIS WILL ERROR!\n#' # drive_cp(src_file, name = \"Copy of chicken.txt\", overwrite = FALSE)\n#'\n#' # `overwrite = TRUE` moves an existing file to trash, then proceeds\n#' cp3 <- drive_cp(src_file, name = \"Copy of chicken.txt\", overwrite = TRUE)\n#'\n#' # Delete all of our copies and the new folder!\n#' drive_rm(cp1, cp2, cp3, folder)\n#'\n#' # Target an official example file that's a csv file\n#' (csv_file <- drive_example_remote(\"chicken.csv\"))\n#'\n#' # copy AND AT THE SAME TIME convert it to a Google Sheet\n#' chicken_sheet <- drive_cp(\n#'   csv_file,\n#'   name = \"chicken-sheet-copy\",\n#'   mime_type = drive_mime_type(\"spreadsheet\")\n#' )\n#' # is it really a Google Sheet?\n#' drive_reveal(chicken_sheet, \"mime_type\")$mime_type\n#'\n#' # go see the new Sheet in the browser\n#' # drive_browse(chicken_sheet)\n#'\n#' # Clean up\n#' drive_rm(chicken_sheet)\ndrive_cp <- function(\n  file,\n  path = NULL,\n  name = NULL,\n  ...,\n  overwrite = NA,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n\n  file <- as_dribble(file)\n  file <- confirm_single_file(file)\n  if (is_parental(file)) {\n    drive_abort(\"The Drive API does not copy folders or shared drives.\")\n  }\n\n  tmp <- rationalize_path_name(path, name)\n  path <- tmp$path\n  name <- tmp$name\n\n  params <- toCamel(list2(...))\n\n  # load (path, name) into params\n  if (!is.null(path)) {\n    path <- as_parent(path)\n    params[[\"parents\"]] <- list(path$id)\n  }\n  params[[\"name\"]] <- name %||% glue(\"Copy of {file$name}\")\n  check_for_overwrite(params[[\"parents\"]], params[[\"name\"]], overwrite)\n\n  params[[\"fields\"]] <- params[[\"fields\"]] %||% \"*\"\n  params[[\"fileId\"]] <- file$id\n\n  request <- request_generate(\n    endpoint = \"drive.files.copy\",\n    params = params\n  )\n  res <- request_make(request)\n  proc_res <- gargle::response_process(res)\n  out <- as_dribble(list(proc_res))\n\n  drive_bullets(c(\n    \"Original file:\",\n    bulletize(gargle_map_cli(file)),\n    \"Copied to file:\",\n    # drive_reveal_path() puts immediate parent, if specified, in the `path`\n    # then we reveal `path`, instead of `name`\n    bulletize(gargle_map_cli(\n      drive_reveal_path(out, ancestors = path),\n      template = c(\n        id_string = \"<id:\\u00a0<<id>>>\", # \\u00a0 is a nonbreaking space\n        out = \"{.drivepath <<path>>} {cli::col_grey('<<id_string>>')}\"\n      )\n    ))\n  ))\n\n  invisible(out)\n}\n"
  },
  {
    "path": "R/drive_create.R",
    "content": "#' Create a new blank Drive file\n#'\n#' Creates a new blank Drive file. Note there are better options for these\n#' special cases:\n#'   * Creating a folder? Use [drive_mkdir()].\n#'   * Want to upload existing local content into a new Drive file? Use\n#'     [drive_upload()].\n#'\n#' @seealso Wraps the `files.create` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/files/create>\n#'\n#' @param name Name for the new file or, optionally, a path that specifies\n#'   an existing parent folder, as well as the new file name.\n#' @eval param_path_known_parent()\n#' @param type Character. Create a blank Google Doc, Sheet or Slides by\n#'   setting `type` to `document`, `spreadsheet`, or `presentation`,\n#'   respectively. All non-`NULL` values for `type` are pre-processed with\n#'   [drive_mime_type()].\n#' @template dots-metadata\n#' @template overwrite\n#' @template verbose\n#'\n#' @eval return_dribble()\n#' @export\n#' @examplesIf drive_has_token()\n#' # Create a blank Google Doc named 'WordStar' in\n#' # your 'My Drive' root folder and star it\n#' wordstar <- drive_create(\"WordStar\", type = \"document\", starred = TRUE)\n#'\n#' # is 'WordStar' really starred? YES\n#' purrr::pluck(wordstar, \"drive_resource\", 1, \"starred\")\n#'\n#' # Create a blank Google Slides presentation in\n#' # the root folder, and set its description\n#' execuvision <- drive_create(\n#'   \"ExecuVision\",\n#'   type = \"presentation\",\n#'   description = \"deeply nested bullet lists FTW\"\n#' )\n#'\n#' # Did we really set the description? YES\n#' purrr::pluck(execuvision, \"drive_resource\", 1, \"description\")\n#'\n#' # check out the new presentation\n#' drive_browse(execuvision)\n#'\n#' # Create folder 'b4xl' in the root folder,\n#' # then create an empty new Google Sheet in it\n#' b4xl <- drive_mkdir(\"b4xl\")\n#' drive_create(\"VisiCalc\", path = b4xl, type = \"spreadsheet\")\n#'\n#' # Another way to create a Google Sheet in the folder 'b4xl'\n#' drive_create(\"b4xl/SuperCalc\", type = \"spreadsheet\")\n#'\n#' # Yet another way to create a new file in a folder,\n#' # this time specifying parent `path` as a character\n#' drive_create(\"Lotus 1-2-3\", path = \"b4xl\", type = \"spreadsheet\")\n#'\n#' # Did we really create those Sheets in the intended folder? YES\n#' drive_ls(\"b4xl\")\n#'\n#' # `overwrite = FALSE` errors if file already exists at target filepath\n#' # THIS WILL ERROR!\n#' drive_create(\"VisiCalc\", path = b4xl, overwrite = FALSE)\n#'\n#' # `overwrite = TRUE` moves an existing file to trash, then proceeds\n#' drive_create(\"VisiCalc\", path = b4xl, overwrite = TRUE)\n#'\n#' # Clean up\n#' drive_rm(wordstar, b4xl, execuvision)\ndrive_create <- function(\n  name,\n  path = NULL,\n  type = NULL,\n  ...,\n  overwrite = NA,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n\n  # in the special case of creating a shortcut, `name` is not required\n  if (!identical(drive_mime_type(type), drive_mime_type(\"shortcut\"))) {\n    check_required(name)\n    stopifnot(is_string(name))\n  }\n  # the order and role of `path` and `name` is naturally inverted here,\n  # relative to all other related functions, hence we pre-process\n\n  if (is.null(path)) {\n    path <- name\n    name <- NULL\n  }\n  tmp <- rationalize_path_name(path, name)\n  path <- tmp$path\n  name <- tmp$name\n\n  params <- toCamel(list2(...))\n\n  # load (path, name) into params\n  if (!is.null(path)) {\n    path <- as_parent(path)\n    params[[\"parents\"]] <- list(path[[\"id\"]])\n  }\n  params[[\"name\"]] <- name\n  check_for_overwrite(params[[\"parents\"]], params[[\"name\"]], overwrite)\n\n  params[[\"fields\"]] <- params[[\"fields\"]] %||% \"*\"\n  params[[\"mimeType\"]] <- drive_mime_type(type)\n\n  request <- request_generate(\n    endpoint = \"drive.files.create\",\n    params = params\n  )\n  response <- request_make(request)\n  proc_res <- gargle::response_process(response)\n\n  out <- as_dribble(list(proc_res))\n\n  drive_bullets(c(\n    \"Created Drive file:\",\n    bulletize(gargle_map_cli(out)),\n    \"With MIME type:\",\n    bulletize(gargle_map_cli(purrr::pluck(\n      out,\n      \"drive_resource\",\n      1,\n      \"mimeType\"\n    )))\n  ))\n  invisible(out)\n}\n"
  },
  {
    "path": "R/drive_download.R",
    "content": "#' Download a Drive file\n#'\n#' @description This function downloads a file from Google Drive. Native Google\n#'   file types, such as Google Docs, Google Sheets, and Google Slides, must be\n#'   exported to a conventional local file type. This can be specified:\n\n#'   * explicitly via `type`\n#'   * implicitly via the file extension of `path`\n#'   * not at all, i.e. rely on the built-in default\n#'\n#' @description To see what export file types are even possible, see the [Drive\n#'   API\n#'   documentation](https://developers.google.com/drive/api/v3/ref-export-formats)\n#'    or the result of `drive_about()$exportFormats`. The returned dribble\n#'   includes a `local_path` column.\n#'\n#' @seealso [Download\n#'   files](https://developers.google.com/drive/api/v3/manage-downloads), in the\n#'   Drive API documentation.\n#'\n#' @template file-singular\n#' @param path Character. Path for output file. If absent, the default file name\n#'   is the file's name on Google Drive and the default location is working\n#'   directory, possibly with an added file extension.\n#' @param type Character. Only consulted if `file` is a native Google file.\n#'   Specifies the desired type of the exported file. Will be processed via\n#'   [drive_mime_type()], so either a file extension like `\"pdf\"` or a full MIME\n#'   type like `\"application/pdf\"` is acceptable.\n#' @param overwrite A logical scalar. If local `path` already exists, do you\n#'   want to overwrite it?\n#' @template verbose\n#' @eval return_dribble()\n#' @export\n#' @examplesIf drive_has_token()\n#' # Target one of the official example files\n#' (src_file <- drive_example_remote(\"chicken_sheet\"))\n#'\n#' # Download Sheet as csv, explicit type\n#' downloaded_file <- drive_download(src_file, type = \"csv\")\n#'\n#' # See local path to new file\n#' downloaded_file$local_path\n#'\n#' # Download as csv, type implicit in file extension\n#' drive_download(src_file, path = \"my_csv_file.csv\")\n#'\n#' # Download with default name and type (xlsx)\n#' drive_download(src_file)\n#'\n#' # Clean up\n#' unlink(c(\"chicken_sheet.csv\", \"chicken_sheet.xlsx\", \"my_csv_file.csv\"))\ndrive_download <- function(\n  file,\n  path = NULL,\n  type = NULL,\n  overwrite = FALSE,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n  if (!is.null(path) && file.exists(path) && !overwrite) {\n    drive_abort(c(\n      \"Local {.arg path} already exists and overwrite is {.code FALSE}:\",\n      bulletize(gargle_map_cli(path, \"{.path <<x>>}\"))\n    ))\n  }\n  file <- as_dribble(file)\n  file <- confirm_single_file(file)\n\n  ## preserve extension from path, before possible override by file$name\n  ext <- file_ext_safe(path)\n  path <- path %||% file$name\n\n  mime_type <- file$drive_resource[[1]]$mimeType\n\n  if (!grepl(\"google\", mime_type) && !is.null(type)) {\n    drive_bullets(c(\n      \"!\" = \"Ignoring {.arg type}. Only consulted for native Google file types.\",\n      \" \" = \"MIME type of {.arg file}: {.field mime_type}.\"\n    ))\n  }\n\n  if (grepl(\"google\", mime_type)) {\n    export_type <- type %||% ext %||% get_export_mime_type(mime_type)\n    export_type <- drive_mime_type(export_type)\n    verify_export_mime_type(mime_type, export_type)\n    path <- apply_extension(path, drive_extension(export_type))\n\n    request <- request_generate(\n      endpoint = \"drive.files.export\",\n      params = list(\n        fileId = file$id,\n        mimeType = export_type\n      )\n    )\n  } else {\n    request <- request_generate(\n      endpoint = \"drive.files.get\",\n      params = list(\n        fileId = file$id,\n        alt = \"media\"\n      )\n    )\n  }\n\n  response <- request_make(\n    request,\n    httr::write_disk(path, overwrite = overwrite)\n  )\n  success <- httr::status_code(response) == 200 && file.exists(path)\n\n  if (success) {\n    drive_bullets(c(\n      \"File downloaded:\",\n      bulletize(gargle_map_cli(file)),\n      \"Saved locally as:\",\n      \"*\" = \"{.path {path}}\"\n    ))\n  } else {\n    drive_abort(\"Download failed.\")\n  }\n  invisible(put_column(file, nm = \"local_path\", val = path, .after = \"name\"))\n}\n\n## get the default export MIME type for a native Google MIME type\n## examples:\n##    Google Doc --> MS Word\n##  Google Sheet --> MS Excel\n## Google Slides --> MS PowerPoint\nget_export_mime_type <- function(mime_type) {\n  m <- .drive$translate_mime_types$mime_type_google == mime_type &\n    is_true(.drive$translate_mime_types$default)\n  if (!any(m)) {\n    drive_abort(c(\n      \"Not a recognized Google MIME type:\",\n      bulletize(gargle_map_cli(mime_type), bullet = \"x\")\n    ))\n  }\n  .drive$translate_mime_types$mime_type_local[m]\n}\n\n## affirm that export_type is a valid export MIME type for a native Google file\n## of type mime_type\nverify_export_mime_type <- function(mime_type, export_type) {\n  m <- .drive$translate_mime_types$mime_type_google == mime_type\n  ok <- export_type %in% .drive$translate_mime_types$mime_type_local[m]\n  if (!ok) {\n    ## to be really nice, we would look these up in drive_mime_type() tibble\n    ## and use the human_type, if found\n    drive_abort(c(\n      \"Cannot export Google file of type:\",\n      bulletize(gargle_map_cli(mime_type)),\n      \"as a file of type:\",\n      bulletize(gargle_map_cli(export_type))\n    ))\n  }\n  export_type\n}\n"
  },
  {
    "path": "R/drive_endpoints.R",
    "content": "#' List Drive endpoints\n#'\n#' @description\n#' The googledrive package stores a named list of Drive API v3 endpoints (or\n#' \"methods\", using Google's vocabulary) internally and these functions expose\n#' this data.\n#'   * `drive_endpoint()` returns one endpoint, i.e. it uses `[[`.\n#'   * `drive_endpoints()` returns a list of endpoints, i.e. it uses `[`.\n#'\n#' The names of this list (or the `id` sub-elements) are the nicknames that can\n#' be used to specify an endpoint in [request_generate()]. For each endpoint, we\n#' store its nickname or `id`, the associated HTTP verb, the `path`, and details\n#' about the parameters. This list is derived programmatically from the Drive\n#' API v3 Discovery Document\n#' (`https://www.googleapis.com/discovery/v1/apis/drive/v3/rest`) using the\n#' approach described in the [Discovery Documents\n#' section](https://gargle.r-lib.org/articles/request-helper-functions.html#discovery-documents)\n#' of the gargle vignette [Request helper\n#' functions](https://gargle.r-lib.org/articles/request-helper-functions.html).\n#'\n#' @param i The name(s) or integer index(ices) of the endpoints to return. `i`\n#'   is optional for `drive_endpoints()` and, if not given, the entire list is\n#'   returned.\n#'\n#' @return One or more of the Drive API v3 endpoints that are used internally by\n#'   googledrive.\n#' @export\n#'\n#' @examples\n#' str(head(drive_endpoints(), 3), max.level = 2)\n#' drive_endpoint(\"drive.files.delete\")\n#' drive_endpoint(4)\ndrive_endpoints <- function(i = NULL) {\n  if (is.null(i) || is_expose(i)) {\n    i <- seq_along(.endpoints)\n  }\n  stopifnot(is.character(i) || (is.numeric(i)))\n  .endpoints[i]\n}\n\n#' @rdname drive_endpoints\n#' @export\ndrive_endpoint <- function(i) {\n  stopifnot(is_string(i) || (is.numeric(i) && length(i) == 1))\n  .endpoints[[i]]\n}\n"
  },
  {
    "path": "R/drive_examples.R",
    "content": "#' Example files\n#'\n#' googledrive makes a variety of example files -- both local and remote --\n#' available for use in examples and reprexes. These functions help you access\n#' the example files. See `vignette(\"example-files\", package = \"googledrive\")`\n#' for more.\n#'\n#' @param matches A regular expression that matches the name of the desired\n#'   example file(s). This argument is optional for the plural forms\n#'   (`drive_examples_local()` and `drive_examples_remote()`) and, if provided,\n#'   multiple matches are allowed. The single forms (`drive_example_local()` and\n#'   `drive_example_remote()`) require this argument and require that there is\n#'   exactly one match.\n\n#'\n#' @returns\n\n#' * For `drive_example_local()` and `drive_examples_local()`, one or more local\n#' filepaths.\n\n#' * For `drive_example_remote()` and `drive_examples_remote()`, a `dribble`.\n\n#' @name drive_examples\n#' @examples\n#' drive_examples_local() |> basename()\n#' drive_examples_local(\"chicken\") |> basename()\n#' drive_example_local(\"imdb\")\n#'\n#' @examplesIf drive_has_token()\n#' drive_examples_remote()\n#' drive_examples_remote(\"chicken\")\n#' drive_example_remote(\"chicken_doc\")\nNULL\n\n#' @rdname drive_examples\n#' @export\ndrive_examples_local <- function(matches) {\n  out <- many_files(\n    needle = matches,\n    haystack = local_example_files(),\n    where = \"local\"\n  )\n  out$path\n}\n\n#' @rdname drive_examples\n#' @export\ndrive_examples_remote <- function(matches) {\n  many_files(\n    needle = matches,\n    haystack = remote_example_files(),\n    where = \"remote\"\n  )\n}\n\n#' @rdname drive_examples\n#' @export\ndrive_example_local <- function(matches) {\n  out <- one_file(\n    needle = matches,\n    haystack = local_example_files(),\n    where = \"local\"\n  )\n  out$path\n}\n\n#' @rdname drive_examples\n#' @export\ndrive_example_remote <- function(matches) {\n  one_file(\n    needle = matches,\n    haystack = remote_example_files(),\n    where = \"remote\"\n  )\n}\n\nmany_files <- function(needle, haystack, where = c(\"local\", \"remote\")) {\n  where <- match.arg(where)\n  out <- haystack\n\n  if (!missing(needle)) {\n    check_needle(needle)\n    sel <- grepl(needle, haystack$name, ignore.case = TRUE)\n    if (!any(sel)) {\n      drive_abort(\n        \"Can't find a {where} example file with a name that matches \\\\\n        \\\"{needle}\\\".\"\n      )\n    }\n    out <- haystack[sel, ]\n  }\n\n  out\n}\n\none_file <- function(needle, haystack, where) {\n  out <- many_files(needle = needle, haystack = haystack, where = where)\n  if (nrow(out) > 1) {\n    drive_abort(c(\n      \"Found multiple matching {where} files:\",\n      bulletize(gargle_map_cli(out$name)),\n      i = \"Make the {.arg matches} regular expression more specific.\"\n    ))\n  }\n  out\n}\n\nlocal_example_files <- function() {\n  # inlining env_cache() logic, so I don't need bleeding edge rlang\n  if (!env_has(.googledrive, \"local_example_files\")) {\n    pths <- list.files(\n      system.file(\n        \"extdata\",\n        \"example_files\",\n        package = \"googledrive\",\n        mustWork = TRUE\n      ),\n      full.names = TRUE\n    )\n    env_poke(\n      .googledrive,\n      \"local_example_files\",\n      tibble(name = basename(pths), path = pths)\n    )\n  }\n  env_get(.googledrive, \"local_example_files\")\n}\n\nremote_example_files <- function() {\n  # inlining env_cache() logic, so I don't need bleeding edge rlang\n  if (!env_has(.googledrive, \"remote_example_files\")) {\n    inventory_id <- \"1XiwJJdoqoZ876OoSTjsnBZ5SxxUg6gUC\"\n    if (!drive_has_token()) {\n      # don't trigger auth just for this\n      local_drive_quiet()\n      local_deauth()\n    }\n    dat_string <- drive_read_string(as_id(inventory_id), encoding = \"UTF-8\")\n    dat <- utils::read.csv(text = dat_string, stringsAsFactors = FALSE)\n    env_poke(.googledrive, \"remote_example_files\", as_dribble(as_id(dat$id)))\n  }\n  env_get(.googledrive, \"remote_example_files\")\n}\n\ncheck_needle <- function(needle) {\n  if (is_string(needle)) {\n    return()\n  }\n  drive_abort(c(\n    \"{.arg matches} must be a string, not {.cls class(needle)}\"\n  ))\n}\n"
  },
  {
    "path": "R/drive_fields.R",
    "content": "#' Request partial resources\n#'\n#' @description You may be able to improve the performance of your API calls by\n#'   requesting only the metadata that you actually need. This function is\n#'   primarily for internal use and is currently focused on the [Files\n#'   resource](https://developers.google.com/drive/api/v3/reference/files). Note\n#'   that high-level googledrive functions assume that the `name`, `id`, and\n#'   `kind` fields are included, at a bare minimum. Assuming that `resource =\n#'   \"files\"` (the default), input provided via `fields` is checked for validity\n#'   against the known field names and the validated fields are returned. To see\n#'   a tibble containing all possible fields and a short description of each,\n#'   call `drive_fields(expose())`.\n#'\n#' @description `prep_fields()` prepares fields for inclusion as query\n#'   parameters.\n#'\n#' @seealso [Improve\n#'   performance](https://developers.google.com/drive/api/v3/performance), in\n#'   the Drive API documentation.\n#'\n#' @param fields Character vector of field names. If `resource = \"files\"`, they\n#'   are checked for validity. Otherwise, they are passed through.\n#' @param resource Character, naming the API resource of interest. Currently,\n#'   only the Files resource is anticipated.\n#'\n#' @return `drive_fields()`: Character vector of field names. `prep_fields()`: a\n#'   string.\n#' @export\n#'\n#' @examples\n#' # get a tibble of all fields for the Files resource + indicator of defaults\n#' drive_fields(expose())\n#'\n#' # invalid fields are removed and throw warning\n#' drive_fields(c(\"name\", \"parents\", \"ownedByMe\", \"pancakes!\"))\n#'\n#' # prepare fields for query\n#' prep_fields(c(\"name\", \"parents\", \"kind\"))\ndrive_fields <- function(fields = NULL, resource = \"files\") {\n  if (!identical(resource, \"files\")) {\n    drive_bullets(c(\n      \"!\" = \"Currently only fields for the {.field files} resource can be \\\\\n             checked for validity.\",\n      \" \" = \"Nothing done.\"\n    ))\n  }\n  if (is.null(fields)) {\n    return(invisible(character()))\n  }\n  if (is_expose(fields)) {\n    return(.drive$files_fields)\n  }\n\n  stopifnot(is.character(fields))\n  if (!identical(resource, \"files\")) {\n    return(fields)\n  }\n\n  out <- intersect(fields, .drive$files_fields$name)\n  if (!setequal(fields, out)) {\n    bad_fields <- setdiff(fields, out)\n    drive_warn(c(\n      \"Omitting fields that are not recognized as part of the Files resource:\",\n      bulletize(gargle_map_cli(bad_fields))\n    ))\n  }\n  out\n}\n\n#' @rdname drive_fields\n#' @export\nprep_fields <- function(fields, resource = \"files\") {\n  resource <- glue(\"{resource}/\")\n  paste0(resource, fields, collapse = \",\")\n}\n## usage:\n## resource = NULL because we prepend \"files/\" when n > 1 items can come back\n# request <- request_generate(\n#   endpoint = \"drive.files.get\",\n#   params = list(\n#     fileId = two_files_search$id[1],\n#     fields = prep_fields(c(\"name\", \"owners\"), resource = NULL)\n#   )\n# )\n# response <- request_make(request)\n# gargle::response_process(response)\n"
  },
  {
    "path": "R/drive_find.R",
    "content": "#' Find files on Google Drive\n#'\n#' This is the closest googledrive function to what you can do at\n#' <https://drive.google.com>: by default, you just get a listing of your files.\n#' You can also search in various ways, e.g., filter by file type or ownership\n#' or work with [shared drives][shared_drives]. This is a very powerful\n#' function. Together with the more specific [drive_get()], this is the main way\n#' to identify files to target for downstream work. If you know you want to\n#' search within a specific folder or shared drive, use [drive_ls()].\n\n#' @section File type:\n#'\n#'   The `type` argument is pre-processed with [drive_mime_type()], so you can\n#'   use a few shortcuts and file extensions, in addition to full-blown MIME\n#'   types. googledrive forms a search clause to pass to `q`.\n\n#' @section Search parameters:\n#'\n#' Do advanced search on file properties by providing search clauses to the\n#' `q` parameter that is passed to the API via `...`. Multiple `q` clauses or\n#' vector-valued `q` are combined via 'and'.\n\n#' @section Trash:\n#'\n#'   By default, `drive_find()` sets `trashed = FALSE` and does not include\n#'   files in the trash. Literally, it adds `q = \"trashed = false\"` to the\n#'   query. To search *only* the trash, set `trashed = TRUE`. To see files\n#'   regardless of trash status, set `trashed = NA`, which adds\n#'   `q = \"(trashed = true or trashed = false)\"` to the query.\n\n#' @section Sort order:\n#'\n#'   By default, `drive_find()` sends `orderBy = \"recency desc\"`, so the top\n#'   files in your result have high \"recency\" (whatever that means). To suppress\n#'   sending `orderBy` at all, do `drive_find(orderBy = NULL)`. The `orderBy`\n#'   parameter accepts sort keys in addition to `recency`, which are documented\n#'   in the [`files.list` endpoint](https://developers.google.com/drive/api/v3/reference/files/list).\n#'   googledrive translates a snake_case specification of `order_by` into the\n#'   lowerCamel form, `orderBy`.\n\n#' @section Shared drives and domains:\n#'\n#'   If you work with shared drives and/or Google Workspace, you can apply your\n#'   search query to collections of items beyond those associated with \"My\n#'   Drive\". Use the `shared_drive` or `corpus` arguments to control this.\n#'   Read more about [shared drives][shared_drives].\n\n#' @seealso Wraps the `files.list` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/files/list>\n#'\n#' Helpful resource for forming your own queries:\n#'   * <https://developers.google.com/drive/api/v3/search-files>\n#'\n#' @template pattern\n#' @param trashed Logical. Whether to search files that are not in the trash\n#'   (`trashed = FALSE`, the default), only files that are in the trash\n#'   (`trashed = TRUE`), or to search regardless of trashed status (`trashed =\n#'   NA`).\n#' @param type Character. If provided, only files of this type will be returned.\n#'   Can be anything that [drive_mime_type()] knows how to handle. This is\n#'   processed by googledrive and sent as a query parameter.\n#' @template n_max\n#' @template shared_drive-singular\n#' @template corpus\n#' @param ... Other parameters to pass along in the request. The most likely\n#'   candidate is `q`. See below and the API's\n#'   [Search for files and folders guide](https://developers.google.com/drive/api/v3/search-files).\n#' @template verbose\n#' @template team_drive-singular\n#'\n#' @eval return_dribble()\n#' @examples\n#' \\dontrun{\n#' # list \"My Drive\" w/o regard for folder hierarchy\n#' drive_find()\n#'\n#' # filter for folders, the easy way and the hard way\n#' drive_find(type = \"folder\")\n#' drive_find(q = \"mimeType = 'application/vnd.google-apps.folder'\")\n#'\n#' # filter for Google Sheets, the easy way and the hard way\n#' drive_find(type = \"spreadsheet\")\n#' drive_find(q = \"mimeType='application/vnd.google-apps.spreadsheet'\")\n#'\n#' # files whose names match a regex\n#' # the local, general, sometimes-slow-to-execute version\n#' drive_find(pattern = \"ick\")\n#' # the server-side, executes-faster version\n#' # NOTE: works only for a pattern at the beginning of file name\n#' drive_find(q = \"name contains 'chick'\")\n#'\n#' # search for files located directly in your root folder\n#' drive_find(q = \"'root' in parents\")\n#' # FYI: this is equivalent to\n#' drive_ls(\"~/\")\n#'\n#' # control page size or cap the number of files returned\n#' drive_find(pageSize = 50)\n#' # all params passed through `...` can be camelCase or snake_case\n#' drive_find(page_size = 50)\n#' drive_find(n_max = 58)\n#' drive_find(page_size = 5, n_max = 15)\n#'\n#' # various ways to specify q search clauses\n#' # multiple q's\n#' drive_find(\n#'   q = \"name contains 'TEST'\",\n#'   q = \"modifiedTime > '2020-07-21T12:00:00'\"\n#' )\n#' # vector q\n#' drive_find(q = c(\"starred = true\", \"visibility = 'anyoneWithLink'\"))\n#'\n#' # default `trashed = FALSE` excludes files in the trash\n#' # `trashed = TRUE` consults ONLY file in the trash\n#' drive_find(trashed = TRUE)\n#' # `trashed = NA` disregards trash status completely\n#' drive_find(trashed = NA)\n#'\n#' # suppress the default sorting on recency\n#' drive_find(order_by = NULL, n_max = 5)\n#'\n#' # sort on various keys\n#' drive_find(order_by = \"modifiedByMeTime\", n_max = 5)\n#' # request descending order\n#' drive_find(order_by = \"quotaBytesUsed desc\", n_max = 5)\n#' }\n#'\n#' @export\ndrive_find <- function(\n  pattern = NULL,\n  trashed = FALSE,\n  type = NULL,\n  n_max = Inf,\n  shared_drive = NULL,\n  corpus = NULL,\n  ...,\n  verbose = deprecated(),\n  team_drive = deprecated()\n) {\n  warn_for_verbose(verbose)\n  if (!is.null(pattern) && !(is_string(pattern))) {\n    drive_abort(\"{.arg pattern} must be a character string.\")\n  }\n  stopifnot(is_toggle(trashed))\n  stopifnot(is.numeric(n_max), n_max >= 0, length(n_max) == 1)\n\n  if (lifecycle::is_present(team_drive)) {\n    lifecycle::deprecate_warn(\n      \"2.0.0\",\n      \"drive_find(team_drive)\",\n      \"drive_find(shared_drive)\"\n    )\n    shared_drive <- shared_drive %||% team_drive\n  }\n\n  if (n_max < 1) {\n    return(dribble())\n  }\n\n  params <- toCamel(list2(...))\n  params[[\"fields\"]] <- params[[\"fields\"]] %||% \"*\"\n  if (!has_name(params, \"orderBy\")) {\n    params[[\"orderBy\"]] <- \"recency desc\"\n  }\n  params <- marshal_q_clauses(params)\n\n  trash_clause <- switch(\n    as.character(trashed),\n    `TRUE` = \"trashed = true\",\n    `FALSE` = \"trashed = false\",\n    \"(trashed = true or trashed = false)\"\n  )\n  params$q <- append(params$q, trash_clause)\n\n  if (!is.null(type)) {\n    ## if they are all NA, this will error, because drive_mime_type()\n    ## doesn't allow it, otherwise we proceed with the non-NA mime types\n    mime_type <- drive_mime_type(type)\n    mime_type <- purrr::discard(mime_type, is.na)\n    params$q <- append(params$q, or(glue(\"mimeType = {sq(mime_type)}\")))\n  }\n\n  params$q <- and(params$q)\n\n  params <- append(params, handle_shared_drives(shared_drive, corpus))\n\n  request <- request_generate(endpoint = \"drive.files.list\", params = params)\n  proc_res_list <- do_paginated_request(\n    request,\n    n_max = n_max,\n    n = function(x) length(x$files)\n  )\n\n  res_tbl <- proc_res_list |>\n    map(\"files\") |>\n    purrr::flatten() |>\n    as_dribble()\n\n  # there is some evidence of overlap in the results returned in different\n  # pages; this is attempt to eliminate a 2nd (or 3rd ...) record for an ID\n  # #272 #273 #277 #279 #281\n  res_tbl <- res_tbl[!duplicated(res_tbl$id), ]\n\n  if (!is.null(pattern)) {\n    res_tbl <- res_tbl[grep(pattern, res_tbl$name), ]\n  }\n  if (n_max < nrow(res_tbl)) {\n    res_tbl <- res_tbl[seq_len(n_max), ]\n  }\n  res_tbl\n}\n\n## finds all the q clauses and collapses into one character vector of clauses\n## these are destined to be and'ed to form q in the query\nmarshal_q_clauses <- function(params) {\n  params <- partition_params(params, \"q\")\n  if (length(params[[\"matched\"]]) == 0) {\n    return(params[[\"unmatched\"]])\n  }\n\n  q_bits <- params[[\"matched\"]]\n  stopifnot(all(vapply(q_bits, is.character, logical(1))))\n  q_bits <- unique(unlist(q_bits, use.names = FALSE))\n  q_bits <- q_bits[lengths(q_bits) > 0]\n  c(params[[\"unmatched\"]], q = list(q_bits))\n}\n\n# https://developers.google.com/drive/api/v3/search-shareddrives#query_multiple_terms_with_parentheses\nparenthesize <- function(x) glue(\"({x})\")\nand <- function(x) glue_collapse(parenthesize(x), sep = \" and \")\nor <- function(x) glue_collapse(x, sep = \" or \")\n\nhandle_shared_drives <- function(shared_drive, corpus) {\n  if (!is.null(shared_drive)) {\n    shared_drive <- as_shared_drive(shared_drive)\n    if (no_file(shared_drive)) {\n      drive_abort(\"Can't find the requested {.arg shared_drive}.\")\n    }\n    shared_drive <- as_id(shared_drive)\n  }\n  if (identical(corpus, \"all\")) {\n    lifecycle::deprecate_warn(\n      \"2.0.0\",\n      \"drive_find(corpus = 'now expects \\\"allDrives\\\" instead of \\\"all\\\"')\"\n    )\n    corpus <- \"allDrives\"\n  }\n  if (is.null(shared_drive) && is.null(corpus)) {\n    return()\n  }\n  shared_drive_params(shared_drive, corpus)\n}\n"
  },
  {
    "path": "R/drive_get.R",
    "content": "#' Get Drive files by path or id\n#'\n#' Retrieves metadata for files specified via `path` or via file `id`. This\n#' function is quite straightforward if you specify files by `id`. But there are\n#' some important considerations when you specify your target files by `path`.\n#' See below for more. If the target files are specified via `path`, the\n#' returned [`dribble`] will include a `path` column.\n\n#' @section Getting by `path`:\n#'\n#'   Google Drive does NOT behave like your local file system! File and folder\n#'   names need not be unique, even at a given level of the hierarchy. This\n#'   means that a single path can describe multiple files (or 0 or exactly 1).\n#'\n#'   A single file can also be compatible with multiple paths, i.e. one path\n#'   could be more specific than the other. A file located at `~/alfa/bravo` can\n#'   be found as `bravo`, `alfa/bravo`, and `~/alfa/bravo`. If all 3 of those\n#'   were included in the input `path`, they would be represented by a\n#'   **single** row in the output.\n#'\n#'   It's best to think of `drive_get()` as a setwise operation when using file\n#'   paths. Do not assume that the `i`-th input path corresponds to row `i` in\n#'   the output (although it often does!). If there's not a 1-to-1 relationship\n#'   between the input and output, this will be announced in a message.\n#'\n#'   `drive_get()` performs just enough path resolution to uniquely identify a\n#'   file compatible with each input `path`, for all `path`s at once. If you\n#'   absolutely want the full canonical path, run the output of `drive_get()`\n#'   through [`drive_reveal(d, \"path\")`][drive_reveal()]`.\n#'\n\n#' @section Files that you don't own:\n#'\n#'   If you want to get a file via `path` and it's not necessarily on your My\n#'   Drive, you may need to specify the `shared_drive` or `corpus` arguments to\n#'   search other collections of items. Read more about [shared\n#'   drives][shared_drives].\n#'\n#' @seealso To add path information to any [`dribble`] that lacks it, use\n#'   [`drive_reveal(d, \"path\")`][drive_reveal()]. To list the contents of a\n#'   folder, use [drive_ls()]. For general searching, use [drive_find()].\n#'\n#' Wraps the `files.get` endpoint and, if you specify files by name or\n#'   path, also calls `files.list`:\n#'   * <https://developers.google.com/drive/api/v3/reference/files/get>\n#'   * <https://developers.google.com/drive/api/v3/reference/files/list>\n#'\n#' @param path Character vector of path(s) to get. Use a trailing slash to\n#'   indicate explicitly that a path is a folder, which can disambiguate if\n#'   there is a file of the same name (yes this is possible on Drive!). If\n#'   `path` appears to contain Drive URLs or is explicitly marked with\n#'   [as_id()], it is treated as if it was provided via the `id` argument.\n#' @param id Character vector of Drive file ids or URLs (it is first processed\n#'   with [as_id()]). If both `path` and `id` are non-`NULL`, `id` is silently\n#'   ignored.\n#' @template shared_drive-singular\n#' @template corpus\n#' @template verbose\n#' @template team_drive-singular\n#'\n#' @eval return_dribble(extras = \"If the target files were specified via `path`,\n#'   there will be a `path` column.\")\n#' @export\n#'\n#' @examplesIf drive_has_token()\n#' # get info about your \"My Drive\" root folder\n#' drive_get(\"~/\")\n#' # the API reserves the file id \"root\" for your root folder\n#' drive_get(id = \"root\")\n#' drive_get(id = \"root\") |> drive_reveal(\"path\")\n#'\n#' # set up some files to get by path\n#' alfalfa <- drive_mkdir(\"alfalfa\")\n#' broccoli <- drive_upload(\n#'   drive_example_local(\"chicken.txt\"),\n#'   name = \"broccoli\", path = alfalfa\n#' )\n#' drive_get(\"broccoli\")\n#' drive_get(\"alfalfa/broccoli\")\n#' drive_get(\"~/alfalfa/broccoli\")\n#' drive_get(c(\"broccoli\", \"alfalfa/\", \"~/alfalfa/broccoli\"))\n#'\n#' # Clean up\n#' drive_rm(alfalfa)\n#'\n#' \\dontrun{\n#' # The examples below are indicative of correct syntax.\n#' # But note these will generally result in an error or a\n#' # 0-row dribble, unless you replace the inputs with paths\n#' # or file ids that exist in your Drive.\n#'\n#' # multiple names\n#' drive_get(c(\"abc\", \"def\"))\n#'\n#' # multiple names, one of which must be a folder\n#' drive_get(c(\"abc\", \"def/\"))\n#'\n#' # query by file id(s)\n#' drive_get(id = \"abcdefgeh123456789\")\n#' drive_get(as_id(\"abcdefgeh123456789\"))\n#' drive_get(id = c(\"abcdefgh123456789\", \"jklmnopq123456789\"))\n#'\n#' # apply to a browser URL for, e.g., a Google Sheet\n#' my_url <- \"https://docs.google.com/spreadsheets/d/FILE_ID/edit#gid=SHEET_ID\"\n#' drive_get(my_url)\n#' drive_get(as_id(my_url))\n#' drive_get(id = my_url)\n#'\n#' # access the shared drive named \"foo\"\n#' # shared_drive params must be specified if getting by path\n#' foo <- shared_drive_get(\"foo\")\n#' drive_get(c(\"this.jpg\", \"that-file\"), shared_drive = foo)\n#' # shared_drive params are not necessary if getting by id\n#' drive_get(as_id(\"123456789\"))\n#'\n#' # search all shared drives and other files user has accessed\n#' drive_get(c(\"this.jpg\", \"that-file\"), corpus = \"allDrives\")\n#' }\ndrive_get <- function(\n  path = NULL,\n  id = NULL,\n  shared_drive = NULL,\n  corpus = NULL,\n  verbose = deprecated(),\n  team_drive = deprecated()\n) {\n  warn_for_verbose(verbose)\n  if (length(path) + length(id) == 0) {\n    return(dribble_with_path())\n  }\n  stopifnot(is.null(path) || is.character(path))\n  stopifnot(is.null(id) || is.character(id))\n\n  if (lifecycle::is_present(team_drive)) {\n    lifecycle::deprecate_warn(\n      \"2.0.0\",\n      \"drive_get(team_drive)\",\n      \"drive_get(shared_drive)\"\n    )\n    shared_drive <- shared_drive %||% team_drive\n  }\n\n  if (!is.null(path) && any(is_drive_url(path))) {\n    path <- as_id(path)\n  }\n\n  if (!is.null(path) && is_drive_id(path)) {\n    id <- path\n    path <- NULL\n  }\n\n  if (is.null(path)) {\n    as_dribble(map(as_id(id), get_one_file_id))\n  } else {\n    drive_get_path(path, shared_drive, corpus)\n  }\n}\n\nget_one_file_id <- function(id) {\n  if (is.na(id)) {\n    drive_abort(\"Can't {.fun drive_get} a file when {.arg id} is {.code NA}.\")\n  }\n  # drive_id validity checks catch the id = \"\" case, but just FYI:\n  # when id = \"\", drive.files.get actually becomes a call to drive.files.list\n  # and, therefore, returns 100 files by default; this is a bad thing\n  request <- request_generate(\n    endpoint = \"drive.files.get\",\n    params = list(\n      fileId = id,\n      fields = \"*\"\n    )\n  )\n  response <- request_make(request)\n  gargle::response_process(response)\n}\n"
  },
  {
    "path": "R/drive_get_path.R",
    "content": "# all the helpers behind:\n# drive_get(path =)\n# drive_reveal(what = \"path\")\n\ndrive_reveal_path <- function(x, ancestors = c(\"none\", \"parents\", \"all\")) {\n  stopifnot(inherits(x, \"dribble\"))\n  if (no_file(x)) {\n    return(dribble_with_path())\n  }\n  ancestors <- ancestors %||% dribble()\n\n  if (!inherits(ancestors, \"dribble\")) {\n    ancestors <- arg_match(ancestors)\n    if (ancestors == \"all\") {\n      tmp <- sort_out_shared_drive_and_corpus(x)\n      shared_drive <- tmp$shared_drive\n      corpus <- tmp$corpus\n    }\n    ancestors <- switch(\n      ancestors,\n      none = dribble(),\n      parents = get_immediate_parents(x),\n      all = get_folders(shared_drive = shared_drive, corpus = corpus)\n    )\n  }\n\n  resolve_paths(x, ancestors)\n}\n\ndrive_reveal_canonical_path <- function(x) {\n  drive_reveal_path(x, ancestors = \"all\")\n}\n\n# TODO: can this somehow be unified with drive_find()'s fussing about with\n# (shared_drive, corpus) and with shared_drive_params()?\nsort_out_shared_drive_and_corpus <- function(x) {\n  shared_drive <- NULL\n  corpus <- NULL\n  sid <- map_chr(x$drive_resource, \"driveId\", .default = NA)\n  sid <- unique(sid[!is.na(sid)])\n  if (length(sid) == 1) {\n    shared_drive <- as_id(sid)\n  }\n  if (length(sid) > 1) {\n    corpus <- \"allDrives\"\n  }\n  list(shared_drive = shared_drive, corpus = corpus)\n}\n\ndrive_get_path <- function(path = NULL, shared_drive = NULL, corpus = NULL) {\n  if (length(path) == 0) {\n    return(dribble_with_path())\n  }\n  stopifnot(is_path(path))\n  path <- rootize_path(path)\n\n  last_path_part <- get_last_path_part(path)\n  candidates <- get_by_name(\n    last_path_part,\n    shared_drive = shared_drive,\n    corpus = corpus\n  )\n  candidates <- drive_reveal_path(candidates)\n\n  # setup a tibble to structure the work\n  dat <- tibble(\n    orig_path = path,\n    doomed = !map_lgl(\n      last_path_part,\n      path_has_match,\n      haystack = candidates$path\n    ),\n    done = FALSE\n  )\n\n  dat$done <- map_lgl(dat$orig_path, path_has_match, haystack = candidates$path)\n  if (all(dat$done | dat$doomed)) {\n    return(finalize(dat, candidates))\n  }\n  # all undone paths assert something about parent folder(s)\n\n  candidates <- drive_reveal_path(candidates, \"parents\")\n  dat$done <- map_lgl(dat$orig_path, path_has_match, haystack = candidates$path)\n  if (all(dat$done | dat$doomed)) {\n    return(finalize(dat, candidates))\n  }\n\n  candidates <- drive_reveal_path(candidates, \"all\")\n  dat$done <- map_lgl(dat$orig_path, path_has_match, haystack = candidates$path)\n  if (all(dat$done | dat$doomed)) {\n    return(finalize(dat, candidates))\n  }\n\n  # TODO: paths that are still undone could possibly be resolved by considering\n  # folder shortcuts, i.e. non-canonical paths\n  # but for now, just return what we've got\n  finalize(dat, candidates)\n}\n\npath_match <- function(needle, haystack) {\n  if (!has_slash(needle)) {\n    haystack <- strip_slash(haystack)\n  }\n  if (startsWith(needle, \"[/~]\")) {\n    needle <- paste0(\"^\", needle)\n  }\n  needle <- paste0(escape_regex(needle), \"$\")\n  grep(needle, haystack)\n}\n\npath_has_match <- function(needle, haystack) {\n  any(path_match(needle, haystack))\n}\n\nget_folders <- function(shared_drive = NULL, corpus = NULL) {\n  # TODO: could possibly be nice to limit the fields\n  folders <-\n    drive_find(type = \"folder\", shared_drive = shared_drive, corpus = corpus)\n  folders <- vec_rbind(root_folder(), folders)\n}\n\nget_immediate_parents <- function(x) {\n  stopifnot(inherits(x, \"dribble\"))\n  x <- drive_reveal(x, \"parent\")\n  parent_ids <- unique(x$id_parent[!is.na(x$id_parent)])\n  # TODO: I suspect I must deal with the case where don't have permission to\n  # drive_get() one of these ids, but I haven't tripped up on this yet myself.\n  # TODO: could possibly be nice to limit the fields\n  drive_get(id = as_id(parent_ids))\n}\n\nresolve_paths <- function(d, folders = dribble()) {\n  probands <- pthize(d)\n  ancestors <- pthize(folders)\n  raw_paths <- map(probands, ~ pth(list(.x), ancestors))\n  pretty_paths <- map_chr(raw_paths, pathify)\n  put_column(d, nm = \"path\", val = pretty_paths, .after = \"name\")\n}\n\n# converts files in a dribble to the form used in pth()\npthize <- function(d) {\n  d <- d |>\n    drive_reveal(\"mime_type\") |>\n    drive_reveal(\"parent\") |>\n    drive_reveal(\"shortcut_details\")\n  purrr::transpose(\n    d[c(\n      \"id\",\n      \"id_parent\", # needed to resolve path relationships\n      \"name\",\n      \"mime_type\",\n      \"shortcut_details\" # needed to create path string\n    )]\n  )\n}\n\n# turns the output of pth() (a list) into a filepath (a string)\npathify <- function(x) {\n  x <- map_if(\n    x,\n    ~ .x$id == root_id(),\n    ~ {\n      .x$name <- \"~\"\n      .x\n    }\n  )\n\n  last_mime_type <- pluck(last(x), \"mime_type\")\n  last_is_folder <- identical(last_mime_type, drive_mime_type(\"folder\"))\n  last_is_folder_shortcut <-\n    identical(last_mime_type, drive_mime_type(\"shortcut\")) &&\n    identical(\n      pluck(last(x), \"shortcut_details\", \"targetMimeType\"),\n      drive_mime_type(\"folder\")\n    )\n  if (last_is_folder || last_is_folder_shortcut) {\n    nm <- pluck(last(x), \"name\")\n    purrr::pluck(x, length(x), \"name\") <- append_slash(nm)\n  }\n\n  glue_collapse(map_chr(x, \"name\"), sep = \"/\")\n}\n\n# the recursive workhorse that walks up a file tree\n# x is a list, each element describes 1 file\n# a file is described by:\n# - id\n# - id_parent        (can be NA)\n# - name             (just along for the ride; needed to create path strings)\n# - mime_type        (ditto)\n# - shortcut_details (ditto; is often NULL)\n# typical x at start: list(some_file)\n# typical x at finish: list(grandparent_folder, parent_folder, some_file)\npth <- function(x, ancestors) {\n  this <- x[[1]]\n  if (is.na(this$id_parent)) {\n    return(x)\n  }\n  parent <- purrr::detect(ancestors, ~ identical(.x$id, this$id_parent))\n  if (is.null(parent)) {\n    return(x)\n  }\n  pth(c(list(parent), x), ancestors)\n}\n\nfinalize <- function(dat, candidates) {\n  scratch <- dat\n  scratch$m <- map(dat$orig_path, path_match, haystack = candidates$path)\n  scratch$nm <- lengths(scratch$m)\n  scratch$status <- NA_character_\n\n  # doomed: never even found a file with correct name, much less path\n  # (remember this filter goes a bit beyond the name, e.g. maybe folder-hood)\n  scratch$status[scratch$doomed] <- \"unmatched\"\n\n  # empty_string: special case of doomed\n  scratch$status[!nzchar(scratch$orig_path)] <- \"empty_string\"\n\n  # not doomed, but undone: these could be valid paths, but we won't know until\n  # we start resolving non-canonical paths\n  scratch$status[!scratch$done & !scratch$doomed] <- \"undone\"\n\n  # unspecific: path is compatible with more than 1 file\n  scratch$status[scratch$done & scratch$nm > 1] <- \"unspecific\"\n\n  # resolved: path identifies exactly 1 file\n  scratch$status[scratch$done & scratch$nm == 1] <- \"resolved\"\n\n  no_status <- is.na(scratch$status)\n  if (any(no_status)) {\n    abort(\"Internal error: paths with missing status\")\n  }\n\n  report_weird_stuff <- function(x, indicator, problem) {\n    weird <- vec_slice(x, x[[\"status\"]] == indicator)\n    if (vec_size(weird) == 0) {\n      return()\n    }\n    drive_bullets(c(\n      \"!\" = \"Problem with {nrow(weird)} path{?s}: {problem}\",\n      # these really should be sub-bullets, but not possible at this time\n      bulletize(\n        gargle_map_cli(weird[[\"orig_path\"]], \"{.path <<x>>}\"),\n        bullet = \" \"\n      )\n    ))\n  }\n  report_weird_stuff(scratch, \"unmatched\", \"no files found by this name\")\n  report_weird_stuff(scratch, \"undone\", \"no file has such a canonical path\")\n  report_weird_stuff(\n    scratch,\n    \"unspecific\",\n    \"path is compatible with more than 1 file\"\n  )\n\n  n_empty_string <- sum(scratch$status == \"empty_string\")\n  if (n_empty_string > 0) {\n    drive_bullets(c(\n      \"!\" = \"Problem with {n_empty_string} path{?s}: \\\\\n             path is empty string\"\n    ))\n  }\n\n  index <- unlist(scratch$m)\n  dupes <- duplicated(index)\n  if (any(dupes)) {\n    multis <- vec_slice(candidates, unique(index[dupes]))\n\n    drive_bullets(c(\n      \"!\" = \"{nrow(multis)} file{?s} in the output {?is/are} associated with \\\\\n             more than 1 input {.arg path}\",\n      # these really should be sub-bullets, but not possible at this time\n      bulletize(gargle_map_cli(multis), bullet = \" \")\n    ))\n  }\n\n  resolved <- scratch$status == \"resolved\"\n  if (all(resolved)) {\n    if (nrow(scratch) > 1) {\n      b <- c(\n        v = \"All {nrow(scratch)} input {.arg path}s resolved to exactly \\\\\n                  1 file.\"\n      )\n    } else {\n      b <- c(v = \"The input {.arg path} resolved to exactly 1 file.\")\n    }\n  } else if (any(resolved)) {\n    b <- c(\n      \"!\" = \"{sum(scratch$status == 'resolved')} out of {nrow(scratch)} \\\\\n                  input paths resolved to exactly 1 file.\"\n    )\n  } else {\n    # TODO: this wording is not great, yet I don't know what would be better\n    b <- c(\"!\" = \"No path resolved to exactly 1 file.\")\n  }\n  drive_bullets(b)\n\n  vec_slice(candidates, index[!dupes])\n}\n\nget_by_name <- function(names, shared_drive = NULL, corpus = NULL) {\n  nms <- strip_slash(unique(names))\n  is_root <- nms == \"~\"\n  nms <- nms[!is_root]\n  q_clauses <- glue(\"name = {sq(nms)}\")\n\n  # fields <-\n  #   c(\"kind\", \"id\", \"name\", \"mimeType\", \"parents\", \"shortcutDetails\", \"driveId\")\n  if (length(q_clauses) == 0) {\n    found <- dribble()\n  } else {\n    found <- drive_find(\n      q = or(q_clauses),\n      # fields = prep_fields(fields),\n      shared_drive = shared_drive,\n      corpus = corpus\n    )\n  }\n\n  if (any(is_root)) {\n    found <- vec_rbind(root_folder(), found)\n  }\n\n  found\n}\n\n# you might think this can be merged with partition_path(), but their purposes\n# are different enough that it's not worth it\nget_last_path_part <- function(path) {\n  stopifnot(is_path(path))\n  path <- rootize_path(path)\n\n  # NOTE: we ignore (but retain) a trailing slash\n  # why? googledrive encourages the user to use a trailing slash to explicitly\n  # indicate a path that refers to a folder\n  slash_pos <- gregexpr(pattern = \"/.\", path)\n  no_slash <- map_lgl(slash_pos, ~ all(.x == -1))\n  last_slash <- map_int(slash_pos, max)\n  ifelse(no_slash, path, substr(path, last_slash + 1, nchar(path)))\n}\n"
  },
  {
    "path": "R/drive_id-class.R",
    "content": "#' `drive_id` class\n#'\n#' @description\n\n#' `drive_id` is an S3 class to mark strings as Drive file ids, in order to\n#' distinguish them from Drive file names or paths. `as_id()` converts various\n#' inputs into an instance of `drive_id`.\n#'\n#' `as_id()` is a generic function.\n\n#' @param x A character vector of file or shared drive ids or URLs, a\n#'   [`dribble`], or a suitable data frame.\n#' @param ... Other arguments passed down to methods. (Not used.)\n#' @return A character vector bearing the S3 class `drive_id`.\n#' @name drive_id\n#' @examplesIf drive_has_token()\n#' as_id(\"123abc\")\n#' as_id(\"https://docs.google.com/spreadsheets/d/qawsedrf16273849/edit#gid=12345\")\n#'\n#' x <- drive_find(n_max = 3)\n#' as_id(x)\nNULL\n\nnew_drive_id <- function(x = character()) {\n  vec_assert(x, character())\n  new_vctr(x, class = \"drive_id\", inherit_base_type = TRUE)\n}\n\nvalidate_drive_id <- function(x) {\n  ok <- is_valid_drive_id(x)\n  if (all(ok)) {\n    return(x)\n  }\n\n  # proceed with plain character vector\n  x <- vec_data(x)\n  # pragmatism re: how to cli-style a path that is the empty string\n  # this is related to the use of gargle_map_cli() for vectorized styling\n  # if cli gains native vectorization, this may become unnecessary\n  x[!nzchar(x)] <- \"\\\"\\\"\"\n\n  drive_abort(c(\n    \"A {.cls drive_id} must match this regular expression: \\\\\n     {.code {drive_id_regex()}}\",\n    \"Invalid input{?s}:{cli::qty(sum(!ok))}\",\n    bulletize(gargle_map_cli(x[!ok]), bullet = \"x\")\n  ))\n}\n\n#' @export\n#' @rdname drive_id\nas_id <- function(x, ...) UseMethod(\"as_id\")\n\n#' @export\nas_id.default <- function(x, ...) {\n  drive_abort(\n    \"\n    Don't know how to coerce an object of class {.cls {class(x)}} into \\\\\n    a {.cls drive_id}.\"\n  )\n}\n\n#' @export\nas_id.NULL <- function(x, ...) NULL\n\n#' @export\nas_id.drive_id <- function(x, ...) x\n\n#' @export\nas_id.dribble <- function(x, ...) as_id(x$id)\n\n#' @export\nas_id.data.frame <- function(x, ...) as_id(validate_dribble(new_dribble(x)))\n\n#' @export\nas_id.character <- function(x, ...) {\n  if (length(x) == 0L) {\n    return(new_drive_id())\n  }\n  out <- map_chr(x, get_one_id)\n  validate_drive_id(new_drive_id(out))\n}\n\ndrive_id_regex <- function() \"^[a-zA-Z0-9_-]+$\"\n\nis_valid_drive_id <- function(x) {\n  # among practitioners, It Is Known that file IDs have >= 25 characters\n  # but I'm not convinced the pros outweigh the cons re: checking length\n  # for example, in tests, it's nice to not worry about this\n  grepl(drive_id_regex(), x) | is.na(x)\n}\n\nis_drive_id <- function(x) {\n  inherits(x, \"drive_id\")\n}\n\n#' @export\ngargle_map_cli.drive_id <- function(x, ...) {\n  NextMethod()\n}\n\n#' @export\nvec_ptype2.drive_id.drive_id <- function(x, y, ...) new_drive_id()\n#' @export\nvec_ptype2.drive_id.character <- function(x, y, ...) character()\n#' @export\nvec_ptype2.character.drive_id <- function(x, y, ...) character()\n\n#' @export\nvec_cast.drive_id.drive_id <- function(x, to, ...) x\n#' @export\nvec_cast.drive_id.character <- function(x, to, ...) {\n  validate_drive_id(new_drive_id(x))\n}\n#' @export\nvec_cast.character.drive_id <- function(x, to, ...) vec_data(x)\n\n#' @export\nvec_ptype_abbr.drive_id <- function(x, ...) \"drv_id\"\n\n#' @export\npillar_shaft.drive_id <- function(x, ...) {\n  # The goal is to either see drive_id in full (which would allow, e.g. copy\n  # and paste) or to truncate it severely and leave room for more interesting\n  # columns, such as the Drive file name.\n  # Anything in between these two extremes seems like a waste of horizontal space.\n\n  x_valid <- !is.na(x)\n\n  # It's important to keep NA in the vector!\n  out <- rep(NA_character_, vec_size(x))\n  out[x_valid] <- format(x[x_valid])\n  out_short <- out\n\n  # nchar(\"<drv_id>\") is 8\n  n <- 8\n  trunkate <- function(x) {\n    glue(\"{substr(x, 1, n - 1)}{cli::symbol$continue}\")\n  }\n  out_width <- nchar(trimws(out))\n  too_wide <- which(x_valid & out_width > n)\n  if (any(too_wide)) {\n    out_short[too_wide] <- trunkate(out_short[too_wide])\n  }\n\n  have_color <- cli::num_ansi_colors() > 1\n  pillar::new_pillar_shaft_simple(\n    out,\n    short_formatted = out_short,\n    na = if (have_color) pillar::style_na(\"NA\") else \"<NA>\"\n  )\n}\n\n## we anticipate file-id-containing URLs in these forms:\n##       /d/FILE_ID   Drive file\n## /folders/FILE_ID   Drive folder\n##       id=FILE_ID   uploaded blob\nid_regexp <- \"(/d/|/folders/|id=)[^/?]+\"\n\nis_drive_url <- function(x) grepl(\"^http\", x) & grepl(id_regexp, x)\n\nget_one_id <- function(x) {\n  if (!grepl(\"^http|/\", x)) {\n    return(x)\n  }\n\n  id_loc <- regexpr(id_regexp, x)\n  if (id_loc == -1) {\n    NA_character_\n  } else {\n    gsub(\"/d/|/folders/|id=\", \"\", regmatches(x, id_loc))\n  }\n}\n"
  },
  {
    "path": "R/drive_ls.R",
    "content": "#' List contents of a folder or shared drive\n#'\n#' List the contents of a folder or shared drive, recursively or not. This is a\n#' thin wrapper around [drive_find()], that simply adds one constraint: the\n#' search is limited to direct or indirect children of `path`.\n#'\n#' @param path Specifies a single folder on Google Drive whose contents you want\n#'   to list. Can be an actual path (character), a file id or URL marked with\n#'   [as_id()], or a [`dribble`]. If it is a shared drive or is a folder on a\n#'   shared drive, it must be passed as a [`dribble`]. If `path` is a shortcut\n#'   to a folder, it is automatically resolved to its target folder.\n#' @param ... Any parameters that are valid for [drive_find()].\n#' @param recursive Logical, indicating if you want only direct children of\n#'   `path` (`recursive = FALSE`, the default) or all children, including\n#'   indirect (`recursive = TRUE`).\n#'\n#' @eval return_dribble()\n#' @export\n#' @examples\n#' \\dontrun{\n#' # get contents of the folder 'abc' (non-recursive)\n#' drive_ls(\"abc\")\n#'\n#' # get contents of folder 'abc' whose names contain the letters 'def'\n#' drive_ls(path = \"abc\", pattern = \"def\")\n#'\n#' # get all Google spreadsheets in folder 'abc'\n#' # whose names contain the letters 'def'\n#' drive_ls(path = \"abc\", pattern = \"def\", type = \"spreadsheet\")\n#'\n#' # get all the files below 'abc', recursively, that are starred\n#' drive_ls(path = \"abc\", q = \"starred = true\", recursive = TRUE)\n#' }\ndrive_ls <- function(path = NULL, ..., recursive = FALSE) {\n  stopifnot(is.logical(recursive), length(recursive) == 1)\n  if (is.null(path)) {\n    return(drive_find(...))\n  }\n\n  path <- as_parent(path)\n\n  params <- list2(...)\n  if (is_shared_drive(path)) {\n    params[[\"shared_drive\"]] <- as_id(path)\n  } else {\n    shared_drive <- pluck(path, \"drive_resource\", 1, \"driveId\")\n    if (!is.null(shared_drive)) {\n      params[[\"shared_drive\"]] <- params[[\"shared_drive\"]] %||%\n        as_id(shared_drive)\n    }\n  }\n\n  parent <- path[[\"id\"]]\n  if (isTRUE(recursive)) {\n    parent <- c(parent, folders_below(parent, params[[\"shared_drive\"]]))\n  }\n  parent <- glue(\"{sq(parent)} in parents\")\n  parent <- glue(\"({or(parent)})\")\n  params[[\"q\"]] <- append(params[[\"q\"]], parent)\n\n  exec(drive_find, !!!params)\n}\n\nfolders_below <- function(id, shared_drive = NULL) {\n  folder_kids <- folder_kids_of(id, shared_drive = shared_drive)\n  if (length(folder_kids) == 0) {\n    character()\n  } else {\n    c(\n      folder_kids,\n      unlist(\n        lapply(\n          folder_kids,\n          folders_below,\n          shared_drive = shared_drive\n        ),\n        recursive = FALSE\n      )\n    )\n  }\n}\n\nfolder_kids_of <- function(id, shared_drive = NULL) {\n  drive_find(\n    shared_drive = as_id(shared_drive),\n    type = \"folder\",\n    q = glue(\"{sq(id)} in parents\"),\n    fields = prep_fields(c(\"kind\", \"name\", \"id\"))\n  )[[\"id\"]]\n}\n"
  },
  {
    "path": "R/drive_mime_type.R",
    "content": "#' Lookup MIME type\n#'\n#' @description This is a helper to determine which MIME type should be used\n#' for a file. Three types of input are acceptable:\n#'   * Native Google Drive file types. Important examples:\n#'     - \"document\" for Google Docs\n#'     - \"folder\" for folders\n#'     - \"presentation\" for Google Slides\n#'     - \"spreadsheet\" for Google Sheets\n#'   * File extensions, such as \"pdf\", \"csv\", etc.\n#'   * MIME types accepted by Google Drive (these are simply passed through).\n#'\n#' @param type Character. Google Drive file type, file extension, or MIME type.\n#'   Pass the sentinel [`expose()`] if you want to get the full table used for\n#'   validation and lookup, i.e. all MIME types known to be relevant to the\n#'   Drive API.\n#'\n#' @return Character. MIME type.\n#'\n#' @examples\n#' ## get the mime type for Google Spreadsheets\n#' drive_mime_type(\"spreadsheet\")\n#'\n#' ## get the mime type for jpegs\n#' drive_mime_type(\"jpeg\")\n#'\n#' ## it's vectorized\n#' drive_mime_type(c(\"presentation\", \"pdf\", \"image/gif\"))\n#'\n#' ## see the internal tibble of MIME types known to the Drive API\n#' drive_mime_type(expose())\n#' @export\ndrive_mime_type <- function(type = NULL) {\n  if (is.null(type)) {\n    return(invisible())\n  }\n  if (is_expose(type)) {\n    return(.drive$mime_tbl)\n  }\n  if (!(is.character(type))) {\n    drive_abort(\"{.arg type} must be character.\")\n  }\n\n  human_m <- match(\n    type,\n    .drive$mime_tbl$human_type,\n    nomatch = NA_character_,\n    incomparables = NA\n  )\n  ext_m <- match(\n    type,\n    .drive$mime_tbl$mime_type,\n    nomatch = NA_character_,\n    incomparables = NA\n  )\n  m <- ifelse(is.na(human_m), ext_m, human_m)\n  mime_type <- .drive$mime_tbl$mime_type[m]\n\n  if (all(is.na(mime_type))) {\n    drive_abort(c(\n      \"Unrecognized {.arg type}:\",\n      bulletize(gargle_map_cli(type), bullet = \"x\")\n    ))\n  }\n  mime_type\n}\n\n#' Lookup extension from MIME type\n#'\n#' @description This is a helper to determinine which extension should be used\n#' for a file. Two types of input are acceptable:\n#'   * MIME types accepted by Google Drive.\n#'   * File extensions, such as \"pdf\", \"csv\", etc. (these are simply passed through).\n#'\n#' @param type Character. MIME type or file extension.\n#'\n#' @return Character. File extension.\n#'\n#' @examples\n#'\n#' ## get the extension for mime type image/jpeg\n#' drive_extension(\"image/jpeg\")\n#'\n#' ## it's vectorized\n#' drive_extension(c(\"text/plain\", \"pdf\", \"image/gif\"))\n#' @export\ndrive_extension <- function(type = NULL) {\n  if (is.null(type)) {\n    return(invisible())\n  }\n  stopifnot(is.character(type))\n\n  type <- drive_mime_type(type)\n  m <- map_int(type, one_ext)\n  .drive$mime_tbl$ext[m]\n}\n\none_ext <- function(type) {\n  m <- which(\n    .drive$mime_tbl$mime_type %in% type & is_true(.drive$mime_tbl$default)\n  )\n  if (length(m) == 0L) {\n    m <- NA_integer_\n  }\n  m\n}\n"
  },
  {
    "path": "R/drive_mkdir.R",
    "content": "#' Create a Drive folder\n#'\n#' Creates a new Drive folder. To update the metadata of an existing Drive file,\n#' including a folder, use [drive_update()].\n#'\n#' @seealso Wraps the `files.create` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/files/create>\n#'\n#' @param name Name for the new folder or, optionally, a path that specifies\n#'   an existing parent folder, as well as the new name.\n#' @eval param_path_known_parent(\"folder\")\n#' @inheritParams drive_create\n#'\n#' @eval return_dribble()\n#' @export\n#' @examplesIf drive_has_token()\n#' # Create folder named 'ghi', then another below named it 'jkl' and star it\n#' ghi <- drive_mkdir(\"ghi\")\n#' jkl <- drive_mkdir(\"ghi/jkl\", starred = TRUE)\n#'\n#' # is 'jkl' really starred? YES\n#' purrr::pluck(jkl, \"drive_resource\", 1, \"starred\")\n#'\n#' # Another way to create folder 'mno' in folder 'ghi'\n#' drive_mkdir(\"mno\", path = \"ghi\")\n#'\n#' # Yet another way to create a folder named 'pqr' in folder 'ghi',\n#' # this time with parent folder stored in a dribble,\n#' # and setting the new folder's description\n#' pqr <- drive_mkdir(\"pqr\", path = ghi, description = \"I am a folder\")\n#'\n#' # Did we really set the description? YES\n#' purrr::pluck(pqr, \"drive_resource\", 1, \"description\")\n#'\n#' # `overwrite = FALSE` errors if something already exists at target filepath\n#' # THIS WILL ERROR!\n#' drive_create(\"name-squatter-mkdir\", path = ghi)\n#' drive_mkdir(\"name-squatter-mkdir\", path = ghi, overwrite = FALSE)\n#'\n#' # `overwrite = TRUE` moves the existing item to trash, then proceeds\n#' drive_mkdir(\"name-squatter-mkdir\", path = ghi, overwrite = TRUE)\n#'\n#' # list everything inside 'ghi'\n#' drive_ls(\"ghi\")\n#'\n#' # Clean up\n#' drive_rm(ghi)\ndrive_mkdir <- function(\n  name,\n  path = NULL,\n  ...,\n  overwrite = NA,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n\n  drive_create(\n    name = name,\n    path = path,\n    type = \"application/vnd.google-apps.folder\",\n    ...,\n    overwrite = overwrite\n  )\n}\n"
  },
  {
    "path": "R/drive_mv.R",
    "content": "#' Move a Drive file\n#'\n#' Move a Drive file to a different folder, give it a different name, or both.\n#'\n\n#' @seealso Makes a metadata-only request to the `files.update` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/files/update>\n\n#' @template file-singular\n#' @eval param_path(\n#'   thing = \"file\",\n#'   default_notes = \"By default, the file stays in its current folder.\"\n#' )\n#' @eval param_name(\n#'   thing = \"file\",\n#'   default_notes = \"By default, the file keeps its current name.\"\n#' )\n#' @template overwrite\n#' @template verbose\n#'\n#' @eval return_dribble()\n#' @export\n#' @examplesIf drive_has_token()\n#' # create a file to move\n#' file <- drive_example_remote(\"chicken.txt\") |>\n#'   drive_cp(\"chicken-mv.txt\")\n#'\n#' # rename it, but leave in current folder (root folder, in this case)\n#' file <- drive_mv(file, \"chicken-mv-renamed.txt\")\n#'\n#' # create a folder to move the file into\n#' folder <- drive_mkdir(\"mv-folder\")\n#'\n#' # move the file and rename it again,\n#' # specify destination as a dribble\n#' file <- drive_mv(file, path = folder, name = \"chicken-mv-re-renamed.txt\")\n#'\n#' # verify renamed file is now in the folder\n#' drive_ls(folder)\n#'\n#' # move the file back to root folder\n#' file <- drive_mv(file, \"~/\")\n#'\n#' # move it again\n#' # specify destination as path with trailing slash\n#' # to ensure we get a move vs. renaming it to \"mv-folder\"\n#' file <- drive_mv(file, \"mv-folder/\")\n#'\n#' # `overwrite = FALSE` errors if something already exists at target filepath\n#' # THIS WILL ERROR!\n#' drive_create(\"name-squatter-mv\", path = \"~/\")\n#' drive_mv(file, path = \"~/\", name = \"name-squatter-mv\", overwrite = FALSE)\n#'\n#' # `overwrite = TRUE` moves the existing item to trash, then proceeds\n#' drive_mv(file, path = \"~/\", name = \"name-squatter-mv\", overwrite = TRUE)\n#'\n#' # Clean up\n#' drive_rm(file, folder)\ndrive_mv <- function(\n  file,\n  path = NULL,\n  name = NULL,\n  overwrite = NA,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n\n  file <- as_dribble(file)\n  file <- confirm_single_file(file)\n\n  if (is.null(path) && is.null(name)) {\n    drive_bullets(c(\n      \"!\" = \"Nothing to be done.\"\n    ))\n    return(invisible(file))\n  }\n\n  tmp <- rationalize_path_name(path, name)\n  path <- tmp$path\n  name <- tmp$name\n\n  params <- list()\n\n  # load (path, name) into params ... maybe\n  parent_before <- pluck(file, \"drive_resource\", 1, \"parents\", 1)\n  if (!is.null(path)) {\n    path <- as_parent(path)\n    if (path$id != parent_before) {\n      params[[\"addParents\"]] <- path$id\n      params[[\"removeParents\"]] <- parent_before\n    }\n  }\n  if (!is.null(name) && name != file$name) {\n    params[[\"name\"]] <- name\n  }\n\n  if (length(params) == 0) {\n    drive_bullets(c(\n      \"!\" = \"Nothing to be done.\"\n    ))\n    return(invisible(file))\n  }\n\n  check_for_overwrite(\n    parent = params[[\"addParents\"]] %||% parent_before,\n    name = params[[\"name\"]] %||% file$name,\n    overwrite = overwrite\n  )\n\n  params[[\"fields\"]] <- \"*\"\n  out <- drive_update_metadata(file, params)\n\n  actions <- c(\n    renamed = !identical(out$name, file$name),\n    moved = !is.null(params[[\"addParents\"]])\n  )\n  action <- glue_collapse(names(actions)[actions], last = \" and \")\n\n  drive_bullets(c(\n    \"Original file:\",\n    bulletize(gargle_map_cli(file)),\n    \"Has been {action}:\",\n    # drive_reveal_path() puts immediate parent, if specified, in the `path`\n    # then we reveal `path`, instead of `name`\n    bulletize(gargle_map_cli(\n      drive_reveal_path(out, ancestors = path),\n      template = c(\n        id_string = \"<id:\\u00a0<<id>>>\", # \\u00a0 is a nonbreaking space\n        out = \"{.drivepath <<path>>} {cli::col_grey('<<id_string>>')}\"\n      )\n    ))\n  ))\n\n  invisible(out)\n}\n"
  },
  {
    "path": "R/drive_publish.R",
    "content": "#' Publish native Google files\n#'\n#' Publish (or un-publish) native Google files to the web. Native Google files\n#' include Google Docs, Google Sheets, and Google Slides. The returned\n#' [`dribble`] will have extra columns, `published` and `revisions_resource`.\n#' Read more in [drive_reveal()].\n#'\n#' @seealso Wraps the `revisions.update` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/revisions/update>\n#'\n#' @template file-plural\n#' @param ... Name-value pairs to add to the API request body (see API docs\n#' linked below for details). For `drive_publish()`, we include\n#' `publishAuto = TRUE` and `publishedOutsideDomain = TRUE`, if user does not\n#' specify other values.\n#' @template verbose\n#'\n#' @eval return_dribble(extras = \"There will be extra columns, `published` and\n#'   `revisions_resource`.\")\n#' @export\n#' @examplesIf drive_has_token()\n#' # Create a file to publish\n#' file <- drive_example_remote(\"chicken_sheet\") |>\n#'   drive_cp()\n#'\n#' # Publish file\n#' file <- drive_publish(file)\n#' file$published\n#'\n#' # Unpublish file\n#' file <- drive_unpublish(file)\n#' file$published\n#'\n#' # Clean up\n#' drive_rm(file)\ndrive_publish <- function(file, ..., verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  drive_change_publish(file = file, publish = TRUE, ...)\n}\n\n#' @rdname drive_publish\n#' @export\ndrive_unpublish <- function(file, ..., verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  drive_change_publish(file = file, publish = FALSE, ...)\n}\n\ndrive_change_publish <- function(file, publish = TRUE, ...) {\n  file <- as_dribble(file)\n  file <- confirm_some_files(file)\n\n  type_ok <- is_native(file)\n  if (!all(type_ok)) {\n    file <- file[!type_ok, ]\n    file <- promote(file, \"mimeType\")\n    drive_abort(c(\n      \"Only native Google files can be published.\",\n      \"{.arg file} includes {?a/} file{?s} \\\\\n       with non-native MIME type{cli::qty(nrow(file))}\",\n      bulletize(gargle_map_cli(\n        file,\n        \"{.drivepath <<name>>}: {.field <<mimeType>>}\"\n      )),\n      \"i\" = \"You can use {.fun drive_share} to change a file's sharing \\\\\n             permissions.\"\n    ))\n  }\n\n  params <- toCamel(list2(...))\n  params[[\"published\"]] <- publish\n  params[[\"publishAuto\"]] <- params[[\"publishAuto\"]] %||% TRUE\n  params[[\"publishedOutsideDomain\"]] <-\n    params[[\"publishedOutsideDomain\"]] %||% TRUE\n  params[[\"revisionId\"]] <- \"head\"\n  params[[\"fields\"]] <- \"*\"\n\n  revision_resource <- map(\n    file$id,\n    change_publish_one,\n    params = params\n  )\n  n <- nrow(file)\n  drive_bullets(c(\n    cli::pluralize(\n      \"{cli::qty(n)}File{?s} now {if (publish) '' else 'NOT '}published:\"\n    ),\n    bulletize(gargle_map_cli(file))\n  ))\n  invisible(drive_reveal(file, \"published\"))\n}\n\nchange_publish_one <- function(id, params) {\n  params[[\"fileId\"]] <- id\n  request <- request_generate(\n    endpoint = \"drive.revisions.update\",\n    params = params\n  )\n  response <- request_make(request)\n  gargle::response_process(response)\n}\n\ndrive_reveal_published <- function(file) {\n  confirm_dribble(file)\n  revision_resource <- map(file$id, get_publish_one)\n  file <- put_column(\n    file,\n    nm = \"published\",\n    val = map_lgl(revision_resource, \"published\", .default = FALSE),\n    .after = 1\n  )\n  put_column(\n    file,\n    nm = \"revision_resource\",\n    val = revision_resource\n  )\n}\n\nget_publish_one <- function(id) {\n  request <- request_generate(\n    endpoint = \"drive.revisions.get\",\n    params = list(\n      fileId = id,\n      revisionId = \"head\",\n      fields = \"*\"\n    )\n  )\n  response <- request_make(request)\n  ## folders generate a 403\n  if (httr::status_code(response) == 403) {\n    return(NULL)\n  }\n  gargle::response_process(response)\n}\n"
  },
  {
    "path": "R/drive_put.R",
    "content": "#' PUT new media into a Drive file\n#'\n#' @description\n#' PUTs new media into a Drive file, in the HTTP sense:\n#' * If the file already exists, we replace its content.\n#' * If the file does not already exist, we create a new file.\n#'\n#' @description\n#' This is a convenience wrapper around [`drive_upload()`] and\n#' [`drive_update()`]. In pseudo-code:\n#'\n#' ```\n#' target_filepath <- <determined from `path`, `name`, and `media`>\n#' hits <- <get all Drive files at target_filepath>\n#' if (no hits) {\n#'   drive_upload(media, path, name, type, ...)\n#' } else if (exactly 1 hit) {\n#'   drive_update(hit, media, ...)\n#' } else {\n#'   ERROR\n#' }\n#' ```\n#'\n#' @inheritParams drive_upload\n#'\n#' @eval return_dribble()\n#' @export\n#' @examplesIf drive_has_token()\n#' # create a local file to work with\n#' local_file <- tempfile(\"drive_put_\", fileext = \".txt\")\n#' writeLines(c(\"beginning\", \"middle\"), local_file)\n#'\n#' # PUT to a novel filepath --> drive_put() delegates to drive_upload()\n#' file <- drive_put(local_file)\n#'\n#' # update the local file\n#' cat(\"end\", file = local_file, sep = \"\\n\", append = TRUE)\n#'\n#' # PUT again --> drive_put() delegates to drive_update()\n#' file <- drive_put(local_file)\n#'\n#' # create a second file at this filepath\n#' file2 <- drive_create(basename(local_file))\n#'\n#' # PUT again --> ERROR\n#' drive_put(local_file)\n#'\n#' # Clean up\n#' drive_find(\"drive_put_.+[.]txt\") |> drive_rm()\n#' unlink(local_file)\ndrive_put <- function(\n  media,\n  path = NULL,\n  name = NULL,\n  ...,\n  type = NULL,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n  if (file.exists(media)) {\n    media <- enc2utf8(media)\n  } else {\n    drive_abort(c(\n      \"No file exists at the local {.arg media} path:\",\n      bulletize(gargle_map_cli(media, \"{.path <<x>>}\"), bullet = \"x\")\n    ))\n  }\n\n  tmp <- rationalize_path_name(path, name)\n  path <- tmp$path\n  name <- tmp$name\n\n  params <- list()\n\n  # load (path, name) into params\n  if (!is.null(path)) {\n    path <- as_parent(path)\n    params[[\"parents\"]] <- path$id\n  }\n  params[[\"name\"]] <- name %||% basename(media)\n\n  hits <- overwrite_hits(\n    parent = params[[\"parents\"]],\n    name = params[[\"name\"]],\n    overwrite = FALSE\n  )\n\n  # Happy Path 1 of 2: no name collision\n  if (is.null(hits) || no_file(hits)) {\n    drive_bullets(c(\n      \"i\" = \"No pre-existing Drive file at this path. Calling \\\\\n             {.fun drive_upload}.\"\n    ))\n\n    return(drive_upload(\n      media = media,\n      path = as_id(params[[\"parents\"]]),\n      name = params[[\"name\"]],\n      type = type,\n      ...\n    ))\n  }\n\n  # Happy Path 2 of 2: single name collision\n  if (single_file(hits)) {\n    drive_bullets(c(\n      \"i\" = \"A Drive file already exists at this path. Calling \\\\\n             {.fun drive_update}.\"\n    ))\n    return(drive_update(\n      hits,\n      media = media,\n      ...\n    ))\n  }\n\n  # Unhappy Path: multiple collisions\n  drive_abort(c(\n    \"Multiple items already exist on Drive at the target filepath.\",\n    \"Unclear what {.fun drive_put} should do. Exiting.\",\n    # drive_reveal_path() puts immediate parent, if specified, in the `path`\n    # then we reveal `path`, instead of `name`\n    bulletize(gargle_map_cli(\n      drive_reveal_path(hits, ancestors = path),\n      template = c(\n        id_string = \"<id:\\u00a0<<id>>>\", # \\u00a0 is a nonbreaking space\n        out = \"{.drivepath <<path>>} {cli::col_grey('<<id_string>>')}\"\n      )\n    ))\n  ))\n}\n"
  },
  {
    "path": "R/drive_read.R",
    "content": "#' Read the content of a Drive file\n#'\n#' @description These functions return the content of a Drive file as either a\n#'   string or raw bytes. You will likely need to do additional work to parse\n#'   the content into a useful R object.\n#'\n#'   [drive_download()] is the more generally useful function, but for certain\n#'   file types, such as comma-separated values (MIME type `text/csv`), it can\n#'   be handy to read data directly from Google Drive and avoid writing to disk.\n#'\n#'   Just as for [drive_download()], native Google file types, such as Google\n#'   Sheets or Docs, must be exported as a conventional MIME type. See the help\n#'   for [drive_download()] for more.\n\n#' @template file-singular\n#' @inheritParams drive_download\n#' @param encoding Passed along to [httr::content()]. Describes the encoding of\n#'   the *input* `file`.\n\n#' @return\n#' * `read_drive_string()`: a UTF-8 encoded string\n#' * `read_drive_raw()`: a [raw()] vector\n\n#' @export\n#' @examplesIf drive_has_token()\n#' # comma-separated values --> data.frame or tibble\n#' (chicken_csv <- drive_example_remote(\"chicken.csv\"))\n#' read.csv(text = chicken_csv |> drive_read_string())\n#'\n#' # Google Doc --> character vector\n#' (chicken_doc <- drive_example_remote(\"chicken_doc\"))\n#' chicken_doc |>\n#'   # NOTE: we must specify an export MIME type\n#'   drive_read_string(type = \"text/plain\") |>\n#'   strsplit(split = \"(\\r\\n|\\r|\\n)\")\n#'   (\\(x) x[[1]])()\ndrive_read_string <- function(file, type = NULL, encoding = NULL) {\n  drive_read_impl(file = file, type = type, as = \"string\", encoding = encoding)\n}\n\n#' @export\n#' @rdname drive_read_string\ndrive_read_raw <- function(file, type = NULL) {\n  drive_read_impl(file = file, type = type, as = \"raw\")\n}\n\ndrive_read_impl <- function(\n  file,\n  type = NULL,\n  as = c(\"string\", \"raw\"),\n  encoding = NULL\n) {\n  as <- match.arg(as)\n  file <- as_dribble(file)\n  file <- confirm_single_file(file)\n\n  mime_type <- pluck(file, \"drive_resource\", 1, \"mimeType\")\n\n  if (!grepl(\"google\", mime_type) && !is.null(type)) {\n    drive_bullets(c(\n      \"!\" = \"Ignoring {.arg type}. Only consulted for native Google file types.\",\n      \" \" = \"MIME type of {.arg file}: {.field {mime_type}}.\"\n    ))\n  }\n\n  if (grepl(\"google\", mime_type)) {\n    export_type <- type %||% get_export_mime_type(mime_type)\n    export_type <- drive_mime_type(export_type)\n    verify_export_mime_type(mime_type, export_type)\n\n    request <- request_generate(\n      endpoint = \"drive.files.export\",\n      params = list(\n        fileId = file$id,\n        mimeType = export_type\n      )\n    )\n  } else {\n    request <- request_generate(\n      endpoint = \"drive.files.get\",\n      params = list(\n        fileId = file$id,\n        alt = \"media\"\n      )\n    )\n  }\n\n  response <- request_make(\n    request,\n    httr::write_memory()\n  )\n\n  # only call gargle::response_process() for a failed request\n  # it's hard-wired to parse a JSON body\n  code <- httr::status_code(response)\n  if (code < 200 || code >= 300) {\n    return(gargle::response_process(response))\n  }\n\n  if (as == \"string\") {\n    resp_body_string(response, encoding = encoding)\n  } else if (as == \"raw\") {\n    resp_body_raw(response)\n  } else {\n    drive_abort(c(\n      \"Internal error: unexpected value for the {.arg as} argument.\",\n      x = \"{.field {as}}\"\n    ))\n  }\n}\n\n# stubs for eventual calls to httr2 functions by these same names\nresp_body_string <- function(resp, encoding = NULL) {\n  out <- httr::content(resp, as = \"text\", encoding = encoding)\n  # Learned this fact the hard way (quoting from Wikipedia):\n  # Google Docs also adds a BOM when converting a Doc to a plain text file\n  # for download.\n  # https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8\n  # Therefore we remove such a BOM, if present\n  # UTF-8 representation of BOM: ef bb bf\n  sub(\"^\\uFEFF\", \"\", out)\n}\n\nresp_body_raw <- function(resp) {\n  httr::content(resp, as = \"raw\")\n}\n"
  },
  {
    "path": "R/drive_rename.R",
    "content": "#' Rename a Drive file\n#'\n#' This is a wrapper for [`drive_mv()`] that only renames a file.\n#' If you would like to rename AND move the file, see [`drive_mv()`].\n#'\n#' @template file-singular\n#' @param name Character. Name you would like the file to have.\n#' @template overwrite\n#' @template verbose\n#'\n#' @eval return_dribble()\n#'\n#' @examplesIf drive_has_token()\n#' # Create a file to rename\n#' file <- drive_create(\"file-to-rename\")\n#'\n#' # Rename it\n#' file <- drive_rename(file, name = \"renamed-file\")\n#'\n#' # `overwrite = FALSE` errors if something already exists at target filepath\n#' # THIS WILL ERROR!\n#' drive_create(\"name-squatter-rename\")\n#' drive_rename(file, name = \"name-squatter-rename\", overwrite = FALSE)\n#'\n#' # `overwrite = TRUE` moves the existing item to trash, then proceeds\n#' file <- drive_rename(file, name = \"name-squatter-rename\", overwrite = TRUE)\n#'\n#' # Clean up\n#' drive_rm(file)\n#' @export\ndrive_rename <- function(\n  file,\n  name = NULL,\n  overwrite = NA,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n  drive_mv(file = file, name = name, overwrite = overwrite)\n}\n"
  },
  {
    "path": "R/drive_reveal.R",
    "content": "#' Add a new column of Drive file information\n#'\n#' @description\n#' `drive_reveal()` adds extra information about your Drive files that is not\n#' readily available in the default [`dribble`] produced by googledrive. Why is\n#' this info not always included in the default `dribble`?\n#' * You don't always care about it. There is a lot of esoteric information in\n#' the `drive_resource` that has little value for most users.\n#' * It might be \"expensive\" to get this information and put it into a usable\n#' form. For example, revealing a file's `\"path\"`, `\"permissions\"`, or\n#' `\"published\"` status all require additional API calls.\n#'\n\n#' `drive_reveal()` can also **hoist** any property out of the `drive_resource`\n#' list-column, when the property's name is passed as the `what` argument. The\n#' resulting new column is simplified if it is easy to do so, e.g., if the\n#' individual elements are all string or logical. If `what` extracts a\n#' date-time, we return [`POSIXct`][DateTimeClasses]. Otherwise, you'll get a\n#' list-column. If this makes you sad, consider using `tidyr::hoist()` instead.\n#' It is more powerful due to a richer \"plucking specification\" and its `ptype`\n#' and `transform` arguments. Another useful function is\n#' `tidyr::unnest_wider()`.\n#'\n#'\n\n#' @section File path:\n#' When `what = \"path\"` the [`dribble`] gains a character column holding each\n#' file's path. This can be *very slow*, so use with caution.\n#'\n#' The example path `~/a/b/` illustrates two conventions used in googledrive:\n\n#'   * The leading `~/` means that the folder `a` is located in the current\n#'   user's \"My Drive\" root folder.\n\n#'   * The trailing `/` means that `b`, located in `a`, is *a folder or a folder\n#'   shortcut*.\n\n#' @section Permissions:\n#' When `what = \"permissions\"` the [`dribble`] gains a logical column `shared`\n#' that indicates whether a file is shared and a new list-column\n#' `permissions_resource` containing lists of\n#' [Permissions resources](https://developers.google.com/drive/api/v3/reference/permissions).\n#'\n#' @section Publishing:\n#' When `what = \"published\"` the [`dribble`] gains a logical column\n#' `published` that indicates whether a file is published and a new list-column\n#' `revision_resource` containing lists of\n#' [Revisions resources](https://developers.google.com/drive/api/v3/reference/revisions).\n#'\n\n#' @section Parent:\n#' When `what = \"parent\"` the [`dribble`] gains a character column `id_parent`\n#' that is the file id of this item's parent folder. This information is\n#' available in the `drive_resource`, but can't just be hoisted out:\n#' * Google Drive used to allow files to have multiple parents, but this is no\n#'   longer supported and googledrive now assumes this is impossible. However,\n#'   we have seen (very old) files that still have >1 parent folder. If we see\n#'   this we message about it and drop all but the first parent.\n#' * The `parents` property in `drive_resource` has an \"extra\" layer of nesting\n#'   and needs to be flattened.\n#'\n\n#' If you really want the raw `parents` property, call `drive_reveal(what =\n#' \"parents\")`.\n\n#' @template file-plural\n\n#' @param what Character, describing the type of info you want to add. These\n#'   values get special handling (more details below):\n#'   * `path`\n#'   * `permissions`\n#'   * `published`\n#'   * `parent`\n#'\n\n#'   You can also request any property in the `drive_resource` column by name.\n#'   The request can be in `camelCase` or `snake_case`, but the new column name\n#'   will always be `snake_case`. Some examples of `what`:\n\n#'   * `mime_type` (or `mimeType`)\n#'   * `trashed`\n#'   * `starred`\n#'   * `description`\n#'   * `version`\n#'   * `web_view_link` (or `webViewLink`)\n#'   * `modified_time` (or `modifiedTime`)\n#'   * `created_time` (or `createdTime`)\n#'   * `owned_by_me` (or `ownedByMe`)\n#'   * `size`\n#'   * `quota_bytes_used` (or `quotaBytesUsed`)\n#'\n#' @eval return_dribble(extras = \"The additional info requested via `what`\n#'   appears in one (or more) extra columns.\")\n#'\n\n#' @seealso To learn more about the properties present in the metadata of a\n#'   Drive file (which is what's in the `drive_resource` list-column of a\n#'   [`dribble`]), see the API docs:\n\n#'   * <https://developers.google.com/drive/api/v3/reference/files#resource-representations>\n#'\n\n#' @export\n#' @examplesIf drive_has_token()\n#' # Get a few of your files\n#' files <- drive_find(n_max = 10, trashed = NA)\n#'\n#' # the \"special\" cases that require additional API calls and can be slow\n#' drive_reveal(files, \"path\")\n#' drive_reveal(files, \"permissions\")\n#' drive_reveal(files, \"published\")\n#'\n#' # a \"special\" case of digging info out of `drive_resource`, then processing\n#' # a bit\n#' drive_reveal(files, \"parent\")\n#'\n#' # the \"simple\" cases of digging info out of `drive_resource`\n#' drive_reveal(files, \"trashed\")\n#' drive_reveal(files, \"mime_type\")\n#' drive_reveal(files, \"starred\")\n#' drive_reveal(files, \"description\")\n#' drive_reveal(files, \"version\")\n#' drive_reveal(files, \"web_view_link\")\n#' drive_reveal(files, \"modified_time\")\n#' drive_reveal(files, \"created_time\")\n#' drive_reveal(files, \"owned_by_me\")\n#' drive_reveal(files, \"size\")\n#' drive_reveal(files, \"quota_bytes_used\")\n#'\n#' # 'root' is a special file id that represents your My Drive root folder\n#' drive_get(id = \"root\") |>\n#'   drive_reveal(\"path\")\ndrive_reveal <- function(\n  file,\n  what = c(\"path\", \"permissions\", \"published\", \"parent\")\n) {\n  stopifnot(is_string(what))\n  file <- as_dribble(file)\n\n  if (what %in% c(\"path\", \"permissions\", \"published\", \"parent\")) {\n    reveal <- switch(\n      what,\n      \"path\" = drive_reveal_canonical_path,\n      \"permissions\" = drive_reveal_permissions,\n      \"published\" = drive_reveal_published,\n      \"parent\" = drive_reveal_parent\n    )\n    return(reveal(file))\n  }\n\n  drive_reveal_this(file, what)\n}\n\ndrive_reveal_this <- function(file, this) {\n  elem_snake_case <- snake_case(this)\n  is_dttm <- grepl(\"_time$\", elem_snake_case)\n\n  if (no_file(file)) {\n    return(\n      put_column(\n        file,\n        nm = elem_snake_case,\n        val = list(),\n        .after = \"name\"\n      )\n    )\n  }\n\n  out <- promote(file, elem_snake_case)\n\n  if (is_dttm && is.character(out[[elem_snake_case]])) {\n    out[[elem_snake_case]] <- as.POSIXct(\n      out[[elem_snake_case]],\n      format = \"%Y-%m-%dT%H:%M:%OSZ\",\n      tz = \"UTC\"\n    )\n  }\n\n  out\n}\n\ndrive_reveal_parent <- function(file) {\n  confirm_dribble(file)\n\n  file <- drive_reveal(file, \"parents\")\n  # due to the historical use of multiple parents, there is a gratuitous level\n  # of nesting here\n  file$parents <- map(file$parents, 1)\n\n  n_parents <- lengths(file$parents)\n  has_multiple_parents <- n_parents > 1\n  if (any(has_multiple_parents)) {\n    drive_bullets(c(\n      \"{sum(has_multiple_parents)} file{?s} {?has/have} >1 parent, which is a \\\\\n       remnant of legacy Drive behaviour:\",\n      bulletize(gargle_map_cli(file[has_multiple_parents, ])),\n      \"!\" = \"Only the first parent will be used\"\n    ))\n  }\n\n  file <- put_column(\n    file,\n    nm = \"id_parent\",\n    val = as_id(map_chr(file$parents, 1, .default = NA)),\n    .after = \"name\"\n  )\n  file$parents <- NULL\n  file\n}\n"
  },
  {
    "path": "R/drive_rm.R",
    "content": "#' Delete files from Drive\n#'\n#' Caution: this will permanently delete your files! For a safer, reversible\n#' option, see [drive_trash()].\n#'\n#' @seealso Wraps the `files.delete` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/files/delete>\n#'\n#' @param ... One or more Drive files, specified in any valid way, i.e. as a\n#' [`dribble`], by name or path, or by file id or URL marked with [as_id()]. Or\n#' any combination thereof. Elements are processed with [as_dribble()] and\n#' row-bound prior to deletion.\n#' @template verbose\n#'\n#' @return Logical vector, indicating whether the delete succeeded.\n#' @export\n#'\n#' @examplesIf drive_has_token()\n#' # Target one of the official example files to copy (then remove)\n#' (src_file <- drive_example_remote(\"chicken.txt\"))\n#'\n#' # Create a copy, then remove it by name\n#' src_file |>\n#'   drive_cp(name = \"chicken-rm.txt\")\n#' drive_rm(\"chicken-rm.txt\")\n#'\n#' # Create several more copies\n#' x1 <- src_file |>\n#'   drive_cp(name = \"chicken-abc.txt\")\n#' drive_cp(src_file, name = \"chicken-def.txt\")\n#' x2 <- src_file |>\n#'   drive_cp(name = \"chicken-ghi.txt\")\n#'\n#' # Remove the copies all at once, specified in different ways\n#' drive_rm(x1, \"chicken-def.txt\", as_id(x2))\ndrive_rm <- function(..., verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  dots <- list(...)\n  if (length(dots) == 0) {\n    dots <- list(NULL)\n  }\n\n  # explicitly select on var name to exclude 'path', if present\n  file <- map(dots, ~ as_dribble(.x)[c(\"name\", \"id\", \"drive_resource\")])\n  file <- vec_rbind(!!!file)\n  # filter to the unique file ids (multiple parents mean drive_get() and\n  # therefore as_dribble() can return >1 row representing a single file)\n  file <- file[!duplicated(file$id), ]\n\n  if (no_file(file)) {\n    drive_bullets(c(\n      \"!\" = \"No such file to delete.\"\n    ))\n    return(invisible(file))\n  }\n\n  out <- map_lgl(file$id, delete_one)\n\n  if (any(out)) {\n    successes <- file[out, ]\n    drive_bullets(c(\n      \"File{?s} deleted:{cli::qty(nrow(successes))}\",\n      bulletize(gargle_map_cli(successes))\n    ))\n  }\n  # I'm not sure this ever comes up IRL?\n  # Is it even possible that removal fails but there's no error?\n  if (any(!out)) {\n    failures <- file[!out, ]\n    drive_bullets(c(\n      \"File{?s} NOT deleted:{cli::qty(nrow(failures))}\",\n      bulletize(gargle_map_cli(failures))\n    ))\n  }\n  invisible(out)\n}\n\ndelete_one <- function(id) {\n  request <- request_generate(\n    endpoint = \"drive.files.delete\",\n    params = list(fileId = id)\n  )\n  response <- request_make(request)\n  gargle::response_process(response)\n}\n"
  },
  {
    "path": "R/drive_share.R",
    "content": "#' Share Drive files\n#'\n#' @description\n#' Grant individuals or other groups access to files, including permission to\n#' read, comment, or edit. The returned [`dribble`] will have extra columns,\n#' `shared` and `permissions_resource`. Read more in [drive_reveal()].\n#'\n#' `drive_share_anyone()` is a convenience wrapper for a common special case:\n#' \"make this `file` readable by 'anyone with a link'\".\n#'\n#' @seealso\n#' Wraps the `permissions.create` endpoint:\n#' * <https://developers.google.com/drive/api/v3/reference/permissions/create>\n#'\n#' Drive roles and permissions are described here:\n#' * <https://developers.google.com/drive/api/v3/ref-roles>\n#'\n#' @template file-plural\n#' @param role Character. The role to grant. Must be one of:\n#'   * owner (not allowed in shared drives)\n#'   * organizer (applies to shared drives)\n#'   * fileOrganizer (applies to shared drives)\n#'   * writer\n#'   * commenter\n#'   * reader\n#' @param type Character. Describes the grantee. Must be one of:\n#'   * user\n#'   * group\n#'   * domain\n#'   * anyone\n#' @param ... Name-value pairs to add to the API request. This is where you\n#'   provide additional information, such as the `emailAddress` (when grantee\n#'   `type` is `\"group\"` or `\"user\"`) or the `domain` (when grantee type is\n#'   `\"domain\"`). Read the API docs linked below for more details.\n#' @template verbose\n#'\n#' @eval return_dribble(extras = \"There will be extra columns, `shared` and\n#'   `permissions_resource`.\")\n#' @export\n#' @examplesIf drive_has_token()\n#' # Create a file to share\n#' file <- drive_example_remote(\"chicken_doc\") |>\n#'   drive_cp(name = \"chicken-share.txt\")\n#'\n#' # Let a specific person comment\n#' file <- file |>\n#'   drive_share(\n#'     role = \"commenter\",\n#'     type = \"user\",\n#'     emailAddress = \"susan@example.com\"\n#'   )\n#'\n#' # Let a different specific person edit and customize the email notification\n#' file <- file |>\n#'   drive_share(\n#'     role = \"writer\",\n#'     type = \"user\",\n#'     emailAddress = \"carol@example.com\",\n#'     emailMessage = \"Would appreciate your feedback on this!\"\n#'   )\n#'\n#' # Let anyone read the file\n#' file <- file |>\n#'   drive_share(role = \"reader\", type = \"anyone\")\n#' # Single-purpose wrapper function for this\n#' drive_share_anyone(file)\n#'\n#' # Clean up\n#' drive_rm(file)\ndrive_share <- function(\n  file,\n  role = c(\n    \"reader\",\n    \"commenter\",\n    \"writer\",\n    \"fileOrganizer\",\n    \"owner\",\n    \"organizer\"\n  ),\n  type = c(\"user\", \"group\", \"domain\", \"anyone\"),\n  ...,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n\n  role <- match.arg(role)\n  type <- match.arg(type)\n  file <- as_dribble(file)\n  file <- confirm_some_files(file)\n\n  params <- toCamel(list2(...))\n  params[[\"role\"]] <- role\n  params[[\"type\"]] <- type\n  params[[\"fields\"]] <- \"*\"\n  ## this resource pertains only to the affected permission\n  permission_out <- map(\n    file$id,\n    drive_share_one,\n    params = params\n  )\n\n  ok <- map_chr(permission_out, \"type\") == type\n  if (any(ok)) {\n    successes <- file[ok, ]\n    drive_bullets(c(\n      \"Permissions updated:\",\n      \"*\" = \"role = {role}\",\n      \"*\" = \"type = {type}\",\n      \"For file{?s}:{cli::qty(nrow(successes))}\",\n      bulletize(gargle_map_cli(successes))\n    ))\n  }\n  # I'm not sure this ever comes up IRL?\n  # Is it even possible that permission update fails but there's no error?\n  if (any(!ok)) {\n    failures <- file[!ok, ]\n    drive_bullets(c(\n      \"Permissions were NOT updated for file{?s}:{cli::qty(nrow(failures))}\",\n      bulletize(gargle_map_cli(failures))\n    ))\n  }\n\n  ## refresh drive_resource, get full permissions_resource\n  out <- drive_get(as_id(file))\n  invisible(drive_reveal(out, \"permissions\"))\n}\n\n#' @rdname drive_share\n#' @export\ndrive_share_anyone <- function(file, verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  drive_share(file = file, role = \"reader\", type = \"anyone\")\n}\n\ndrive_share_one <- function(id, params) {\n  params[[\"fileId\"]] <- id\n  request <- request_generate(\n    endpoint = \"drive.permissions.create\",\n    params = params\n  )\n  response <- request_make(request)\n  gargle::response_process(response)\n}\n\ndrive_reveal_permissions <- function(file) {\n  confirm_dribble(file)\n  permissions_resource <- map(file$id, list_permissions_one)\n  # TODO: revisit this in light of Team Drives --> shared drives\n  ## can't use promote() here (yet) because Team Drive files don't have\n  ## `shared` and their NULLs would force `shared` to be a list-column\n  file <- put_column(\n    file,\n    nm = \"shared\",\n    val = map_lgl(file$drive_resource, \"shared\", .default = NA),\n    .after = \"name\"\n  )\n  put_column(\n    file,\n    nm = \"permissions_resource\",\n    val = permissions_resource\n  )\n}\n\nlist_permissions_one <- function(id) {\n  request <- request_generate(\n    endpoint = \"drive.permissions.list\",\n    params = list(\n      fileId = id,\n      fields = \"*\"\n    )\n  )\n  # TODO: is this still a problem for shared drives? probably\n  # TO DO: we aren't dealing with the fact that this endpoint is paginated\n  # for Team Drives\n  response <- request_make(request)\n  # if capabilities/canReadRevisions (present in File resource) is not true,\n  # user will get a 403 \"insufficientFilePermissions\" here\n  if (httr::status_code(response) == 403) {\n    return(NULL)\n  }\n  gargle::response_process(response)\n}\n"
  },
  {
    "path": "R/drive_trash.R",
    "content": "#' Move Drive files to or from trash\n#' @template file-plural\n#' @template verbose\n#'\n#' @eval return_dribble()\n#' @export\n#' @examplesIf drive_has_token()\n#' # Create a file and put it in the trash.\n#' file <- drive_example_remote(\"chicken.txt\") |>\n#'   drive_cp(\"chicken-trash.txt\")\n#' drive_trash(\"chicken-trash.txt\")\n#'\n#' # Confirm it's in the trash\n#' drive_find(trashed = TRUE)\n#'\n#' # Remove it from the trash and confirm\n#' drive_untrash(\"chicken-trash.txt\")\n#' drive_find(trashed = TRUE)\n#'\n#' # Clean up\n#' drive_rm(\"chicken-trash.txt\")\ndrive_trash <- function(file, verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  invisible(drive_toggle_trash(file, trash = TRUE))\n}\n\n#' @rdname drive_trash\n#' @export\ndrive_untrash <- function(file, verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  if (is_path(file)) {\n    trash <- drive_find(trashed = TRUE)\n    file <- trash[trash$name %in% file, ]\n  }\n  invisible(drive_toggle_trash(file, trash = FALSE))\n}\n\ndrive_toggle_trash <- function(file, trash) {\n  VERB <- if (trash) \"trash\" else \"untrash\"\n  VERBED <- paste0(VERB, \"ed\")\n\n  file <- as_dribble(file)\n  if (no_file(file)) {\n    drive_bullets(c(\"!\" = \"No such files found to {VERB}.\"))\n    return(invisible(dribble()))\n  }\n\n  out <- map(file$id, toggle_trash_one, trash = trash)\n  out <- vec_rbind(!!!out)\n\n  drive_bullets(c(\n    \"{cli::qty(nrow(out))}File{?s} {VERBED}:\",\n    bulletize(gargle_map_cli(out))\n  ))\n\n  invisible(out)\n}\n\ntoggle_trash_one <- function(id, trash = TRUE) {\n  request <- request_generate(\n    endpoint = \"drive.files.update\",\n    params = list(\n      fileId = id,\n      trashed = trash,\n      fields = \"*\"\n    )\n  )\n  response <- request_make(request)\n  proc_res <- gargle::response_process(response)\n  as_dribble(list(proc_res))\n}\n\n#' Empty Drive Trash\n#'\n#' @description Caution, this will permanently delete files in your Drive trash.\n#'\n#' @template verbose\n#' @export\ndrive_empty_trash <- function(verbose = deprecated()) {\n  warn_for_verbose(verbose)\n\n  files <- drive_find(trashed = TRUE)\n  if (no_file(files)) {\n    drive_bullets(c(\n      \"i\" = \"No files found in trash; your trash was already empty.\"\n    ))\n    return(invisible(TRUE))\n  }\n  request <- request_generate(endpoint = \"drive.files.emptyTrash\")\n  response <- request_make(request)\n  success <- gargle::response_process(response)\n  if (success) {\n    drive_bullets(c(\n      \"v\" = \"{nrow(files)} file{?s} deleted from your Google Drive trash.\"\n    ))\n  } else {\n    drive_bullets(c(\n      \"x\" = \"Empty trash appears to have failed.\"\n    ))\n  }\n  invisible(success)\n}\n"
  },
  {
    "path": "R/drive_update.R",
    "content": "#' Update an existing Drive file\n#'\n#' Update an existing Drive file id with new content (\"media\" in Drive\n#' API-speak), new metadata, or both.  To create a new file or update existing,\n#' depending on whether the Drive file already exists, see [drive_put()].\n#'\n#' @seealso Wraps the `files.update` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/files/update>\n#'\n#' This function supports media upload:\n#'   * <https://developers.google.com/drive/api/v3/manage-uploads>\n#'\n#' @template file-singular\n#' @template media\n#' @template dots-metadata\n#' @template verbose\n#'\n#' @eval return_dribble()\n#' @export\n#'\n#' @examplesIf drive_has_token()\n#' # Create a new file, so we can update it\n#' x <- drive_example_remote(\"chicken.csv\") |>\n#'   drive_cp()\n#'\n#' # Update the file with new media\n#' x <- x |>\n#'   drive_update(drive_example_local(\"chicken.txt\"))\n#'\n#' # Update the file with new metadata.\n#' # Notice here `name` is not an argument of `drive_update()`, we are passing\n#' # this to the API via the `...``\n#' x <- x |>\n#'   drive_update(name = \"CHICKENS!\")\n#'\n#' # Update the file with new media AND new metadata\n#' x <- x |>\n#'   drive_update(\n#'     drive_example_local(\"chicken.txt\"),\n#'     name = \"chicken-poem-again.txt\"\n#'   )\n#'\n#' # Clean up\n#' drive_rm(x)\ndrive_update <- function(file, media = NULL, ..., verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  if ((!is.null(media)) && (!file.exists(media))) {\n    drive_abort(c(\n      \"No file exists at the local {.arg media} path:\",\n      bulletize(gargle_map_cli(media, \"{.path <<x>>}\"), bullet = \"x\")\n    ))\n  }\n\n  file <- as_dribble(file)\n  file <- confirm_single_file(file)\n\n  meta <- toCamel(list2(...))\n\n  if (is.null(media) && length(meta) == 0) {\n    drive_bullets(c(\n      \"!\" = \"No updates specified.\"\n    ))\n    return(invisible(file))\n  }\n\n  meta[[\"fields\"]] <- meta[[\"fields\"]] %||% \"*\"\n\n  if (is.null(media)) {\n    out <- drive_update_metadata(file, meta)\n  } else {\n    if (length(meta) == 0) {\n      out <- drive_update_media(file, media)\n    } else {\n      media <- enc2utf8(media)\n      out <- drive_update_multipart(file, media, meta)\n    }\n  }\n\n  drive_bullets(c(\"File updated:\", bulletize(gargle_map_cli(out))))\n\n  invisible(out)\n}\n\n## currently this can never be called, because we always send fields\ndrive_update_media <- function(file, media) {\n  request <- request_generate(\n    endpoint = \"drive.files.update.media\",\n    params = list(\n      fileId = file$id,\n      uploadType = \"media\",\n      fields = \"*\"\n    )\n  )\n\n  ## media uploads have unique body situations, so customizing here.\n  request$body <- httr::upload_file(path = media)\n  response <- request_make(request)\n  as_dribble(list(gargle::response_process(response)))\n}\n\ndrive_update_metadata <- function(file, meta) {\n  params <- meta %||% list()\n  params$fileId <- file$id\n  request <- request_generate(\n    endpoint = \"drive.files.update\",\n    params = params\n  )\n  response <- request_make(request)\n  as_dribble(list(gargle::response_process(response)))\n}\n\ndrive_update_multipart <- function(file, media, meta) {\n  # We include the metadata here even though it's overwritten below,\n  # so that request_generate() still validates it.\n  params <- meta %||% list()\n  params$fileId <- file$id\n  params$uploadType <- \"multipart\"\n  request <- request_generate(\n    endpoint = \"drive.files.update.media\",\n    params = params\n  )\n  meta_file <- withr::local_file(\n    tempfile(\"drive-update-meta\", fileext = \".json\")\n  )\n  write_utf8(jsonlite::toJSON(meta), meta_file)\n  ## media uploads have unique body situations, so customizing here.\n  request$body <- list(\n    metadata = httr::upload_file(\n      path = meta_file,\n      type = \"application/json; charset=UTF-8\"\n    ),\n    media = httr::upload_file(path = media)\n  )\n  response <- request_make(request, encode = \"multipart\")\n  as_dribble(list(gargle::response_process(response)))\n}\n"
  },
  {
    "path": "R/drive_upload.R",
    "content": "#' Upload into a new Drive file\n#'\n#' Uploads a local file into a new Drive file. To update the content or metadata\n#' of an existing Drive file, use [drive_update()]. To upload or update,\n#' depending on whether the Drive file already exists, see [drive_put()].\n#'\n#' @seealso Wraps the `files.create` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/files/create>\n#'\n#' MIME types that can be converted to native Google formats:\n#'    * <https://developers.google.com/drive/api/v3/manage-uploads#import_to_google_docs_types>\n#'\n#' @template media\n#' @eval param_path(\n#'   thing = \"new file\",\n#'   default_notes = \"By default, the file is created in the current\n#'     user's \\\"My Drive\\\" root folder.\"\n#' )\n#' @eval param_name(\n#'   thing = \"file\",\n#'   default_notes = \"Defaults to the file's local name.\"\n#' )\n#' @param type Character. If `type = NULL`, a MIME type is automatically\n#'   determined from the file extension, if possible. If the source file is of a\n#'   suitable type, you can request conversion to Google Doc, Sheet or Slides by\n#'   setting `type` to `document`, `spreadsheet`, or `presentation`,\n#'   respectively. All non-`NULL` values for `type` are pre-processed with\n#'   [drive_mime_type()].\n#' @template dots-metadata\n#' @template overwrite\n#' @template verbose\n#'\n#' @eval return_dribble()\n#' @export\n#' @examplesIf drive_has_token()\n#' # upload a csv file\n#' chicken_csv <- drive_example_local(\"chicken.csv\") |>\n#'   drive_upload(\"chicken-upload.csv\")\n#'\n#' # or convert it to a Google Sheet\n#' chicken_sheet <- drive_example_local(\"chicken.csv\") |>\n#'   drive_upload(\n#'     name = \"chicken-sheet-upload.csv\",\n#'     type = \"spreadsheet\"\n#'   )\n#'\n#' # check out the new Sheet!\n#' drive_browse(chicken_sheet)\n#'\n#' # Clean up\n#' drive_find(\"chicken.*upload\") |> drive_rm()\n#'\n#' # Upload a file and, at the same time, star it\n#' chicken <- drive_example_local(\"chicken.jpg\") |>\n#'   drive_upload(starred = \"true\")\n#'\n#' # Is is really starred? YES\n#' purrr::pluck(chicken, \"drive_resource\", 1, \"starred\")\n#'\n#' # Clean up\n#' drive_rm(chicken)\n#'\n#' # `overwrite = FALSE` errors if something already exists at target filepath\n#' # THIS WILL ERROR!\n#' drive_create(\"name-squatter-upload\")\n#' drive_example_local(\"chicken.jpg\") |>\n#'   drive_upload(\n#'     name = \"name-squatter-upload\",\n#'     overwrite = FALSE\n#'   )\n#'\n#' # `overwrite = TRUE` moves the existing item to trash, then proceeds\n#' chicken <- drive_example_local(\"chicken.jpg\") |>\n#'   drive_upload(\n#'     name = \"name-squatter-upload\",\n#'     overwrite = TRUE\n#'   )\n#'\n#' # Clean up\n#' drive_rm(chicken)\n#'\n#' \\dontrun{\n#' # Upload to a shared drive:\n#' #   * Shared drives are only available if your account is associated with a\n#' #     Google Workspace\n#' #   * The shared drive (or shared-drive-hosted folder) MUST be captured as a\n#' #     dribble first and provided via `path`\n#' sd <- shared_drive_get(\"Marketing\")\n#' drive_upload(\"fascinating.csv\", path = sd)\n#' }\ndrive_upload <- function(\n  media,\n  path = NULL,\n  name = NULL,\n  type = NULL,\n  ...,\n  overwrite = NA,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n  if (file.exists(media)) {\n    media <- enc2utf8(media)\n  } else {\n    drive_abort(c(\n      \"No file exists at the local {.arg media} path:\",\n      bulletize(gargle_map_cli(media, \"{.path <<x>>}\"), bullet = \"x\")\n    ))\n  }\n\n  tmp <- rationalize_path_name(path, name)\n  path <- tmp$path\n  name <- tmp$name\n\n  params <- toCamel(list2(...))\n\n  # load (path, name) into params\n  if (!is.null(path)) {\n    path <- as_parent(path)\n    params[[\"parents\"]] <- I(path$id)\n  }\n  params[[\"name\"]] <- name %||% basename(media)\n\n  check_for_overwrite(params[[\"parents\"]], params[[\"name\"]], overwrite)\n\n  params[[\"fields\"]] <- params[[\"fields\"]] %||% \"*\"\n  params[[\"mimeType\"]] <- drive_mime_type(type)\n  params[[\"uploadType\"]] <- \"multipart\"\n\n  request <- request_generate(\n    endpoint = \"drive.files.create.media\",\n    params = params\n  )\n\n  meta_file <- withr::local_file(\n    tempfile(\"drive-upload-meta\", fileext = \".json\")\n  )\n  write_utf8(jsonlite::toJSON(params, auto_unbox = TRUE), meta_file)\n  ## media uploads have unique body situations, so customizing here.\n  request$body <- list(\n    metadata = httr::upload_file(\n      path = meta_file,\n      type = \"application/json; charset=UTF-8\"\n    ),\n    media = httr::upload_file(path = media)\n  )\n\n  response <- request_make(request, encode = \"multipart\")\n  out <- as_dribble(list(gargle::response_process(response)))\n\n  drive_bullets(c(\n    \"Local file:\",\n    \"*\" = \"{.path {media}}\",\n    \"Uploaded into Drive file:\",\n    bulletize(gargle_map_cli(out)),\n    \"With MIME type:\",\n    \"*\" = \"{.field {pluck(out, 'drive_resource', 1, 'mimeType')}}\"\n  ))\n  invisible(out)\n}\n"
  },
  {
    "path": "R/drive_user.R",
    "content": "#' Get info on current user\n#'\n#' Reveals information about the user associated with the current token. This is\n#' a thin wrapper around [drive_about()] that just extracts the most useful\n#' information (the information on current user) and prints it nicely.\n#'\n#' @seealso Wraps the `about.get` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/about/get>\n#'\n#' @template verbose\n#'\n#' @return A list of class `drive_user`.\n#' @export\n#' @examplesIf drive_has_token()\n#' drive_user()\n#'\n#' # more info is returned than is printed\n#' user <- drive_user()\n#' str(user)\ndrive_user <- function(verbose = deprecated()) {\n  warn_for_verbose(verbose)\n\n  if (!drive_has_token()) {\n    drive_bullets(c(\n      \"i\" = \"Not logged in as any specific Google user.\"\n    ))\n    return(invisible())\n  }\n  about <- drive_about()\n  structure(about[[\"user\"]], class = c(\"drive_user\", \"list\"))\n}\n\n#' @export\nformat.drive_user <- function(x, ...) {\n  cli::cli_format_method(\n    drive_bullets(c(\n      \"Logged in as:\",\n      \"*\" = \"displayName: {.field {x[['displayName']]}}\",\n      \"*\" = \"emailAddress: {.email {x[['emailAddress']]}}\"\n    ))\n  )\n}\n\n#' @export\nprint.drive_user <- function(x, ...) {\n  cli::cat_line(format(x, ...))\n  invisible(x)\n}\n"
  },
  {
    "path": "R/googledrive-package.R",
    "content": "#' @description googledrive allows you to interact with files on Google Drive\n#'   from R.\n#'\n#'   `googledrive::drive_find(n_max = 50)` lists up to 50 of the files you see\n#'   in [My Drive](https://drive.google.com). You can expect to be sent to your\n#'   browser here, to authenticate yourself and authorize the googledrive\n#'   package to deal on your behalf with Google Drive.\n#'\n#'   Most functions begin with the prefix `drive_`.\n#'\n#'   The goal is to allow Drive access that feels similar to Unix file system\n#'   utilities, e.g., `find`, `ls`, `mv`, `cp`, `mkdir`, and `rm`.\n#'\n#'   The metadata for one or more Drive files is held in a [`dribble`], a \"Drive\n#'   tibble\". This is a data frame with one row per file. A dribble is returned\n#'   (and accepted) by almost every function in googledrive. It is designed to\n#'   give people what they want (file name), track what the API wants (file id),\n#'   and to hold the metadata needed for general file operations.\n#'\n#'   googledrive is \"pipe-friendly\" (either the base `|>` or magrittr `%>%`\n#'   pipe), but does not require its use.\n#'\n#'   Please see the googledrive website for full documentation:\n\n#'   * <https://googledrive.tidyverse.org/index.html>\n\n#'\n#' In addition to function-specific help, there are several articles which are\n#' indexed here:\n\n#' * [Article index](https://googledrive.tidyverse.org/articles/index.html)\n\n#'\n#' @keywords internal\n#' @import rlang\n#' @import vctrs\n\"_PACKAGE\"\n\n## usethis namespace: start\n#' @importFrom gargle bulletize\n#' @importFrom gargle gargle_map_cli\n#' @importFrom glue glue\n#' @importFrom glue glue_collapse\n#' @importFrom glue glue_data\n#' @importFrom lifecycle deprecated\n#' @importFrom pillar pillar_shaft\n#' @importFrom purrr map\n#' @importFrom purrr map_chr\n#' @importFrom purrr map_if\n#' @importFrom purrr map_int\n#' @importFrom purrr map_lgl\n#' @importFrom purrr map2\n#' @importFrom purrr pluck\n#' @importFrom tibble as_tibble\n#' @importFrom tibble tbl_sum\n#' @importFrom tibble tibble\n## usethis namespace: end\nNULL\n\n#' googledrive configuration\n#'\n#' @description\n#' Some aspects of googledrive behaviour can be controlled via an option.\n#'\n#' @section Auth:\n#'\n#' Read about googledrive's main auth function, [drive_auth()]. It is powered\n#' by the gargle package, which consults several options:\n#' * Default Google user or, more precisely, `email`: see\n#'   [gargle::gargle_oauth_email()]\n#' * Whether or where to cache OAuth tokens: see\n#'   [gargle::gargle_oauth_cache()]\n#' * Whether to prefer \"out-of-band\" auth: see\n#'   [gargle::gargle_oob_default()]\n#' * Application Default Credentials: see [gargle::credentials_app_default()]\n#'\n#' @name googledrive-configuration\nNULL\n"
  },
  {
    "path": "R/promote.R",
    "content": "# promote an element in drive_resource into a top-level column\n#\n# if you request `this_var` or `thisVar`, we look for `thisVar` in\n# drive_resource, but use the original input as the variable name\n#\n# if a column by that name already exists, it is overwritten in place\n# otherwise, the new column will be the second column, presumably after `name`\n#\n# morally, this is a lot like tidyr::hoist(), but with a more specific mandate\npromote <- function(d, elem) {\n  elemCamelCase <- camelCase(elem)\n\n  x <- map(d$drive_resource, elemCamelCase)\n  absent <- all(map_lgl(x, is_null))\n\n  if (absent) {\n    # TO DO: do we really want promote() to be this forgiving?\n    # adds a placeholder column for elem if not present in drive_resource\n    # ensure elem is added, even if there are zero rows\n    val <- rep_len(list(NULL), nrow(d))\n  } else {\n    val <- simplify_col(x)\n  }\n\n  put_column(d, nm = elem, val = val, .after = 1)\n}\n\n# simplified version of tidyr:::simplify_col()\nsimplify_col <- function(x) {\n  is_list <- map_lgl(x, is_list)\n  is_vec <- map_lgl(x, ~ vec_is(.x) || is_null(.x))\n  is_not_vec <- !is_vec\n  if (any(is_list | is_not_vec)) {\n    return(x)\n  }\n\n  n <- map_int(x, vec_size)\n  is_scalar <- n %in% c(0, 1)\n  if (any(!is_scalar)) {\n    return(x)\n  }\n\n  x[n == 0] <- list(NA)\n\n  tryCatch(\n    vec_c(!!!x),\n    vctrs_error_incompatible_type = function(e) x\n  )\n}\n"
  },
  {
    "path": "R/request_generate.R",
    "content": "#' Build a request for the Google Drive API\n#'\n#' @description Build a request, using knowledge of the [Drive v3\n#'   API](https://developers.google.com/drive/api/v3/about-sdk) from its\n#'   Discovery Document\n#'   (`https://www.googleapis.com/discovery/v1/apis/drive/v3/rest`). Most users\n#'   should, instead, use higher-level wrappers that facilitate common tasks,\n#'   such as uploading or downloading Drive files. The functions here are\n#'   intended for internal use and for programming around the Drive API.\n#'\n#' @description `request_generate()` lets you provide the bare minimum of input.\n#'   It takes a nickname for an endpoint and:\n#'   * Uses the API spec to look up the `path`, `method`, and base URL.\n#'   * Checks `params` for validity and completeness with respect to the\n#'   endpoint. Separates parameters into those destined for the body, the query,\n#'   and URL endpoint substitution (which is also enacted).\n#'   * Adds an API key to the query if and only if `token = NULL`.\n#'   * Adds `supportsAllDrives = TRUE` to the query if the endpoint requires.\n#'\n#' @param endpoint Character. Nickname for one of the selected Drive v3 API\n#'   endpoints built into googledrive. Learn more in [drive_endpoints()].\n#' @param params Named list. Parameters destined for endpoint URL substitution,\n#'   the query, or the body.\n#' @param key API key. Needed for requests that don't contain a token. The need\n#'   for an API key in the absence of a token is explained in Google's document\n#'   \"Credentials, access, security, and identity\"\n#'   (`https://support.google.com/googleapi/answer/6158857?hl=en&ref_topic=7013279`).\n#'   In order of precedence, these sources are consulted: the formal `key`\n#'   argument, a `key` parameter in `params`, a user-configured API key fetched\n#'   via [drive_api_key()], a built-in key shipped with googledrive. See\n#'   [drive_auth_configure()] for details on a user-configured key.\n#' @param token Drive token. Set to `NULL` to suppress the inclusion of a token.\n#'   Note that, if auth has been de-activated via [drive_deauth()],\n#'   `drive_token()` will actually return `NULL`.\n#'\n#' @return `list()`\\cr Components are `method`, `path`, `query`, `body`,\n#'   `token`, and `url`, suitable as input for [request_make()].\n#' @export\n#' @family low-level API functions\n#' @seealso [gargle::request_develop()], [gargle::request_build()]\n#' @examplesIf drive_has_token()\n#' req <- request_generate(\n#'   \"drive.files.get\",\n#'   list(fileId = \"abc\"),\n#'   token = drive_token()\n#' )\n#' req\nrequest_generate <- function(\n  endpoint = character(),\n  params = list(),\n  key = NULL,\n  token = drive_token()\n) {\n  ept <- drive_endpoint(endpoint)\n  if (is.null(ept)) {\n    drive_abort(c(\n      \"Endpoint not recognized:\",\n      bulletize(gargle_map_cli(endpoint))\n    ))\n  }\n\n  ## modifications specific to googledrive package\n  params$key <- key %||%\n    params$key %||%\n    drive_api_key() %||%\n    gargle::tidyverse_api_key()\n  if (!is.null(ept$parameters$supportsAllDrives)) {\n    params$supportsAllDrives <- TRUE\n  }\n\n  req <- gargle::request_develop(endpoint = ept, params = params)\n  gargle::request_build(\n    path = req$path,\n    method = req$method,\n    params = req$params,\n    body = req$body,\n    token = token\n  )\n}\n"
  },
  {
    "path": "R/request_make.R",
    "content": "#' Make a request for the Google Drive v3 API\n#'\n#' Low-level functions to execute one or more Drive API requests and, perhaps,\n#' process the response(s). Most users should, instead, use higher-level\n#' wrappers that facilitate common tasks, such as uploading or downloading Drive\n#' files. The functions here are intended for internal use and for programming\n#' around the Drive API. Three functions are documented here:\n#'   * `request_make()` does the bare minimum: calls [gargle::request_retry()],\n#'     only adding the googledrive user agent. Typically the input is created\n#'     with [request_generate()] and the output is processed with\n#'     [gargle::response_process()].\n#'   * `do_request()` is simply\n#'     `gargle::response_process(request_make(x, ...))`. It exists only because\n#'     we had to make `do_paginated_request()` and it felt weird to not make the\n#'     equivalent for a single request.\n#'   * `do_paginated_request()` executes the input request **with page\n#'     traversal**. It is impossible to separate paginated requests into a \"make\n#'     request\" step and a \"process request\" step, because the token for the\n#'     next page must be extracted from the content of the current page.\n#'     Therefore this function does both and returns a list of processed\n#'     responses, one per page.\n#'\n#' @param x List, holding the components for an HTTP request, presumably created\n#'   with [request_generate()] Should contain the `method`, `url`, `body`,\n#'   and `token`.\n#' @param ... Optional arguments passed through to the HTTP method.\n#' @template verbose\n#'\n#' @return `request_make()`: Object of class `response` from [httr].\n#' @export\n#' @family low-level API functions\nrequest_make <- function(x, ...) {\n  gargle::request_retry(x, ..., user_agent = drive_ua())\n}\n\n#' @rdname request_make\n#' @export\n#' @return `do_request()`: List representing the content returned by a single\n#'   request.\ndo_request <- function(x, ...) {\n  gargle::response_process(request_make(x, ...))\n}\n\n#' @rdname request_make\n#' @param n_max Maximum number of items to return. Defaults to `Inf`, i.e. there\n#'   is no limit and we keep making requests until we get all items.\n#' @param n Function that computes the number of items in one response or page.\n#'   The default function always returns `1` and therefore treats each page as\n#'   an item. If you know more about the structure of the response, you can\n#'   pass another function to count and threshhold, for example, the number of\n#'   files or comments.\n#' @export\n#' @return `do_paginated_request()`: List of lists, representing the returned\n#'   content, one component per page.\n#' @examples\n#' \\dontrun{\n#' # build a request for an endpoint that is:\n#' #   * paginated\n#' #   * NOT privileged in googledrive, i.e. not covered by request_generate()\n#' # \"comments\" are a great example\n#' # https://developers.google.com/drive/v3/reference/comments\n#' #\n#' # Practice with a target file with > 2 comments\n#' # Note that we request 2 items (comments) per page\n#' req <- gargle::request_build(\n#'   path = \"drive/v3/files/{fileId}/comments\",\n#'   method = \"GET\",\n#'   params = list(\n#'     fileId = \"your-file-id-goes-here\",\n#'     fields = \"*\",\n#'     pageSize = 2\n#'   ),\n#'   token = googledrive::drive_token()\n#' )\n#' # make the paginated request, but cap it at 1 page\n#' # should get back exactly two comments\n#' do_paginated_request(req, n_max = 1)\n#' }\ndo_paginated_request <- function(\n  x,\n  ...,\n  n_max = Inf,\n  n = function(res) 1,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n\n  ## when traversing pages, you can't cleanly separate the task into\n  ## request_make() and gargle::response_process(), because you need to process\n  ## response / page i to get the pageToken for request / page i + 1\n  ## so this function does both\n  stopifnot(identical(x$method, \"GET\"))\n\n  ## if fields does not exist yet, you will need something to prepend\n  ## \"nextPageToken\" to ... \"all fields\" seems like best (only?) default choice\n  x$query$fields <- x$query$fields %||% \"*\"\n  if (!grepl(\"nextPageToken\", x$query$fields)) {\n    x$query$fields <- glue(\"nextPageToken,{x$query$fields}\")\n  }\n\n  responses <- list()\n  i <- 1\n  total <- 0\n  # TODO: do I have anything to say here at the beginning?\n  # what's a non-jargon-y and general way to say:\n  # \"we're hitting a paginated endpoint and we're working with pageSize n\"\n  st <- show_status()\n  if (st) {\n    sb <- cli::cli_status(msg = character())\n  }\n  repeat {\n    page <- request_make(x, ...)\n    responses[[i]] <- gargle::response_process(page)\n    x$query$pageToken <- responses[[i]]$nextPageToken\n    x$url <- httr::modify_url(x$url, query = x$query)\n    # TODO: presumably this might need some generalization when this moves\n    # to gargle (how we determine how much 'stuff' we've seen and how we\n    # talk about it in the status bar)\n    # TODO: need to do something re: non-interactive work, e.g. Rmd\n    total <- total + n(responses[[i]])\n    if (is.null(x$query$pageToken) || total >= n_max) {\n      break\n    }\n    if (st) {\n      cli::cli_status_update(\n        id = sb,\n        \"{cli::symbol$arrow_right} Files retrieved so far: {total}\"\n      )\n    }\n    i <- i + 1\n  }\n\n  responses\n}\n\nshow_status <- function() {\n  is_interactive() && is_false(getOption(\"googledrive_quiet\", FALSE))\n}\n\ndrive_ua <- function() {\n  httr::user_agent(paste0(\n    \"googledrive/\",\n    utils::packageVersion(\"googledrive\"),\n    \" \",\n    \"(GPN:RStudio; )\",\n    \" \",\n    \"gargle/\",\n    utils::packageVersion(\"gargle\"),\n    \" \",\n    \"httr/\",\n    utils::packageVersion(\"httr\")\n  ))\n}\n"
  },
  {
    "path": "R/roxygen-templates.R",
    "content": "# nocov start\n\nparam_path <- function(thing = \"THING\", default_notes = \"\") {\n  glue(\n    \"\n    @param path Specifies target destination for the {thing} on Google\n      Drive. Can be an actual path (character), a file id marked with\n      [as_id()], or a [`dribble`].\n\n      If `path` is a shortcut to a folder, it is automatically resolved to its\n      target folder.\n\n      If `path` is given as a path (as opposed to a `dribble` or an id), it is\n      best to explicitly indicate if it's a folder by including a trailing\n      slash, since it cannot always be worked out from the context of the call.\n      {default_notes}\"\n  )\n}\n\nparam_path_known_parent <- function(thing = \"item\") {\n  glue(\n    \"\n    @param path Target destination for the new {thing}, i.e. a folder or a\n     shared drive. Can be given as an actual path (character), a file id or URL\n     marked with [as_id()], or a [`dribble`]. Defaults to your \\\"My Drive\\\" root\n     folder. If `path` is a shortcut to a folder, it is automatically resolved\n     to its target folder.\"\n  )\n}\n\nparam_name <- function(thing = \"THING\", default_notes = \"\") {\n  glue(\n    \"\n    @param name Character, new {thing} name if not specified as part of\n      `path`. This will force `path` to be interpreted as a folder, even if it\n      is character and lacks a trailing slash. {default_notes}\"\n  )\n}\n\nreturn_dribble <- function(item = \"file\", extras = \"\") {\n  glue(\n    \"\n    @return An object of class [`dribble`], a tibble with one row per {item}.\n    {extras}\"\n  )\n}\n\n# nocov end\n"
  },
  {
    "path": "R/shared_drive_create.R",
    "content": "#' Create a new shared drive\n#'\n#' @template shared-drive-description\n#'\n#' @seealso Wraps the `drives.create` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/drives/create>\n#'\n#' @param name Character. Name of the new shared drive. Must be non-empty and not\n#'   entirely whitespace.\n#'\n#' @eval return_dribble(\"shared drive\")\n#' @export\n#' @examples\n#' \\dontrun{\n#' shared_drive_create(\"my-awesome-shared-drive\")\n#'\n#' # Clean up\n#' shared_drive_rm(\"my-awesome-shared-drive\")\n#' }\nshared_drive_create <- function(name) {\n  stopifnot(is_string(name), isTRUE(nzchar(name)))\n  request <- request_generate(\n    \"drive.drives.create\",\n    params = list(\n      requestId = uuid::UUIDgenerate(),\n      name = name,\n      fields = \"*\"\n    )\n  )\n  response <- request_make(request)\n  out <- as_dribble(list(gargle::response_process(response)))\n\n  drive_bullets(c(\"Shared drive created:\", bulletize(gargle_map_cli(out))))\n  invisible(out)\n}\n"
  },
  {
    "path": "R/shared_drive_find.R",
    "content": "#' Find shared drives\n#'\n#' @description This is the closest googledrive function to what you get from\n#'   visiting <https://drive.google.com> and clicking \"Shared drives\".\n#' @template shared-drive-description\n\n#' @seealso Wraps the `drives.list` endpoint:\n#' * <https://developers.google.com/drive/api/v3/reference/drives/list>\n\n#' @template pattern\n#' @template n_max\n#' @param ... Other parameters to pass along in the request, such as `pageSize`\n#'   or `useDomainAdminAccess`.\n#'\n#' @eval return_dribble(\"shared drive\")\n#' @export\n#' @examples\n#' \\dontrun{\n#' shared_drive_find()\n#' }\nshared_drive_find <- function(pattern = NULL, n_max = Inf, ...) {\n  if (!is.null(pattern) && !(is_string(pattern))) {\n    drive_abort(\"{.arg pattern} must be a character string.\")\n  }\n  stopifnot(is.numeric(n_max), n_max >= 0, length(n_max) == 1)\n  if (n_max < 1) {\n    return(dribble())\n  }\n\n  ## what could possibly come via `...` here? pageSize (or fields)\n  params <- toCamel(list2(...))\n  params$fields <- params$fields %||% \"*\"\n\n  request <- request_generate(\"drive.drives.list\", params = params)\n  proc_res_list <- do_paginated_request(\n    request,\n    n_max = n_max,\n    n = function(x) length(x$drives)\n  )\n\n  res_tbl <- proc_res_list |>\n    map(\"drives\") |>\n    purrr::flatten() |>\n    as_dribble()\n\n  if (!is.null(pattern)) {\n    res_tbl <- res_tbl[grep(pattern, res_tbl$name), ]\n  }\n  if (n_max < nrow(res_tbl)) {\n    res_tbl <- res_tbl[seq_len(n_max), ]\n  }\n  res_tbl\n}\n"
  },
  {
    "path": "R/shared_drive_get.R",
    "content": "#' Get shared drives by name or id\n#'\n#' @description\n\n#' Retrieve metadata for shared drives specified by name or id. Note that Google\n#' Drive does NOT behave like your local file system:\n\n#' * You can get zero, one, or more shared drives back for each name! Shared\n#' drive names need not be unique.\n#' @template shared-drive-description\n\n#' @param name Character vector of names. A character vector marked with\n#'   [as_id()] is treated as if it was provided via the `id` argument.\n#' @param id Character vector of shared drive ids or URLs (it is first processed\n#'   with [as_id()]). If both `name` and `id` are non-`NULL`, `id` is silently\n#'   ignored.\n#'\n#' @eval return_dribble(\"shared drive\")\n#' @export\n#' @examples\n#' \\dontrun{\n#' shared_drive_get(\"my-awesome-shared-drive\")\n#' shared_drive_get(c(\"apple\", \"orange\", \"banana\"))\n#' shared_drive_get(as_id(\"KCmiHLXUk9PVA-0AJNG\"))\n#' shared_drive_get(as_id(\"https://drive.google.com/drive/u/0/folders/KCmiHLXUk9PVA-0AJNG\"))\n#' shared_drive_get(id = \"KCmiHLXUk9PVA-0AJNG\")\n#' shared_drive_get(id = \"https://drive.google.com/drive/u/0/folders/KCmiHLXUk9PVA-0AJNG\")\n#' }\nshared_drive_get <- function(name = NULL, id = NULL) {\n  if (length(name) + length(id) == 0) {\n    return(dribble())\n  }\n\n  if (!is.null(name) && is_drive_id(name)) {\n    id <- name\n    name <- NULL\n  }\n\n  if (!is.null(name)) {\n    stopifnot(all(map_lgl(name, is_string)))\n    return(shared_drive_from_name(name))\n  }\n\n  stopifnot(is.character(id))\n  # TODO: use a batch request\n  as_dribble(map(as_id(id), get_one_shared_drive_id))\n}\n\nget_one_shared_drive_id <- function(id) {\n  if (is.na(id)) {\n    drive_abort(\n      \"\n      Can't {.fun shared_drive_get} a shared drive when {.arg id} is {.code NA}.\"\n    )\n  }\n  request <- request_generate(\n    endpoint = \"drive.drives.get\",\n    params = list(\n      driveId = id,\n      fields = \"*\"\n    )\n  )\n  response <- request_make(request)\n  gargle::response_process(response)\n}\n\nshared_drive_from_name <- function(name = NULL) {\n  if (length(name) == 0) {\n    return(dribble())\n  }\n\n  shared_drives <- shared_drive_find()\n  if (no_file(shared_drives)) {\n    return(dribble())\n  }\n\n  shared_drives <- shared_drives[shared_drives$name %in% name, ]\n  ## TO DO: message if a name matches 0 or multiple shared drives?\n\n  shared_drives[order(match(shared_drives$name, name)), ]\n}\n"
  },
  {
    "path": "R/shared_drive_rm.R",
    "content": "#' Delete shared drives\n#'\n#' @template shared-drive-description\n#'\n#' @seealso Wraps the `drives.delete` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/drives/delete>\n#'\n#' @template shared_drive-plural\n#'\n#' @return Logical vector, indicating whether the delete succeeded.\n#' @export\n#' @examples\n#' \\dontrun{\n#' # Create shared drives to remove in various ways\n#' shared_drive_create(\"testdrive-01\")\n#' sd02 <- shared_drive_create(\"testdrive-02\")\n#' shared_drive_create(\"testdrive-03\")\n#' sd04 <- shared_drive_create(\"testdrive-04\")\n#'\n#' # remove by name\n#' shared_drive_rm(\"testdrive-01\")\n#' # remove by id\n#' shared_drive_rm(as_id(sd02))\n#' # remove by URL (or, rather, id found in URL)\n#' shared_drive_rm(as_id(\"https://drive.google.com/drive/u/0/folders/Q5DqUk9PVA\"))\n#' # remove by dribble\n#' shared_drive_rm(sd04)\n#' }\nshared_drive_rm <- function(drive = NULL) {\n  shared_drive <- as_shared_drive(drive)\n  if (no_file(shared_drive)) {\n    drive_bullets(c(\n      \"!\" = \"No such shared drive found to delete.\"\n    ))\n    return(invisible(logical(0)))\n  }\n\n  out <- map_lgl(as_id(shared_drive), delete_one_shared_drive)\n\n  if (any(out)) {\n    successes <- shared_drive[out, ]\n    drive_bullets(c(\n      \"Shared drive{?s} deleted:{cli::qty(nrow(successes))}\",\n      bulletize(gargle_map_cli(successes))\n    ))\n  }\n  # I'm not sure this ever comes up IRL?\n  # Is it even possible that removal fails but there's no error?\n  if (any(!out)) {\n    failures <- shared_drive[!out, ]\n    drive_bullets(c(\n      \"Shared drive{?s} NOT deleted:{cli::qty(nrow(failures))}\",\n      bulletize(gargle_map_cli(failures))\n    ))\n  }\n  invisible(out)\n}\n\ndelete_one_shared_drive <- function(id) {\n  request <- request_generate(\n    endpoint = \"drive.drives.delete\",\n    params = list(driveId = id)\n  )\n  response <- request_make(request)\n  gargle::response_process(response)\n}\n"
  },
  {
    "path": "R/shared_drive_update.R",
    "content": "#' Update a shared drive\n#'\n#' Update the metadata of an existing shared drive, e.g. its background image or\n#' theme.\n#' @template shared-drive-description\n#'\n#' @seealso Wraps the `drives.update` endpoint:\n#'   * <https://developers.google.com/drive/api/v3/reference/drives/update>\n#'\n#' @template shared_drive-singular\n#' @param ... Properties to set in `name = value` form. See the \"Request\n#'   body\" section of the Drive API docs for this endpoint.\n#'\n#' @eval return_dribble(\"shared drive\")\n#' @export\n#' @examples\n#' \\dontrun{\n#' # create a shared drive\n#' sd <- shared_drive_create(\"I love themes!\")\n#'\n#' # see the themes available to you\n#' themes <- drive_about()$driveThemes\n#' purrr::map_chr(themes, \"id\")\n#'\n#' # cycle through various themes for this shared drive\n#' sd <- shared_drive_update(sd, themeId = \"bok_choy\")\n#' sd <- shared_drive_update(sd, themeId = \"cocktails\")\n#'\n#' # Clean up\n#' shared_drive_rm(sd)\n#' }\nshared_drive_update <- function(shared_drive, ...) {\n  shared_drive <- as_shared_drive(shared_drive)\n  if (no_file(shared_drive)) {\n    drive_bullets(c(\n      \"!\" = \"No such shared drive found to update.\"\n    ))\n    return(invisible(dribble()))\n  }\n  if (!single_file(shared_drive)) {\n    drive_abort(c(\n      \"Can't update multiple shared drives at once:\",\n      bulletize(gargle_map_cli(shared_drive))\n    ))\n  }\n\n  meta <- toCamel(list2(...))\n  if (length(meta) == 0) {\n    drive_bullets(c(\n      \"!\" = \"No updates specified.\"\n    ))\n    return(invisible(shared_drive))\n  }\n\n  meta$fields <- meta$fields %||% \"*\"\n  meta$driveId <- shared_drive$id\n  request <- request_generate(\n    endpoint = \"drive.drives.update\",\n    params = meta\n  )\n  response <- request_make(request)\n  out <- as_dribble(list(gargle::response_process(response)))\n\n  drive_bullets(c(\"Shared drive updated:\", bulletize(gargle_map_cli(out))))\n\n  invisible(out)\n}\n"
  },
  {
    "path": "R/shared_drives.R",
    "content": "#' Access shared drives\n#'\n#' @description\n\n#' A shared drive supports files owned by an organization rather than an\n#' individual user. Shared drives follow different sharing and ownership models\n#' from a specific user's \"My Drive\". Shared drives are the successors to the\n#' earlier concept of Team Drives.\n\n#' @description How to capture a shared drive or files/folders that live on a\n#'   shared drive for downstream use:\n\n#' * [shared_drive_find()] and [shared_drive_get()] return a [`dribble`] with\n#' metadata on shared drives themselves. You will need this in order to use a\n#' shared drive in certain file operations. For example, you can specify a\n#' shared drive as the parent folder via the `path` argument for upload, move,\n#' copy, etc. In that context, the id of a shared drive functions like the id of\n#' its top-level or root folder.\n\n#' * [drive_find()] and [drive_get()] return a [`dribble`] with metadata on\n#' files, including folders. Both can be directed to search for files on shared\n#' drives using the optional arguments `shared_drive` or `corpus` (documented\n#' below).\n#'\n\n#' @description Regard the functions mentioned above as the official \"port of\n#'   entry\" for working with shared drives. Use these functions to capture your\n#'   target(s) in a [`dribble`] to pass along to other googledrive functions.\n#'   The flexibility to refer to files by name or path does not apply as broadly\n#'   to shared drives. While it's always a good idea to get things into a\n#'   [`dribble`] early, for shared drives it's often required.\n#'\n\n#' @section Specific shared drive:\n#' To search one specific shared drive, pass its name, marked id, or\n#' [`dribble`] to `shared_drive` somewhere in the call, like so:\n#' ```\n#' drive_find(..., shared_drive = \"i_am_a_shared_drive_name\")\n#' drive_find(..., shared_drive = as_id(\"i_am_a_shared_drive_id\"))\n#' drive_find(..., shared_drive = i_am_a_shared_drive_dribble)\n#' ```\n#' The value provided to `shared_drive` is pre-processed with\n#' [as_shared_drive()].\n\n#' @section Other collections:\n#' To search other collections, pass the `corpus` parameter somewhere in the\n#' call, like so:\n#' ```\n#' drive_find(..., corpus = \"user\")\n#' drive_find(..., corpus = \"allDrives\")\n#' drive_find(..., corpus = \"domain\")\n#' ```\n#' Possible values of `corpus` and what they mean:\n#' * `\"user\"`: Queries files that the user has accessed, including both shared\n#'   drive and My Drive files.\n#' * `\"drive\"`: Queries all items in the shared drive specified via\n#'   `shared_drive`. googledrive automatically fills this in whenever\n#'   `shared_drive` is not `NULL`.\n#' * `\"allDrives\"`: Queries files that the user has accessed and all shared\n#'   drives in which they are a member. Note that the response may include\n#'   `incompleteSearch : true`, indicating that some corpora were not searched\n#'   for this request (currently, googledrive does not surface this). Prefer\n#'   `\"user\"` or `\"drive\"` to `\"allDrives\"` for efficiency.\n#' * `\"domain\"`: Queries files that are shared to the domain, including both\n#'   shared drive and My Drive files.\n\n#' @section Google blogs and docs:\n#' Here is some of the best official Google reading about shared drives:\n#' * [Team Drives is being renamed to shared drives](https://workspaceupdates.googleblog.com/2019/04/shared-drives.html) from Google Workspace blog\n#' * [Upcoming changes to the Google Drive API and Google Picker API](https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api) from the Google Cloud blog\n#' * <https://developers.google.com/drive/api/v3/about-shareddrives>\n#' * <https://developers.google.com/drive/api/v3/shared-drives-diffs>\n#' * Get started with shared drives: `https://support.google.com/a/users/answer/9310351` from Google Workspace Learning Center\n#' * Best practices for shared drives: `https://support.google.com/a/users/answer/9310156` from Google Workspace Learning Center\n\n#' @section API docs:\n#' googledrive implements shared drive support as outlined here:\n#' * <https://developers.google.com/drive/api/v3/enable-shareddrives>\n#'\n#' Users shouldn't need to know any of this, but here are details for the\n#' curious. The extra information needed to search shared drives consists of the\n#' following query parameters:\n#' * `corpora`: Where to search? Formed from googledrive's `corpus` argument.\n#' * `driveId`: The id of a specific shared drive. Only allowed -- and also\n#'   absolutely required -- when `corpora = \"drive\"`. When user specifies a\n#'   `shared_drive`, googledrive sends its id and also infers that `corpora`\n#'   should be set to `\"drive\"`.\n#' * `includeItemsFromAllDrives`: Do you want to see shared drive items?\n#'   Obviously, this should be `TRUE` and googledrive sends this whenever shared\n#'   drive parameters are detected.\n#' * `supportsAllDrives`: Does the sending application (googledrive, in this\n#'   case) know about shared drive? Obviously, this should be `TRUE` and\n#'   googledrive sends it for all applicable endpoints, all the time.\n#'\n#' @name shared_drives\nNULL\n\n# Shared drive and \"file groupings\" support\n#\n# Internal documentation!\n#\n# It is intentional that googledrive's two parameters `shared_drive` and\n# `corpus` have NO OVERLAP with actual Drive query parameters: this way the\n# googledrive high-level wrapping is option A but user could also pass raw\n# params through `...` as option B.\n#\n# @param driveId Character, a shared drive id.\n# @template corpus\n# @param includeItemsFromAllDrives Logical, googledrive always sets this to\n#   `TRUE`.\n#\n# @examples\n# \\dontrun{\n# shared_drive_params(driveId = \"123456789\")\n# shared_drive_params(corpora = \"user\")\n# shared_drive_params(corpora = \"allDrives\")\n# shared_drive_params(corpora = \"domain\")\n#\n# # this will error because `corpora = \"drive\"` also requires the id\n# shared_drive_params(corpora = \"drive\")\n#\n# # this will error because `corpora = \"domain\"` forbids inclusion of id\n# shared_drive_params(corpora = \"domain\", driveId = \"123456789\")\n# }\nshared_drive_params <- function(\n  driveId = NULL,\n  corpora = NULL,\n  includeItemsFromAllDrives = NULL\n) {\n  rationalize_corpus(\n    new_corpus(\n      driveId,\n      corpora,\n      includeItemsFromAllDrives\n    )\n  )\n}\n\nnew_corpus <- function(\n  driveId = NULL,\n  corpora = NULL,\n  includeItemsFromAllDrives = NULL\n) {\n  if (!is.null(driveId)) {\n    # can't use is_string() because object of class drive_id IS acceptable\n    stopifnot(is.character(driveId), length(driveId) == 1)\n  }\n  if (!is.null(corpora)) {\n    stopifnot(is_string(corpora))\n  }\n  if (!is.null(includeItemsFromAllDrives)) {\n    stopifnot(\n      is.logical(includeItemsFromAllDrives),\n      length(includeItemsFromAllDrives) == 1\n    )\n  }\n  structure(\n    list(\n      corpora = corpora,\n      driveId = driveId,\n      includeItemsFromAllDrives = includeItemsFromAllDrives\n    ),\n    class = \"corpus\"\n  )\n}\n\n# this isn't a classic validator, because it fills in some gaps\n# there is, however, no magic\n# there is user input that is unambiguous but still won't satisfy the API\n#   1. if `driveId` is provided and `corpora` is not, we fill in\n#      `corpora = \"drive\"`\n#   2. we always send `includeItemsFromAllDrives = TRUE`\nrationalize_corpus <- function(corpus) {\n  stopifnot(inherits(corpus, \"corpus\"))\n\n  if (!is.null(corpus[[\"driveId\"]])) {\n    corpus[[\"corpora\"]] <- corpus[[\"corpora\"]] %||% \"drive\"\n  }\n\n  validate_corpora(corpus[[\"corpora\"]])\n\n  if (corpus[[\"corpora\"]] == \"drive\" && is.null(corpus[[\"driveId\"]])) {\n    drive_abort(\n      '\n      When {.code corpus = \"drive\"}, you must also specify \\\\\n      the {.arg shared_drive}.'\n    )\n  }\n\n  if (corpus[[\"corpora\"]] != \"drive\" && !is.null(corpus[[\"driveId\"]])) {\n    drive_abort(\n      '\n      When {.code corpus != \"drive\"}, you must not specify \\\\\n      a {.arg shared_drive}.'\n    )\n  }\n\n  corpus[[\"includeItemsFromAllDrives\"]] <- TRUE\n\n  corpus\n}\n\nvalid_corpora <- c(\"user\", \"drive\", \"allDrives\", \"domain\")\n\nvalidate_corpora <- function(corpora) {\n  if (!corpora %in% valid_corpora) {\n    # yes, I intentionally use `corpus` in this message, even\n    # though the actual API parameter is `corpora`\n    # googledrive's user-facing functions have `corpus` in their signature and\n    # the rationale is explained elsewhere in this file\n    drive_abort(c(\n      \"Invalid value for {.arg corpus}:\",\n      bulletize(gargle_map_cli(corpora), bullet = \"x\"),\n      \"These are the only acceptable values:\",\n      bulletize(gargle_map_cli(valid_corpora))\n    ))\n  }\n  invisible(corpora)\n}\n\n#' Coerce to shared drive\n#'\n#' @description Converts various representations of a shared drive into a\n#'   [`dribble`], the object used by googledrive to hold Drive file metadata.\n#'   Shared drives can be specified via\n#'   * Name\n#'   * Shared drive id, marked with [as_id()] to distinguish from name\n#'   * Data frame or [`dribble`] consisting solely of shared drives\n#'   * List representing [Drives resource](https://developers.google.com/drive/api/v3/reference/drives#resource-representations)\n#'     objects (mostly for internal use)\n#'\n#' @template shared-drive-description\n#'\n#' @description This is a generic function.\n#'\n#' @param x A vector of shared drive names, a vector of shared drive ids marked\n#'   with [as_id()], a list of Drives resource objects, or a suitable data\n#'   frame.\n#' @param ... Other arguments passed down to methods. (Not used.)\n#' @export\n#' @examples\n#' \\dontrun{\n#' # specify the name\n#' as_shared_drive(\"abc\")\n#'\n#' # specify the id (substitute one of your own!)\n#' as_shared_drive(as_id(\"0AOPK1X2jaNckUk9PVA\"))\n#' }\nas_shared_drive <- function(x, ...) UseMethod(\"as_shared_drive\")\n\n#' @export\nas_shared_drive.default <- function(x, ...) {\n  drive_abort(\n    \"\n    Don't know how to coerce an object of class {.cls {class(x)}} into \\\\\n    a shared drive {.cls dribble}.\"\n  )\n}\n\n#' @export\nas_shared_drive.NULL <- function(x, ...) dribble()\n\n#' @export\nas_shared_drive.character <- function(x, ...) shared_drive_get(name = x)\n\n#' @export\nas_shared_drive.drive_id <- function(x, ...) shared_drive_get(id = x)\n\n#' @export\nas_shared_drive.dribble <- function(x, ...) validate_shared_drive_dribble(x)\n\n#' @export\nas_shared_drive.data.frame <- function(x, ...) {\n  validate_shared_drive_dribble(as_dribble(x))\n}\n\n#' @export\nas_shared_drive.list <- function(x, ...) {\n  validate_shared_drive_dribble(as_dribble(x))\n}\n\nvalidate_shared_drive_dribble <- function(x) {\n  stopifnot(inherits(x, \"dribble\"))\n  if (!all(is_shared_drive(x))) {\n    drive_abort(\n      \"\n      All rows of shared drive {.cls dribble} must contain a shared drive.\"\n    )\n  }\n  x\n}\n"
  },
  {
    "path": "R/shortcut.R",
    "content": "#' Create a shortcut to a Drive file\n#'\n#' Creates a shortcut to the target Drive `file`, which could be a folder. A\n#' Drive shortcut functions like a symbolic or \"soft\" link and is primarily\n#' useful for creating a specific Drive user experience in the browser, i.e. to\n#' make a Drive file or folder appear in more than 1 place. Shortcuts are a\n#' relatively new feature in Drive; they were introduced when Drive stopped\n#' allowing a file to have more than 1 parent folder.\n#'\n#' @template file-singular\n\n#' @eval param_path_known_parent(\"shortcut\")\n#' @eval param_name(\n#'   thing = \"shortcut\",\n#'   default_notes = \"By default, the shortcut starts out with the same name as\n#'     the target `file`. As a consequence, if you want to use\n#'     `overwrite = TRUE` or `overwrite = FALSE`, you **must** explicitly\n#'     specify the shortcut's `name`.\"\n#' )\n\n#' @template overwrite\n#' @eval return_dribble()\n#' @export\n\n#' @seealso\n#'   * <https://developers.google.com/drive/api/v3/shortcuts>\n\n#'\n#' @examplesIf drive_has_token()\n#' # Target one of the official example files\n#' (src_file <- drive_example_remote(\"chicken_sheet\"))\n#'\n#' # Create a shortcut in the default location with the default name\n#' sc1 <- shortcut_create(src_file)\n#' # This shortcut could now be moved, renamed, etc.\n#'\n#' # Create a shortcut in the default location with a custom name\n#' sc2 <- src_file |>\n#'   shortcut_create(name = \"chicken_sheet_second_shortcut\")\n#'\n#' # Create a folder, then put a shortcut there, with default name\n#' folder <- drive_mkdir(\"chicken_sheet_shortcut_folder\")\n#' sc3 <- src_file |>\n#'   shortcut_create(folder)\n#'\n#' # Look at all these shortcuts\n#' (dat <- drive_find(\"chicken_sheet\", type = \"shortcut\"))\n#'\n#' # Confirm the shortcuts all target the original file\n#' dat <- dat |>\n#'   drive_reveal(\"shortcut_details\")\n#' purrr::map_chr(dat$shortcut_details, \"targetId\")\n#' as_id(src_file)\n#'\n#' # Clean up\n#' drive_rm(sc1, sc2, sc3, folder)\nshortcut_create <- function(file, path = NULL, name = NULL, overwrite = NA) {\n  target <- as_dribble(file)\n  target <- confirm_single_file(target)\n\n  if (is.null(name) && (isTRUE(overwrite) || isFALSE(overwrite))) {\n    drive_abort(\n      \"\n      You must specify the shortcut's {.arg name} in order to specify \\\\\n      {.arg overwrite} behaviour.\"\n    )\n  }\n\n  drive_create(\n    name = name,\n    path = path,\n    type = \"shortcut\",\n    shortcutDetails = list(targetId = target$id),\n    overwrite = overwrite\n  )\n}\n\n#' Resolve shortcuts to their targets\n#'\n#' Retrieves the metadata for the Drive file that a shortcut refers to, i.e. the\n#' shortcut's target. The returned [`dribble`] has the usual columns (`name`,\n#' `id`, `drive_resource`), which refer to the target. It will also include the\n#' columns `name_shortcut` and `id_shortcut`, which refer to the original\n#' shortcut. There are 3 possible scenarios:\n\n#' 1. `file` is a shortcut and user can [drive_get()] the target. All is simple\n#'    and well.\n#' 1. `file` is a shortcut, but [drive_get()] fails for the target. This can\n#'    happen if the user can see the shortcut, but does not have read access\n#'    to the target. It can also happen if the target has been trashed or\n#'    deleted. In such cases, all of the target's metadata, except for `id`,\n#'    will be missing. Call `drive_get()` on a problematic `id` to see the\n#'    specific error.\n#' 1. `file` is not a shortcut. `name_shortcut` and `id_shortcut` will both be\n#'    `NA`.\n#'\n#' @template file-plural\n#'\n#' @eval return_dribble(extras = \"Extra columns `name_shortcut` and\n#'   `id_shortcut` refer to the original shortcut.\")\n#' @export\n#'\n#' @examplesIf drive_has_token()\n#' # Create a file to make a shortcut to\n#' file <- drive_example_remote(\"chicken_sheet\") |>\n#'   drive_cp(name = \"chicken-sheet-for-shortcut\")\n#'\n#' # Create a shortcut\n#' sc1 <- file |>\n#'   shortcut_create(name = \"shortcut-1\")\n#'\n#' # Create a second shortcut by copying the first\n#' sc1 <- sc1 |>\n#'   drive_cp(name = \"shortcut-2\")\n#'\n#' # Get the shortcuts\n#' (sc_dat <- drive_find(\"-[12]$\", type = \"shortcut\"))\n#'\n#' # Resolve them\n#' (resolved <- shortcut_resolve(sc_dat))\n#'\n#' resolved$id\n#' file$id\n#'\n#' # Delete the target file\n#' drive_rm(file)\n#'\n#' # (Try to) resolve the shortcuts again\n#' shortcut_resolve(sc_dat)\n#' # No error, but resolution is unsuccessful due to non-existent target\n#'\n#' # Clean up\n#' drive_rm(sc_dat)\nshortcut_resolve <- function(file) {\n  file <- as_dribble(file)\n  out <- purrr::pmap(file, resolve_one)\n  out <- vec_rbind(!!!out)\n\n  is_sc <- !is.na(out$name_shortcut)\n  n_shortcuts <- sum(is_sc)\n  n_resolved <- sum(is_sc & !is.na(out$name))\n\n  if (n_shortcuts == 0) {\n    drive_bullets(c(\n      \"i\" = \"No shortcuts found.\"\n    ))\n  } else {\n    drive_bullets(c(\n      i = if (n_shortcuts == n_resolved) {\n        \"Resolved {n_resolved} shortcut{?s} found in {nrow(out)} file{?s}:\"\n      } else {\n        \"Resolved {n_resolved} of {n_shortcuts} shortcut{?s} found \\\\\n         in {nrow(out)} file{?s}:\"\n      },\n      bulletize(gargle_map_cli(\n        out[is_sc, ],\n        template = c(\n          id_shortcut_string = \"<id:\\u00a0<<id_shortcut>>>\",\n          id_string = \"<id:\\u00a0<<id>>>\",\n          out = \"{.drivepath <<name_shortcut>>} \\\\\n                 {cli::col_grey('<<id_shortcut_string>>')} \\\\\n                 -> {.drivepath <<name>>} {cli::col_grey('<<id_string>>')}\"\n        )\n      ))\n    ))\n  }\n\n  out\n}\n\n# TODO: why does this have such an annoying signature? why not dribble in,\n# dribble out?\nresolve_one <- function(name, id, drive_resource, ...) {\n  target_id <- pluck(drive_resource, \"shortcutDetails\", \"targetId\")\n  if (is_null(target_id)) {\n    return(\n      list(drive_resource) |>\n        as_dribble() |>\n        put_column(nm = \"id_shortcut\", val = NA_character_, .after = \"id\") |>\n        put_column(nm = \"name_shortcut\", val = NA_character_, .after = \"id\")\n    )\n  }\n  out <- tryCatch(\n    drive_get(as_id(target_id)),\n    purrr_error_indexed = function(err) {\n      if (rlang::cnd_inherits(err, \"gargle_error_request_failed\")) {\n        bad_target(target_id)\n      } else {\n        cnd_signal(err)\n      }\n    }\n  )\n  out |>\n    put_column(nm = \"id_shortcut\", val = id, .after = \"id\") |>\n    put_column(nm = \"name_shortcut\", val = name, .after = \"id\")\n}\n\nbad_target <- function(id) {\n  as_dribble(list(\n    list(\n      name = NA_character_,\n      id = id,\n      kind = \"drive#file\"\n    )\n  ))\n}\n"
  },
  {
    "path": "R/team_drive.R",
    "content": "#' Deprecated Team Drive functions\n#'\n#' @description\n#' `r lifecycle::badge('deprecated')`\n#' @template team-drives-description\n#'\n#' @inheritParams shared_drive_find\n#' @inheritParams shared_drive_get\n#' @inheritParams as_shared_drive\n#' @inheritParams is_shared_drive\n#' @template team_drive-plural\n#'\n#' @eval return_dribble(\"shared drive\")\n#'\n#' @keywords internal\n#' @name deprecated-team-drive-functions\nNULL\n\n#' @export\n#' @rdname deprecated-team-drive-functions\nteam_drive_find <- function(\n  pattern = NULL,\n  n_max = Inf,\n  ...,\n  verbose = deprecated()\n) {\n  warn_for_verbose(verbose)\n  lifecycle::deprecate_warn(\"2.0.0\", \"team_drive_find()\", \"shared_drive_find()\")\n  shared_drive_find(pattern = pattern, n_max = n_max, ...)\n}\n\n#' @export\n#' @rdname deprecated-team-drive-functions\nteam_drive_get <- function(name = NULL, id = NULL, verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  lifecycle::deprecate_warn(\"2.0.0\", \"team_drive_get()\", \"shared_drive_get()\")\n  shared_drive_get(name = name, id = id)\n}\n\n#' @export\n#' @rdname deprecated-team-drive-functions\nteam_drive_create <- function(name, verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  lifecycle::deprecate_warn(\n    \"2.0.0\",\n    \"team_drive_create()\",\n    \"shared_drive_create()\"\n  )\n  shared_drive_create(name = name)\n}\n\n#' @export\n#' @rdname deprecated-team-drive-functions\nteam_drive_rm <- function(team_drive = NULL, verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  lifecycle::deprecate_warn(\"2.0.0\", \"team_drive_rm()\", \"shared_drive_rm()\")\n  shared_drive_rm(drive = team_drive)\n}\n\n#' @export\n#' @rdname deprecated-team-drive-functions\nteam_drive_update <- function(team_drive, ..., verbose = deprecated()) {\n  warn_for_verbose(verbose)\n  lifecycle::deprecate_warn(\n    \"2.0.0\",\n    \"team_drive_update()\",\n    \"shared_drive_update()\"\n  )\n  shared_drive_update(drive = team_drive, ...)\n}\n\n#' @export\n#' @rdname deprecated-team-drive-functions\nas_team_drive <- function(x, ...) {\n  lifecycle::deprecate_warn(\"2.0.0\", \"as_team_drive()\", \"as_shared_drive()\")\n  as_shared_drive(x, ...)\n}\n\n#' @export\n#' @rdname deprecated-team-drive-functions\nis_team_drive <- function(d) {\n  stopifnot(inherits(d, \"dribble\"))\n  map_chr(d$drive_resource, \"kind\") == \"drive#teamDrive\"\n}\n"
  },
  {
    "path": "R/utils-io.R",
    "content": "readLines <- function(...) {\n  drive_abort(\"In this house, we use {.fun read_utf8} for UTF-8 reasons.\")\n}\n\nwriteLines <- function(...) {\n  drive_abort(\"In this house, we use {.fun write_utf8} for UTF-8 reasons.\")\n}\n\n# https://github.com/gaborcsardi/rencfaq#with-base-r\nread_utf8 <- function(path) {\n  opts <- options(encoding = \"native.enc\")\n  withr::defer(options(opts))\n  x <- base::readLines(path, encoding = \"UTF-8\", warn = FALSE)\n  x\n}\n\n# https://github.com/gaborcsardi/rencfaq#with-base-r\nwrite_utf8 <- function(text, path = NULL) {\n  # sometimes we use writeLines() basically to print something for a snapshot\n  if (is.null(path)) {\n    return(base::writeLines(text))\n  }\n\n  # step 1: ensure our text is utf8 encoded\n  utf8 <- enc2utf8(text)\n  upath <- enc2utf8(path)\n\n  # step 2: create a connection with 'native' encoding\n  # this signals to R that translation before writing\n  # to the connection should be skipped\n  con <- file(upath, open = \"w+\", encoding = \"native.enc\")\n  withr::defer(close(con))\n\n  # step 3: write to the connection with 'useBytes = TRUE',\n  # telling R to skip translation to the native encoding\n  base::writeLines(utf8, con = con, useBytes = TRUE)\n}\n\n# used for building functions that construct Drive file names in tests ----\nnm_fun <- function(context, user_run = TRUE) {\n  user_run <- if (isTRUE(user_run)) nm_user_run() else NULL\n  y <- purrr::compact(list(context, user_run))\n  function(x = character()) as.character(glue_collapse(c(x, y), sep = \"-\"))\n}\n\nnm_user_run <- function() {\n  if (as.logical(Sys.getenv(\"GITHUB_ACTIONS\", unset = \"false\"))) {\n    glue(\"gha-{Sys.getenv('GITHUB_WORKFLOW')}-{Sys.getenv('GITHUB_RUN_ID')}\")\n  } else {\n    random_id <- strsplit(uuid::UUIDgenerate(TRUE), \"-\")[[1]][[1]]\n    glue(\"{Sys.info()['user']}-{random_id}\")\n  }\n}\n"
  },
  {
    "path": "R/utils-paths.R",
    "content": "# path utilities that CAN call the Drive API ----\nroot_folder <- function() {\n  # inlining env_cache() logic, so I don't need bleeding edge rlang\n  if (!env_has(.googledrive, \"root_folder\")) {\n    env_poke(.googledrive, \"root_folder\", drive_get(id = \"root\"))\n  }\n  env_get(.googledrive, \"root_folder\")\n}\nroot_id <- function() root_folder()$id\n\nrationalize_path_name <- function(path = NULL, name = NULL) {\n  if (!is.null(name)) {\n    stopifnot(is_string(name))\n  }\n\n  if (is_path(path)) {\n    confirm_clear_path(path, name)\n    path_parts <- partition_path(path, maybe_name = is.null(name))\n    path <- path_parts$parent\n    name <- name %||% path_parts$name\n  }\n\n  list(path = path, name = name)\n}\n\nconfirm_clear_path <- function(path, name) {\n  if (\n    is.null(name) &&\n      !has_slash(path) &&\n      drive_path_exists(append_slash(path))\n  ) {\n    drive_abort(c(\n      \"Unclear if {.arg path} specifies parent folder or full path \\\\\n       to the new file, including its name.\",\n      \"See {.fun ?as_dribble} for advice on how to make this clear.\"\n    ))\n  }\n}\n\ndrive_path_exists <- function(path) {\n  stopifnot(is_path(path))\n  if (length(path) == 0) {\n    return(logical(0))\n  }\n  stopifnot(length(path) == 1)\n  with_drive_quiet(\n    some_files(drive_get(path = path))\n  )\n}\n\n# `parent` is NULL or the file ID of a folder\ncheck_for_overwrite <- function(parent = NULL, name, overwrite) {\n  hits <- overwrite_hits(parent = parent, name = name, overwrite = overwrite)\n\n  # Happy Path 1 of 2: no name collision\n  if (is.null(hits) || no_file(hits)) {\n    return(invisible())\n  }\n\n  # Happy Path 2 of 2: single name collision, which we are authorized to trash\n  if (overwrite && single_file(hits)) {\n    return(drive_trash(hits))\n  }\n\n  # Unhappy Paths: multiple collisions and/or not allowed to trash anything\n  hits <- drive_reveal(hits, \"path\")\n\n  if (overwrite) {\n    drive_abort(c(\n      \"Multiple items already exist at the target filepath.\",\n      bulletize(gargle_map_cli(hits, bullet = \"x\")),\n      \"Although {.code overwrite = TRUE}, it's not clear which item \\\\\n       to overwrite.\",\n      \"Use {.code overwrite = NA} to suppress this check. Exiting.\"\n    ))\n  } else {\n    drive_abort(c(\n      # \\u00a0 is a nonbreaking space\n      \"{nrow(hits)} item{?s} already exist{?s/} at the target filepath \\\\\n       and {.code overwrite\\u00a0=\\u00a0FALSE}:\",\n      bulletize(gargle_map_cli(hits, bullet = \"x\"))\n    ))\n  }\n}\n\noverwrite_hits <- function(parent = NULL, name, overwrite) {\n  stopifnot(is_toggle(overwrite))\n  if (is.na(overwrite)) {\n    return(invisible())\n  }\n\n  parent_id <- parent %||% root_id()\n  q <- c(\n    glue(\"'{parent_id}' in parents\"),\n    glue(\"name = '{name}'\"),\n    \"trashed = FALSE\"\n  )\n  # suppress drive_find() status updates\n  local_drive_quiet()\n  drive_find(q = q, corpus = \"allDrives\")\n}\n\n# path utilities that are \"mechanical\", i.e. they NEVER call the Drive API ----\ndribble_with_path <- function() {\n  put_column(dribble(), nm = \"path\", val = character(), .after = \"name\")\n}\n\nis_path <- function(x) is.character(x) && !is_drive_id(x)\n\nis_string <- function(x) length(x) == 1L && is_path(x)\n\n# turn '~' into `~/`\nrootize_path <- function(path) {\n  if (length(path) == 0) {\n    return(path)\n  }\n  stopifnot(is.character(path))\n  leading_slash <- startsWith(path, \"/\")\n  if (any(leading_slash)) {\n    drive_abort(\n      \"{.pkg googledrive} does not allow paths to start with {.code /}\"\n    )\n  }\n  sub(\"^~$\", \"~/\", path)\n}\n\n## does path have a trailing slash?\nhas_slash <- function(path) {\n  grepl(\"/$\", path)\n}\n\n## \"a/b/\" and \"a/b\" both return \"a/b/\"\nappend_slash <- function(path) {\n  if (length(path) < 1) {\n    return(path)\n  }\n  ifelse(has_slash(path) | path == \"\", path, paste0(path, \"/\"))\n}\n\n## \"a/b/\" and \"a/b\" both return \"a/b\"\nstrip_slash <- function(path) {\n  gsub(\"/$\", \"\", path)\n}\n\n# partitions path into\n#   * name = substring after the last `/`\n#   * parent = substring up to the last `/`\n# if there is no `/`, put the input into `name`\n# use maybe_name if you have external info re: how to interpret the path\n# maybe_name = TRUE --> path could end in a name\n# maybe_name = FALSE --> path is known to be a directory\npartition_path <- function(path, maybe_name = FALSE) {\n  out <- list(parent = NULL, name = NULL)\n  if (length(path) < 1) {\n    return(out)\n  }\n  stopifnot(is_string(path))\n  path <- rootize_path(path)\n  if (!maybe_name) {\n    path <- append_slash(path)\n  }\n  last_slash <- last(unlist(gregexpr(pattern = \"/\", path)))\n  if (last_slash < 1) {\n    out[[\"name\"]] <- path\n    return(out)\n  }\n  out[[\"parent\"]] <- substr(path, 1, last_slash)\n  if (last_slash == nchar(path)) {\n    return(out)\n  }\n  out[[\"name\"]] <- substr(path, last_slash + 1, nchar(path))\n  out\n}\n\n## tools::file_ext(), except return NULL for non-extensions\nfile_ext_safe <- function(x) {\n  stopifnot(length(x) <= 1)\n  ext <- tools::file_ext(x)\n  if (length(ext) > 0 && nzchar(ext)) {\n    ext\n  } else {\n    NULL\n  }\n}\n\n## add an extension if it is not already present\napply_extension <- function(path, ext) {\n  if (is.na(ext) || ext == \"\") {\n    return(path)\n  }\n  ext_orig <- file_ext_safe(path)\n  if (!identical(ext, ext_orig)) {\n    path <- paste(path, ext, sep = \".\")\n  }\n  path\n}\n"
  },
  {
    "path": "R/utils-pipe.R",
    "content": "#' Pipe operator\n#'\n#' See \\code{magrittr::\\link[magrittr]{\\%>\\%}} for details.\n#'\n#' @name %>%\n#' @rdname pipe\n#' @keywords internal\n#' @export\n#' @importFrom magrittr %>%\n#' @usage lhs \\%>\\% rhs\nNULL\n"
  },
  {
    "path": "R/utils-ui.R",
    "content": "drive_theme <- function() {\n  list(\n    span.field = list(transform = single_quote_if_no_color),\n    # I want to style the Drive file names similar to cli's `.file` style,\n    # except cyan instead of blue\n    span.drivepath = list(\n      color = \"cyan\",\n      fmt = utils::getFromNamespace(\"quote_weird_name\", \"cli\")\n    ),\n    # since we're using color so much elsewhere, e.g. Drive file names, I think\n    # the standard bullet should be \"normal\" color\n    \".bullets .bullet-*\" = list(\n      \"text-exdent\" = 2,\n      before = function(x) paste0(cli::symbol$bullet, \" \")\n    )\n  )\n}\n\ndrive_bullets <- function(text, .envir = parent.frame()) {\n  quiet <- drive_quiet() %|% is_testing()\n  if (quiet) {\n    return(invisible())\n  }\n  cli::cli_div(theme = drive_theme())\n  cli::cli_bullets(text = text, .envir = .envir)\n}\n\ndrive_abort <- function(message, ..., .envir = parent.frame()) {\n  cli::cli_div(theme = drive_theme())\n  cli::cli_abort(message = message, ..., .envir = .envir)\n}\n\ndrive_warn <- function(message, ..., .envir = parent.frame()) {\n  cli::cli_div(theme = drive_theme())\n  cli::cli_warn(message = message, ..., .envir = .envir)\n}\n\nsingle_quote_if_no_color <- function(x) quote_if_no_color(x, \"'\")\ndouble_quote_if_no_color <- function(x) quote_if_no_color(x, '\"')\n\nquote_if_no_color <- function(x, quote = \"'\") {\n  # TODO: if a better way appears in cli, use it\n  # @gabor says: \"if you want to have before and after for the no-color case\n  # only, we can have a selector for that, such as:\n  # span.field::no-color\n  # (but, at the time I write this, cli does not support this yet)\n  if (cli::num_ansi_colors() > 1) {\n    x\n  } else {\n    paste0(quote, x, quote)\n  }\n}\n\n# useful to me during development, so I can see how my messages look w/o color\nlocal_no_color <- function(.envir = parent.frame()) {\n  withr::local_envvar(c(\"NO_COLOR\" = 1), .local_envir = .envir)\n}\n\nwith_no_color <- function(code) {\n  withr::with_envvar(c(\"NO_COLOR\" = 1), code)\n}\n\n#' @export\ngargle_map_cli.dribble <- function(\n  x,\n  template = NULL,\n  .open = \"<<\",\n  .close = \">>\",\n  ...\n) {\n  # template can be a vector, in case some intermediate constructions are needed\n  # this is true for the default case\n  # templates should assume a data mask of `x`\n  template <- template %||%\n    c(\n      id_string = \"<id:\\u00a0<<id>>>\", # \\u00a0 is a nonbreaking space\n      out = \"{.drivepath <<name>>} {cli::col_grey('<<id_string>>')}\"\n    )\n  stopifnot(is.character(template))\n\n  # if the template has length 1, I don't care if last element is named \"out\"\n  stopifnot(length(template) == 1 || utils::tail(names(template), 1) == \"out\")\n\n  for (i in seq_len(length(template) - 1)) {\n    x[names(template)[[i]]] <-\n      with(x, glue(template[[i]], .open = .open, .close = .close))\n  }\n  with(\n    x,\n    as.character(glue(utils::tail(template, 1), .open = .open, .close = .close))\n  )\n}\n\n# making googldrive quiet vs. loud ----\ndrive_quiet <- function() {\n  getOption(\"googledrive_quiet\", default = NA)\n}\n\n#' @rdname googledrive-configuration\n#' @param env The environment to use for scoping\n#' @section Messages:\n#'\n#' The `googledrive_quiet` option can be used to suppress messages from\n#' googledrive. By default, googledrive always messages, i.e. it is *not*\n#' quiet.\n#'\n#' Set `googledrive_quiet` to `TRUE` to suppress messages, by one of these\n#' means, in order of decreasing scope:\n#' * Put `options(googledrive_quiet = TRUE)` in a start-up file, such as\n#'   `.Rprofile`, or at the top of your R script\n#' * Use `local_drive_quiet()` to silence googledrive in a specific scope\n#'   ```\n#'   foo <- function() {\n#'     ...\n#'     local_drive_quiet()\n#'     drive_this(...)\n#'     drive_that(...)\n#'     ...\n#'   }\n#' * Use `with_drive_quiet()` to run a small bit of code silently\n#'   ```\n#'   with_drive_quiet(\n#'     drive_something(...)\n#'   )\n#'   ```\n#'\n#' `local_drive_quiet()` and `with_drive_quiet()` follow the conventions of the\n#' the withr package (<https://withr.r-lib.org>).\n#'\n#' @export\n\n#' @examplesIf drive_has_token()\n#' # message: \"Created Drive file\"\n#' (x <- drive_create(\"drive-quiet-demo\", type = \"document\"))\n#'\n#' # message: \"File updated\"\n#' x <- drive_update(x, starred = TRUE)\n#' drive_reveal(x, \"starred\")\n#'\n#' # suppress messages for a small amount of code\n#' with_drive_quiet(\n#'   x <- drive_update(x, name = \"drive-quiet-works\")\n#' )\n#' x$name\n#'\n#' # message: \"File updated\"\n#' x <- drive_update(x, media = drive_example_local(\"chicken.txt\"))\n#'\n#' # suppress messages within a specific scope, e.g. function\n#' unstar <- function(y) {\n#'   local_drive_quiet()\n#'   drive_update(y, starred = FALSE)\n#' }\n#' x <- unstar(x)\n#' drive_reveal(x, \"starred\")\n#'\n#' # Clean up\n#' drive_rm(x)\nlocal_drive_quiet <- function(env = parent.frame()) {\n  withr::local_options(list(googledrive_quiet = TRUE), .local_envir = env)\n}\n\nlocal_drive_loud <- function(env = parent.frame()) {\n  withr::local_options(list(googledrive_quiet = FALSE), .local_envir = env)\n}\n\n# keeps wrapping from wreaking havoc on snapshot tests, esp. when I have to\n# find and replace volatile bits of text\nlocal_drive_loud_and_wide <- function(cli.width = 150, env = parent.frame()) {\n  withr::local_options(\n    list(\n      googledrive_quiet = FALSE,\n      cli.width = cli.width\n    ),\n    .local_envir = env\n  )\n}\n\n#' @rdname googledrive-configuration\n#' @param code Code to execute quietly\n#' @export\nwith_drive_quiet <- function(code) {\n  withr::with_options(list(googledrive_quiet = TRUE), code = code)\n}\n\nwith_drive_loud <- function(code) {\n  withr::with_options(list(googledrive_quiet = FALSE), code = code)\n}\n\nis_testing <- function() {\n  identical(Sys.getenv(\"TESTTHAT\"), \"true\")\n}\n\n# dealing with how we've communicated in the past ---\n\nsq <- function(x) glue::single_quote(x)\nbt <- function(x) glue::backtick(x)\n\nmessage <- function(...) {\n  drive_abort(\n    \"\n    Internal error: use the UI functions in {.pkg googledrive} \\\\\n    instead of {.fun message}\"\n  )\n}\n\nwarn_for_verbose <- function(\n  verbose = TRUE,\n  env = caller_env(),\n  user_env = caller_env(2)\n) {\n  # This function is not meant to be called directly, so don't worry about its\n  # default of `verbose = TRUE`.\n  # In authentic, indirect usage of this helper, this picks up on whether\n  # `verbose` was present in the **user's** call to the calling function.\n  if (!lifecycle::is_present(verbose) || isTRUE(verbose)) {\n    return(invisible())\n  }\n\n  fc <- frame_call(env)\n  caller <- if (is.null(fc)) NULL else call_name(fc)\n  if (is.null(caller)) {\n    what = I(\"The `verbose` argument\")\n  } else {\n    what = glue(\"{caller}(verbose)\")\n  }\n\n  lifecycle::deprecate_warn(\n    when = \"2.0.0\",\n    what = what,\n    details = c(\n      \"Set `options(googledrive_quiet = TRUE)` to suppress all googledrive messages.\",\n      \"For finer control, use `local_drive_quiet()` or `with_drive_quiet()`.\",\n      \"googledrive's `verbose` argument will be removed in the future.\"\n    ),\n    user_env = user_env,\n    always = identical(env, global_env()),\n    id = \"googledrive_verbose\"\n  )\n  # only set the option during authentic, indirect usage\n  if (!identical(env, global_env())) {\n    local_drive_quiet(env = env)\n  }\n  invisible()\n}\n"
  },
  {
    "path": "R/utils.R",
    "content": "isFALSE <- function(x) identical(x, FALSE)\n\nis_toggle <- function(x) length(x) == 1L && is.logical(x)\n\nlast <- function(x) pluck(x, length(x))\n\nescape_regex <- function(x) {\n  chars <- c(\n    \"*\",\n    \".\",\n    \"?\",\n    \"^\",\n    \"+\",\n    \"$\",\n    \"|\",\n    \"(\",\n    \")\",\n    \"[\",\n    \"]\",\n    \"{\",\n    \"}\",\n    \"\\\\\"\n  )\n  gsub(\n    paste0(\"([\\\\\", paste0(collapse = \"\\\\\", chars), \"])\"),\n    \"\\\\\\\\\\\\1\",\n    x,\n    perl = TRUE\n  )\n}\n\n## put a column into a tibble in the REST sense: \"create or update\"\n## tibble::add_column() except\n##   1. can only add 1 column\n##   2. if column by this name already exists, overwrite it in place\n##   3. provide `nm` and `val` separately\nput_column <- function(.data, nm, val, .before = NULL, .after = NULL) {\n  if (nm %in% names(.data)) {\n    .data[[nm]] <- val\n    .data\n  } else {\n    tibble::add_column(.data, !!nm := val, .before = .before, .after = .after)\n  }\n}\n\n## vectorized isTRUE()\nis_true <- function(x) vapply(x, isTRUE, logical(1))\n\n#' An expose object\n#'\n#' `expose()` returns a sentinel object, similar in spirit to `NULL`, that tells\n#' the calling function to return its internal data structure. googledrive\n#' stores a lot of information about the Drive API, MIME types, etc., internally\n#' and then exploits it in helper functions, like [`drive_mime_type()`],\n#' [`drive_fields()`], [`drive_endpoints()`], etc. We use these objects to\n#' provide nice defaults, check input validity, or lookup something cryptic,\n#' like MIME type, based on something friendlier, like a file extension. Pass\n#' `expose()` to such a function if you want to inspect its internal object, in\n#' its full glory. This is inspired by the `waiver()` object in ggplot2.\n#'\n#' @export\n#' @keywords internal\n#' @examples\n#' drive_mime_type(expose())\n#' drive_fields(expose())\nexpose <- function() structure(list(), class = \"expose\")\n\nis_expose <- function(x) inherits(x, \"expose\")\n\n## partition a parameter list into two parts, using names to identify\n## components destined for the second part\n## example input:\n# partition_params(\n#   list(a = \"a\", b = \"b\", c = \"c\", d = \"d\"),\n#   c(\"b\", \"c\")\n# )\n## example output:\n# list(\n#   unmatched = list(a = \"a\", d = \"d\"),\n#   matched = list(b = \"b\", c = \"c\")\n# )\npartition_params <- function(input, nms_to_match) {\n  out <- list(\n    unmatched = input,\n    matched = list()\n  )\n  if (length(nms_to_match) && length(input)) {\n    m <- names(out$unmatched) %in% nms_to_match\n    out$matched <- out$unmatched[m]\n    out$unmatched <- out$unmatched[!m]\n  }\n  out\n}\n"
  },
  {
    "path": "R/zzz.R",
    "content": ".onLoad <- function(libname, pkgname) {\n  # .auth is created in R/drive_auth.R\n  # this is to insure we get an instance of gargle's AuthState using the\n  # current, locally installed version of gargle\n  utils::assignInMyNamespace(\n    \".auth\",\n    gargle::init_AuthState(package = \"googledrive\", auth_active = TRUE)\n  )\n\n  if (identical(Sys.getenv(\"IN_PKGDOWN\"), \"true\")) {\n    tryCatch(\n      drive_auth_docs(),\n      googledrive_auth_internal_error = function(e) NULL\n    )\n  }\n\n  # in rlang 0.4.10, `is_installed()` doesn't have `version` arg yet\n  if (is_installed(\"dplyr\") && utils::packageVersion(\"dplyr\") >= \"1.0.0\") {\n    s3_register(\n      \"dplyr::dplyr_reconstruct\",\n      \"dribble\",\n      method = dribble_maybe_reconstruct\n    )\n  }\n\n  invisible()\n}\n\nrelease_bullets <- function() {\n  c(\n    '`devtools::build_rmd(\"index.Rmd\")`'\n  )\n}\n"
  },
  {
    "path": "README.Rmd",
    "content": "---\noutput: github_document\n---\n\n<!-- README.md is generated from README.Rmd. Please edit that file -->\n\n\n```{r setup, include = FALSE}\nauth_success <- tryCatch(\n  googledrive:::drive_auth_docs(),\n  googledrive_auth_internal_error = function(e) e\n)\n\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  error = TRUE,\n  purl = googledrive::drive_has_token(),\n  eval = googledrive::drive_has_token()\n)\n```\n\n```{r eval = !googledrive::drive_has_token(), echo = FALSE, comment = NA}\ngoogledrive:::drive_bullets(c(\n  \"Code chunks will not be evaluated, because:\",\n  strsplit(auth_success$message, split = \"\\n\")[[1]]\n))\ngoogledrive::drive_deauth()\n```\n\n# googledrive <a href=\"https://googledrive.tidyverse.org\"><img src=\"man/figures/logo.png\" align=\"right\" height=\"138\" /></a>\n\n<!-- badges: start -->\n[![CRAN status](https://www.r-pkg.org/badges/version/googledrive)](https://CRAN.R-project.org/package=googledrive)\n[![R-CMD-check](https://github.com/tidyverse/googledrive/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/tidyverse/googledrive/actions/workflows/R-CMD-check.yaml)\n[![Codecov test coverage](https://codecov.io/gh/tidyverse/googledrive/graph/badge.svg)](https://app.codecov.io/gh/tidyverse/googledrive)\n<!-- badges: end -->\n\n## Overview\n\ngoogledrive allows you to interact with files on Google Drive from R.\n\n## Installation\n\nInstall the CRAN version:\n\n```{r, eval = FALSE}\ninstall.packages(\"googledrive\")\n```\n\nOr install the development version from GitHub:\n\n```{r, eval = FALSE}\n# install.packages(\"pak\")\npak::pak(\"tidyverse/googledrive\")\n```\n\n## Usage\n\nPlease see the package website: <https://googledrive.tidyverse.org>\n\nHere's a teaser that uses googledrive to view some of the files you see on <https://drive.google.com> (up to `n_max = 25`, in this case):\n\n```{r}\nlibrary(\"googledrive\")\ndrive_find(n_max = 25)\n```\n\n## Contributing\n\nIf you'd like to contribute to the development of googledrive, please read [these guidelines](https://googledrive.tidyverse.org/CONTRIBUTING.html).\n\nPlease note that the googledrive project is released with a [Contributor Code of Conduct](https://googledrive.tidyverse.org/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms.\n\n## Privacy\n\n[Privacy policy](https://www.tidyverse.org/google_privacy_policy)\n"
  },
  {
    "path": "README.md",
    "content": "\n<!-- README.md is generated from README.Rmd. Please edit that file -->\n\n# googledrive <a href=\"https://googledrive.tidyverse.org\"><img src=\"man/figures/logo.png\" align=\"right\" height=\"138\" /></a>\n\n<!-- badges: start -->\n\n[![CRAN\nstatus](https://www.r-pkg.org/badges/version/googledrive)](https://CRAN.R-project.org/package=googledrive)\n[![R-CMD-check](https://github.com/tidyverse/googledrive/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/tidyverse/googledrive/actions/workflows/R-CMD-check.yaml)\n[![Codecov test\ncoverage](https://codecov.io/gh/tidyverse/googledrive/graph/badge.svg)](https://app.codecov.io/gh/tidyverse/googledrive)\n<!-- badges: end -->\n\n## Overview\n\ngoogledrive allows you to interact with files on Google Drive from R.\n\n## Installation\n\nInstall the CRAN version:\n\n``` r\ninstall.packages(\"googledrive\")\n```\n\nOr install the development version from GitHub:\n\n``` r\n# install.packages(\"pak\")\npak::pak(\"tidyverse/googledrive\")\n```\n\n## Usage\n\nPlease see the package website: <https://googledrive.tidyverse.org>\n\nHere’s a teaser that uses googledrive to view some of the files you see\non <https://drive.google.com> (up to `n_max = 25`, in this case):\n\n``` r\nlibrary(\"googledrive\")\ndrive_find(n_max = 25)\n#> # A dribble: 25 × 3\n#>    name                       id                                drive_resource\n#>    <chr>                      <drv_id>                          <list>        \n#>  1 chicken_poem.txt           1lAxO_zr06v6pL6dyQJ9duwH1j2ztQ3lB <named list>  \n#>  2 2021-09-16_r_logo.jpg      1dandXB0QZpjeGQq_56wTXKNwaqgsOa9D <named list>  \n#>  3 2021-09-16_r_about.html    1XfCI_orH4oNUZh06C4w6vXtno-BT_zmZ <named list>  \n#>  4 2021-09-16_imdb_latin1.csv 163YPvqYmGuqQiEwEFLg2s1URq4EnpkBw <named list>  \n#>  5 2021-09-16_chicken.txt     1axJz8GSmecSnaYBx0Sb3Gb-SXVaTzKw7 <named list>  \n#>  6 2021-09-16_chicken.pdf     14Hd6_VQAeEgcwBBJamc-FUlnXhp117T2 <named list>  \n#>  7 2021-09-16_chicken.jpg     1aslW1T-B8UKzAEotDWpmRFaMyMux5-it <named list>  \n#>  8 2021-09-16_chicken.csv     1Mj--zJYZJSMKsNVjk2tYFef5LnCsNoDT <named list>  \n#>  9 pqr                        143iq-CswFTwJTjVfKkcFMDW0jYqDeUj2 <named list>  \n#> 10 mno                        1gcUTnFbsF6uioJrLCsVQ78_F1wEzyNtI <named list>  \n#> # ℹ 15 more rows\n```\n\n## Contributing\n\nIf you’d like to contribute to the development of googledrive, please\nread [these\nguidelines](https://googledrive.tidyverse.org/CONTRIBUTING.html).\n\nPlease note that the googledrive project is released with a [Contributor\nCode of\nConduct](https://googledrive.tidyverse.org/CODE_OF_CONDUCT.html). By\ncontributing to this project, you agree to abide by its terms.\n\n## Privacy\n\n[Privacy policy](https://www.tidyverse.org/google_privacy_policy)\n"
  },
  {
    "path": "_pkgdown.yml",
    "content": "url: https://googledrive.tidyverse.org\n\ndevelopment:\n  mode: auto\n\ntemplate:\n  package: tidytemplate\n  bootstrap: 5\n\n  includes:\n    in_header: |\n      <!-- Privacy-friendly analytics by Plausible -->\n      <script async src=\"https://plausible.io/js/pa-qqzH9EITRTKkhlMOvLy7c.js\"></script>\n      <script>\n        window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};\n        plausible.init()\n      </script>\n\nnews:\n  releases:\n    - text: \"Version 2.0.0\"\n      href: https://www.tidyverse.org/blog/2021/07/googledrive-2-0-0/\n    - text: \"Version 1.0.0\"\n      href: https://www.tidyverse.org/blog/2019/08/googledrive-1-0-0/\n\narticles:\n  - title: Common tasks\n    navbar: ~\n    contents:\n    - googledrive\n    - articles/file-identification\n    - articles/multiple-files\n    - articles/permissions\n\n  - title: Package configuration\n    navbar: Package configuration\n    contents:\n    - articles/bring-your-own-client\n\n  - title: Developer\n    desc: Articles documenting internal matters\n    contents:\n    - articles/example-files\n    - articles/messages-and-errors\n\nreference:\n  - title: \"Reach out and touch your files\"\n    desc: >\n      Retrieve metadata on your Drive files so you can act on them\n    contents:\n      - drive_find\n      - drive_ls\n      - drive_get\n      - drive_reveal\n      - drive_browse\n      - starts_with(\"drive_read\")\n  - title: \"File creation and deletion\"\n    desc: >\n      Create or delete Drive files and folders\n    contents:\n      - drive_upload\n      - drive_put\n      - drive_download\n      - drive_create\n      - drive_mkdir\n      - drive_cp\n      - drive_mv\n      - drive_rename\n      - drive_update\n      - drive_trash\n      - drive_empty_trash\n      - drive_rm\n      - starts_with(\"drive_example\")\n  - title: \"Share your files with the world\"\n    desc: >\n      View or change the sharing and publishing status of Drive files\n    contents:\n      - drive_publish\n      - drive_unpublish\n      - drive_share\n      - drive_reveal\n      - drive_link\n  - title: \"Shared drives\"\n    desc: >\n      Manipulate and explore shared drives\n    contents:\n      - matches(\"shared_drive\")\n  - title: \"Shortcuts\"\n    desc: >\n      Similar to local file shortcuts, aliases, or symbolic links\n    contents:\n      - matches(\"shortcut\")\n  - title: \"Dribble object\"\n    desc: >\n      Metadata about Drive files is stored in a \"Drive tibble\" a.k.a. a dribble\n    contents:\n      - dribble\n      - as_dribble\n      - drive_reveal\n      - as_id\n      - dribble-checks\n  - title: \"Authorization\"\n    desc: >\n      Take explicit control of the Google auth status or examine current state\n    contents:\n      - drive_user\n      - drive_about\n      - drive_auth\n      - drive_deauth\n      - drive_auth_configure\n      - drive_scopes\n  - title: \"Drive API spec\"\n    desc: >\n      Summon info about or check input against the Drive API spec\n    contents:\n      - starts_with(\"drive_endpoint\")\n      - drive_extension\n      - drive_fields\n      - drive_mime_type\n      - expose\n  - title: \"Programming around the Drive API\"\n    desc: >\n      Low-level functions used internally and made available for programming\n    contents:\n      - request_generate\n      - request_make\n      - do_request\n      - do_paginated_request\n      - drive_api_key\n      - drive_token\n      - drive_has_token\n  - title: \"Package-level configuration\"\n    contents:\n      - googledrive-configuration\n"
  },
  {
    "path": "air.toml",
    "content": ""
  },
  {
    "path": "codecov.yml",
    "content": "comment: false\n\ncoverage:\n  status:\n    project:\n      default:\n        target: auto\n        threshold: 1%\n        informational: true\n    patch:\n      default:\n        target: auto\n        threshold: 1%\n        informational: true\n"
  },
  {
    "path": "cran-comments.md",
    "content": "## revdepcheck results\n\nWe checked 23 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package.\n\n * We saw 0 new problems\n * We failed to check 0 packages\n"
  },
  {
    "path": "data-raw/discovery-doc-ingest.R",
    "content": "library(tidyverse)\n\nsource(\n  system.file(\"discovery-doc-ingest\", \"ingest-functions.R\", package = \"gargle\")\n)\n\ndownload_discovery_document(\"drive:v3\")\n# you can try to do some diffing here, but I haven't had much success with this\n# currently am comparing a 2021 disc doc to 2025 and there are 632 diffs\n# just YOLOing now\n\nexisting <- list_discovery_documents(\"drive\")\nif (length(existing) > 1) {\n  rlang::warn(\"MULTIPLE DISCOVERY DOCUMENTS FOUND. FIX THIS!\")\n}\n\nif (length(existing) < 1) {\n  rlang::inform(\"Downloading Discovery Document\")\n  x <- download_discovery_document(\"drive:v3\")\n} else {\n  msg <- glue::glue(\n    \"\n    Using existing Discovery Document:\n      * {existing}\n    \"\n  )\n  rlang::inform(msg)\n  x <- here::here(\"data-raw\", existing)\n}\n\ndd <- read_discovery_document(x)\n\nmethods <- get_raw_methods(dd)\n\nmethods <- methods |> map(groom_properties, dd)\nmethods <- methods |> map(add_schema_params, dd)\nmethods <- methods |> map(add_global_params, dd)\n\n## duplicate two methods to create a companion for media\n## simpler to do this here, in data, than in wrapper functions\nmediafy <- function(target_id, methods) {\n  new <- target_method <- methods[[target_id]]\n\n  new$id <- paste0(target_id, \".media\")\n  new$path <-\n    pluck(target_method, \"mediaUpload\", \"protocols\", \"simple\", \"path\")\n  new$parameters <- c(\n    new$parameters,\n    uploadType = list(list(\n      type = \"string\",\n      required = TRUE,\n      location = \"query\"\n    ))\n  )\n\n  methods[[new$id]] <- new\n  methods\n}\n\nmethods <- mediafy(\"drive.files.update\", methods)\nmethods <- mediafy(\"drive.files.create\", methods)\n\n.endpoints <- methods\nattr(.endpoints, \"base_url\") <- dd$rootUrl\n# View(.endpoints)\n\nusethis::use_data(.endpoints, internal = TRUE, overwrite = TRUE)\n"
  },
  {
    "path": "data-raw/drive-examples-create.R",
    "content": "library(here)\nlibrary(glue)\nlibrary(googledrive)\nlibrary(tidyverse)\n\n# auth with the special-purpose service account\nfilename <- glue(\"~/.R/gargle/googledrive-file-keeper.json\")\ndrive_auth(path = filename)\ndrive_user()\n\n# files that are the pre-existing local example files\nx <- drive_upload(drive_example_local(\"chicken.csv\"))\ndrive_share_anyone(x)\n\nx <- drive_upload(drive_example_local(\"chicken.jpg\"))\ndrive_share_anyone(x)\n\nx <- drive_upload(drive_example_local(\"chicken.pdf\"))\ndrive_share_anyone(x)\n\nx <- drive_upload(drive_example_local(\"chicken.txt\"))\ndrive_share_anyone(x)\n\n# added June 2021; originally from\n# https://matthew-brett.github.io/cfd2019/data/imdblet_latin.csv\",\nx <- drive_upload(drive_example_local(\"imdb_latin1.csv\"))\ndrive_share_anyone(x)\n\n# added June 2021; ships with R\n# https://stat.ethz.ch/R-manual/R-patched/doc/html/logo.jpg\n# r_logo_path <- R.home(\"doc/html/logo.jpg\")\n# file.copy(r_logo_path, here(\"inst\", \"extdata\", \"example_files\", \"r_logo.jpg\"))\nx <- drive_upload(drive_example_local(\"r_logo.jpg\"))\ndrive_share_anyone(x)\n\n# added June 2021; ships with R\n# https://stat.ethz.ch/R-manual/R-patched/doc/html/about.html\n# r_about_path <- R.home(\"doc/html/about.html\")\n# file.copy(r_about_path, here(\"inst\", \"extdata\", \"example_files\", \"r_about.html\"))\nx <- drive_upload(drive_example_local(\"r_about.html\"))\ndrive_share_anyone(x)\n\n# export 2 local examples for native Google file types\nx <- drive_upload(\n  drive_example_local(\"chicken.txt\"),\n  type = \"document\",\n  name = \"chicken_doc\"\n)\ndrive_share_anyone(x)\n\nx <- drive_upload(\n  drive_example_local(\"chicken.csv\"),\n  type = \"spreadsheet\",\n  name = \"chicken_sheet\"\n)\ndrive_share_anyone(x)\n\n# files I played with when writing drive_read_string() and drive_read_raw()\n# but, so far, have no included\n# curl::curl_download(\"https://httpbin.org/html\", destfile = tfile)\n# curl::curl_download(\"https://httpbin.org/xml\", destfile = tfile)\n# curl::curl_download(\"https://httpbin.org/json\", destfile = tfile)\n"
  },
  {
    "path": "data-raw/drive-examples-inventory.R",
    "content": "# given the files owned by the googledrive-file-keeper service account,\n# create/update an inventory file consulted by drive_examples_remote()\n\nlibrary(here)\nlibrary(glue)\nlibrary(googledrive)\nlibrary(tidyverse)\n\n# auth with the special-purpose service account\nfilename <- glue(\"~/.R/gargle/googledrive-file-keeper.json\")\ndrive_auth(path = filename)\n# user should be googledrive-file-keeper\ndrive_user()\n\n# exclude the inventory file ... too meta!\ndat <- drive_find(q = \"not name contains 'drive_examples_remote'\")\n\nif (anyDuplicated(dat$name)) {\n  stop(\"Duplicated file names! You are making a huge mistake.\")\n}\n\ndat <- dat |>\n  drive_reveal(\"mime_type\") |>\n  select(name, mime_type, id) |>\n  arrange(name, mime_type)\n\n# record in local csv, because the visibility afforded by a plain old csv file\n# is useful to me, e.g. easy to see change over time\nwrite_csv(\n  dat,\n  file = here(\"inst\", \"extdata\", \"data\", \"remote_example_files.csv\")\n)\n\n# keep just (name, id) for the official lookup Sheet\ndat2 <- dat |>\n  select(name, id)\ndat2\n\n# PUT into official inventory csv\nx <- tempfile(fileext = \".csv\")\nwrite_csv(dat2, file = x)\n\ny <- drive_put(x, \"drive_examples_remote.csv\")\ndrive_share_anyone(y)\n# drive_browse(y)\nas_id(y)\n# \"1XiwJJdoqoZ876OoSTjsnBZ5SxxUg6gUC\"\n"
  },
  {
    "path": "data-raw/drive-v3_2025-08-29.json",
    "content": "{\n  \"icons\": {\n    \"x16\": \"http://www.google.com/images/icons/product/search-16.gif\",\n    \"x32\": \"http://www.google.com/images/icons/product/search-32.gif\"\n  },\n  \"description\": \"The Google Drive API allows clients to access resources from Google Drive.\",\n  \"baseUrl\": \"https://www.googleapis.com/drive/v3/\",\n  \"mtlsRootUrl\": \"https://www.mtls.googleapis.com/\",\n  \"discoveryVersion\": \"v1\",\n  \"resources\": {\n    \"operations\": {\n      \"methods\": {\n        \"get\": {\n          \"id\": \"drive.operations.get\",\n          \"path\": \"operations/{name}\",\n          \"flatPath\": \"operations/{name}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"name\": {\n              \"description\": \"The name of the operation resource.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"name\"\n          ],\n          \"response\": {\n            \"$ref\": \"Operation\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Gets the latest state of a long-running operation. Clients can use this method to poll the operation result at intervals as recommended by the API service.\"\n        }\n      }\n    },\n    \"about\": {\n      \"methods\": {\n        \"get\": {\n          \"id\": \"drive.about.get\",\n          \"path\": \"about\",\n          \"flatPath\": \"about\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {},\n          \"parameterOrder\": [],\n          \"response\": {\n            \"$ref\": \"About\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Gets information about the user, the user's Drive, and system capabilities. For more information, see [Return user info](https://developers.google.com/workspace/drive/api/guides/user-info). Required: The `fields` parameter must be set. To return the exact fields you need, see [Return specific fields](https://developers.google.com/workspace/drive/api/guides/fields-parameter).\"\n        }\n      }\n    },\n    \"apps\": {\n      \"methods\": {\n        \"get\": {\n          \"id\": \"drive.apps.get\",\n          \"path\": \"apps/{appId}\",\n          \"flatPath\": \"apps/{appId}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"appId\": {\n              \"description\": \"The ID of the app.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"appId\"\n          ],\n          \"response\": {\n            \"$ref\": \"App\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.apps.readonly\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Gets a specific app. For more information, see [Return user info](https://developers.google.com/workspace/drive/api/guides/user-info).\"\n        },\n        \"list\": {\n          \"id\": \"drive.apps.list\",\n          \"path\": \"apps\",\n          \"flatPath\": \"apps\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"appFilterExtensions\": {\n              \"description\": \"A comma-separated list of file extensions to limit returned results. All results within the given app query scope which can open any of the given file extensions are included in the response. If `appFilterMimeTypes` are provided as well, the result is a union of the two resulting app lists.\",\n              \"default\": \"\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"appFilterMimeTypes\": {\n              \"description\": \"A comma-separated list of file extensions to limit returned results. All results within the given app query scope which can open any of the given MIME types will be included in the response. If `appFilterExtensions` are provided as well, the result is a union of the two resulting app lists.\",\n              \"default\": \"\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"languageCode\": {\n              \"description\": \"A language or locale code, as defined by BCP 47, with some extensions from Unicode's LDML format (http://www.unicode.org/reports/tr35/).\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [],\n          \"response\": {\n            \"$ref\": \"AppList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive.apps.readonly\"\n          ],\n          \"description\": \"Lists a user's installed apps. For more information, see [Return user info](https://developers.google.com/workspace/drive/api/guides/user-info).\"\n        }\n      }\n    },\n    \"changes\": {\n      \"methods\": {\n        \"getStartPageToken\": {\n          \"id\": \"drive.changes.getStartPageToken\",\n          \"path\": \"changes/startPageToken\",\n          \"flatPath\": \"changes/startPageToken\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"driveId\": {\n              \"description\": \"The ID of the shared drive for which the starting pageToken for listing future changes from that shared drive will be returned.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"teamDriveId\": {\n              \"description\": \"Deprecated: Use `driveId` instead.\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [],\n          \"response\": {\n            \"$ref\": \"StartPageToken\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Gets the starting pageToken for listing future changes. For more information, see [Retrieve changes](https://developers.google.com/workspace/drive/api/guides/manage-changes).\"\n        },\n        \"list\": {\n          \"id\": \"drive.changes.list\",\n          \"path\": \"changes\",\n          \"flatPath\": \"changes\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"driveId\": {\n              \"description\": \"The shared drive from which changes will be returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeCorpusRemovals\": {\n              \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includeItemsFromAllDrives\": {\n              \"description\": \"Whether both My Drive and shared drive items should be included in results.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includeRemoved\": {\n              \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n              \"default\": \"true\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includeTeamDriveItems\": {\n              \"description\": \"Deprecated: Use `includeItemsFromAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"pageSize\": {\n              \"description\": \"The maximum number of changes to return per page.\",\n              \"default\": \"100\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n              \"location\": \"query\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"restrictToMyDrive\": {\n              \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"spaces\": {\n              \"description\": \"A comma-separated list of spaces to query within the corpora. Supported values are 'drive' and 'appDataFolder'.\",\n              \"default\": \"drive\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"teamDriveId\": {\n              \"description\": \"Deprecated: Use `driveId` instead.\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"string\"\n            },\n            \"includePermissionsForView\": {\n              \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeLabels\": {\n              \"description\": \"A comma-separated list of IDs of labels to include in the `labelInfo` part of the response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"pageToken\"\n          ],\n          \"supportsSubscription\": true,\n          \"response\": {\n            \"$ref\": \"ChangeList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Lists the changes for a user or shared drive. For more information, see [Retrieve changes](https://developers.google.com/workspace/drive/api/guides/manage-changes).\"\n        },\n        \"watch\": {\n          \"id\": \"drive.changes.watch\",\n          \"path\": \"changes/watch\",\n          \"flatPath\": \"changes/watch\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"driveId\": {\n              \"description\": \"The shared drive from which changes will be returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeCorpusRemovals\": {\n              \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includeItemsFromAllDrives\": {\n              \"description\": \"Whether both My Drive and shared drive items should be included in results.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includeRemoved\": {\n              \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n              \"default\": \"true\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includeTeamDriveItems\": {\n              \"description\": \"Deprecated: Use `includeItemsFromAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"pageSize\": {\n              \"description\": \"The maximum number of changes to return per page.\",\n              \"default\": \"100\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n              \"location\": \"query\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"restrictToMyDrive\": {\n              \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"spaces\": {\n              \"description\": \"A comma-separated list of spaces to query within the corpora. Supported values are 'drive' and 'appDataFolder'.\",\n              \"default\": \"drive\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"teamDriveId\": {\n              \"description\": \"Deprecated: Use `driveId` instead.\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"string\"\n            },\n            \"includePermissionsForView\": {\n              \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeLabels\": {\n              \"description\": \"A comma-separated list of IDs of labels to include in the `labelInfo` part of the response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"pageToken\"\n          ],\n          \"supportsSubscription\": true,\n          \"request\": {\n            \"parameterName\": \"resource\",\n            \"$ref\": \"Channel\"\n          },\n          \"response\": {\n            \"$ref\": \"Channel\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Subscribes to changes for a user. For more information, see [Notifications for resource changes](https://developers.google.com/workspace/drive/api/guides/push).\"\n        }\n      }\n    },\n    \"channels\": {\n      \"methods\": {\n        \"stop\": {\n          \"id\": \"drive.channels.stop\",\n          \"path\": \"channels/stop\",\n          \"flatPath\": \"channels/stop\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {},\n          \"parameterOrder\": [],\n          \"request\": {\n            \"parameterName\": \"resource\",\n            \"$ref\": \"Channel\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Stops watching resources through this channel. For more information, see [Notifications for resource changes](https://developers.google.com/workspace/drive/api/guides/push).\"\n        }\n      }\n    },\n    \"comments\": {\n      \"methods\": {\n        \"create\": {\n          \"id\": \"drive.comments.create\",\n          \"path\": \"files/{fileId}/comments\",\n          \"flatPath\": \"files/{fileId}/comments\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"request\": {\n            \"$ref\": \"Comment\"\n          },\n          \"response\": {\n            \"$ref\": \"Comment\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Creates a comment on a file. For more information, see [Manage comments and replies](https://developers.google.com/workspace/drive/api/guides/manage-comments). Required: The `fields` parameter must be set. To return the exact fields you need, see [Return specific fields](https://developers.google.com/workspace/drive/api/guides/fields-parameter).\"\n        },\n        \"delete\": {\n          \"id\": \"drive.comments.delete\",\n          \"path\": \"files/{fileId}/comments/{commentId}\",\n          \"flatPath\": \"files/{fileId}/comments/{commentId}\",\n          \"httpMethod\": \"DELETE\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"commentId\": {\n              \"description\": \"The ID of the comment.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n          ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Deletes a comment. For more information, see [Manage comments and replies](https://developers.google.com/workspace/drive/api/guides/manage-comments).\"\n        },\n        \"get\": {\n          \"id\": \"drive.comments.get\",\n          \"path\": \"files/{fileId}/comments/{commentId}\",\n          \"flatPath\": \"files/{fileId}/comments/{commentId}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"commentId\": {\n              \"description\": \"The ID of the comment.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"includeDeleted\": {\n              \"description\": \"Whether to return deleted comments. Deleted comments will not include their original content.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n          ],\n          \"response\": {\n            \"$ref\": \"Comment\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Gets a comment by ID. For more information, see [Manage comments and replies](https://developers.google.com/workspace/drive/api/guides/manage-comments). Required: The `fields` parameter must be set. To return the exact fields you need, see [Return specific fields](https://developers.google.com/workspace/drive/api/guides/fields-parameter).\"\n        },\n        \"list\": {\n          \"id\": \"drive.comments.list\",\n          \"path\": \"files/{fileId}/comments\",\n          \"flatPath\": \"files/{fileId}/comments\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"includeDeleted\": {\n              \"description\": \"Whether to include deleted comments. Deleted comments will not include their original content.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"pageSize\": {\n              \"description\": \"The maximum number of comments to return per page.\",\n              \"default\": \"20\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"startModifiedTime\": {\n              \"description\": \"The minimum value of 'modifiedTime' for the result comments (RFC 3339 date-time).\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"response\": {\n            \"$ref\": \"CommentList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Lists a file's comments. For more information, see [Manage comments and replies](https://developers.google.com/workspace/drive/api/guides/manage-comments). Required: The `fields` parameter must be set. To return the exact fields you need, see [Return specific fields](https://developers.google.com/workspace/drive/api/guides/fields-parameter).\"\n        },\n        \"update\": {\n          \"id\": \"drive.comments.update\",\n          \"path\": \"files/{fileId}/comments/{commentId}\",\n          \"flatPath\": \"files/{fileId}/comments/{commentId}\",\n          \"httpMethod\": \"PATCH\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"commentId\": {\n              \"description\": \"The ID of the comment.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n          ],\n          \"request\": {\n            \"$ref\": \"Comment\"\n          },\n          \"response\": {\n            \"$ref\": \"Comment\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Updates a comment with patch semantics. For more information, see [Manage comments and replies](https://developers.google.com/workspace/drive/api/guides/manage-comments). Required: The `fields` parameter must be set. To return the exact fields you need, see [Return specific fields](https://developers.google.com/workspace/drive/api/guides/fields-parameter).\"\n        }\n      }\n    },\n    \"drives\": {\n      \"methods\": {\n        \"create\": {\n          \"id\": \"drive.drives.create\",\n          \"path\": \"drives\",\n          \"flatPath\": \"drives\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"requestId\": {\n              \"description\": \"Required. An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a shared drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same shared drive. If the shared drive already exists a 409 error will be returned.\",\n              \"location\": \"query\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"requestId\"\n          ],\n          \"request\": {\n            \"$ref\": \"Drive\"\n          },\n          \"response\": {\n            \"$ref\": \"Drive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n          ],\n          \"description\": \"Creates a shared drive. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).\"\n        },\n        \"delete\": {\n          \"id\": \"drive.drives.delete\",\n          \"path\": \"drives/{driveId}\",\n          \"flatPath\": \"drives/{driveId}\",\n          \"httpMethod\": \"DELETE\",\n          \"parameters\": {\n            \"driveId\": {\n              \"description\": \"The ID of the shared drive.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"allowItemDeletion\": {\n              \"description\": \"Whether any items inside the shared drive should also be deleted. This option is only supported when `useDomainAdminAccess` is also set to `true`.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"driveId\"\n          ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n          ],\n          \"description\": \"Permanently deletes a shared drive for which the user is an `organizer`. The shared drive cannot contain any untrashed items. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).\"\n        },\n        \"get\": {\n          \"id\": \"drive.drives.get\",\n          \"path\": \"drives/{driveId}\",\n          \"flatPath\": \"drives/{driveId}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"driveId\": {\n              \"description\": \"The ID of the shared drive.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"driveId\"\n          ],\n          \"response\": {\n            \"$ref\": \"Drive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Gets a shared drive's metadata by ID. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).\"\n        },\n        \"hide\": {\n          \"id\": \"drive.drives.hide\",\n          \"path\": \"drives/{driveId}/hide\",\n          \"flatPath\": \"drives/{driveId}/hide\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"driveId\": {\n              \"description\": \"The ID of the shared drive.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"driveId\"\n          ],\n          \"response\": {\n            \"$ref\": \"Drive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n          ],\n          \"description\": \"Hides a shared drive from the default view. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).\"\n        },\n        \"list\": {\n          \"id\": \"drive.drives.list\",\n          \"path\": \"drives\",\n          \"flatPath\": \"drives\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"pageSize\": {\n              \"description\": \"Maximum number of shared drives to return per page.\",\n              \"default\": \"10\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"Page token for shared drives.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Query string for searching shared drives.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then all shared drives of the domain in which the requester is an administrator are returned.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [],\n          \"response\": {\n            \"$ref\": \"DriveList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \" Lists the user's shared drives. This method accepts the `q` parameter, which is a search query combining one or more search terms. For more information, see the [Search for shared drives](/workspace/drive/api/guides/search-shareddrives) guide.\"\n        },\n        \"unhide\": {\n          \"id\": \"drive.drives.unhide\",\n          \"path\": \"drives/{driveId}/unhide\",\n          \"flatPath\": \"drives/{driveId}/unhide\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"driveId\": {\n              \"description\": \"The ID of the shared drive.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"driveId\"\n          ],\n          \"response\": {\n            \"$ref\": \"Drive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n          ],\n          \"description\": \"Restores a shared drive to the default view. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).\"\n        },\n        \"update\": {\n          \"id\": \"drive.drives.update\",\n          \"path\": \"drives/{driveId}\",\n          \"flatPath\": \"drives/{driveId}\",\n          \"httpMethod\": \"PATCH\",\n          \"parameters\": {\n            \"driveId\": {\n              \"description\": \"The ID of the shared drive.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"driveId\"\n          ],\n          \"request\": {\n            \"$ref\": \"Drive\"\n          },\n          \"response\": {\n            \"$ref\": \"Drive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n          ],\n          \"description\": \"Updates the metadata for a shared drive. For more information, see [Manage shared drives](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives).\"\n        }\n      }\n    },\n    \"files\": {\n      \"methods\": {\n        \"copy\": {\n          \"id\": \"drive.files.copy\",\n          \"path\": \"files/{fileId}/copy\",\n          \"flatPath\": \"files/{fileId}/copy\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"enforceSingleParent\": {\n              \"description\": \"Deprecated: Copying files into multiple folders is no longer supported. Use shortcuts instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"ignoreDefaultVisibility\": {\n              \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"keepRevisionForever\": {\n              \"description\": \"Whether to set the `keepForever` field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"ocrLanguage\": {\n              \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"includePermissionsForView\": {\n              \"description\": \"Specifies which additional view's permissions to include in the response. Only `published` is supported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeLabels\": {\n              \"description\": \"A comma-separated list of IDs of labels to include in the `labelInfo` part of the response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"request\": {\n            \"$ref\": \"File\"\n          },\n          \"response\": {\n            \"$ref\": \"File\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\"\n          ],\n          \"description\": \"Creates a copy of a file and applies any requested updates with patch semantics. For more information, see [Create and manage files](https://developers.google.com/workspace/drive/api/guides/create-file).\"\n        },\n        \"create\": {\n          \"id\": \"drive.files.create\",\n          \"path\": \"files\",\n          \"flatPath\": \"files\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"enforceSingleParent\": {\n              \"description\": \"Deprecated: Creating files in multiple folders is no longer supported.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"ignoreDefaultVisibility\": {\n              \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"keepRevisionForever\": {\n              \"description\": \"Whether to set the `keepForever` field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"ocrLanguage\": {\n              \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"useContentAsIndexableText\": {\n              \"description\": \"Whether to use the uploaded content as indexable text.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includePermissionsForView\": {\n              \"description\": \"Specifies which additional view's permissions to include in the response. Only `published` is supported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeLabels\": {\n              \"description\": \"A comma-separated list of IDs of labels to include in the `labelInfo` part of the response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [],\n          \"supportsMediaUpload\": true,\n          \"mediaUpload\": {\n            \"accept\": [\n              \"*/*\"\n            ],\n            \"maxSize\": \"5497558138880\",\n            \"protocols\": {\n              \"resumable\": {\n                \"multipart\": true,\n                \"path\": \"/resumable/upload/drive/v3/files\"\n              },\n              \"simple\": {\n                \"multipart\": true,\n                \"path\": \"/upload/drive/v3/files\"\n              }\n            }\n          },\n          \"request\": {\n            \"$ref\": \"File\"\n          },\n          \"response\": {\n            \"$ref\": \"File\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \" Creates a file. For more information, see [Create and manage files](/workspace/drive/api/guides/create-file). This method supports an */upload* URI and accepts uploaded media with the following characteristics: - *Maximum file size:* 5,120 GB - *Accepted Media MIME types:* `*/*` (Specify a valid MIME type, rather than the literal `*/*` value. The literal `*/*` is only used to indicate that any valid MIME type can be uploaded. For more information, see [Google Workspace and Google Drive supported MIME types](/workspace/drive/api/guides/mime-types).) For more information on uploading files, see [Upload file data](/workspace/drive/api/guides/manage-uploads). Apps creating shortcuts with the `create` method must specify the MIME type `application/vnd.google-apps.shortcut`. Apps should specify a file extension in the `name` property when inserting files with the API. For example, an operation to insert a JPEG file should specify something like `\\\"name\\\": \\\"cat.jpg\\\"` in the metadata. Subsequent `GET` requests include the read-only `fileExtension` property populated with the extension originally specified in the `name` property. When a Google Drive user requests to download a file, or when the file is downloaded through the sync client, Drive builds a full filename (with extension) based on the name. In cases where the extension is missing, Drive attempts to determine the extension based on the file's MIME type.\"\n        },\n        \"delete\": {\n          \"id\": \"drive.files.delete\",\n          \"path\": \"files/{fileId}\",\n          \"flatPath\": \"files/{fileId}\",\n          \"httpMethod\": \"DELETE\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"enforceSingleParent\": {\n              \"description\": \"Deprecated: If an item isn't in a shared drive and its last parent is deleted but the item itself isn't, the item will be placed under its owner's root.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Permanently deletes a file owned by the user without moving it to the trash. For more information, see [Trash or delete files and folders](https://developers.google.com/workspace/drive/api/guides/delete). If the file belongs to a shared drive, the user must be an `organizer` on the parent folder. If the target is a folder, all descendants owned by the user are also deleted.\"\n        },\n        \"emptyTrash\": {\n          \"id\": \"drive.files.emptyTrash\",\n          \"path\": \"files/trash\",\n          \"flatPath\": \"files/trash\",\n          \"httpMethod\": \"DELETE\",\n          \"parameters\": {\n            \"enforceSingleParent\": {\n              \"description\": \"Deprecated: If an item isn't in a shared drive and its last parent is deleted but the item itself isn't, the item will be placed under its owner's root.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"driveId\": {\n              \"description\": \"If set, empties the trash of the provided shared drive.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n          ],\n          \"description\": \"Permanently deletes all of the user's trashed files. For more information, see [Trash or delete files and folders](https://developers.google.com/workspace/drive/api/guides/delete).\"\n        },\n        \"export\": {\n          \"id\": \"drive.files.export\",\n          \"path\": \"files/{fileId}/export\",\n          \"flatPath\": \"files/{fileId}/export\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"mimeType\": {\n              \"description\": \"Required. The MIME type of the format requested for this export. For a list of supported MIME types, see [Export MIME types for Google Workspace documents](/workspace/drive/api/guides/ref-export-formats).\",\n              \"location\": \"query\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"mimeType\"\n          ],\n          \"supportsMediaDownload\": true,\n          \"useMediaDownloadService\": true,\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Exports a Google Workspace document to the requested MIME type and returns exported byte content. For more information, see [Download and export files](https://developers.google.com/workspace/drive/api/guides/manage-downloads). Note that the exported content is limited to 10 MB.\"\n        },\n        \"generateIds\": {\n          \"id\": \"drive.files.generateIds\",\n          \"path\": \"files/generateIds\",\n          \"flatPath\": \"files/generateIds\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"count\": {\n              \"description\": \"The number of IDs to return.\",\n              \"default\": \"10\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"space\": {\n              \"description\": \"The space in which the IDs can be used to create files. Supported values are `drive` and `appDataFolder`. (Default: `drive`.) For more information, see [File organization](https://developers.google.com/workspace/drive/api/guides/about-files#file-organization).\",\n              \"default\": \"drive\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"type\": {\n              \"description\": \"The type of items which the IDs can be used for. Supported values are `files` and `shortcuts`. Note that `shortcuts` are only supported in the `drive` `space`. (Default: `files`.) For more information, see [File organization](https://developers.google.com/workspace/drive/api/guides/about-files#file-organization).\",\n              \"default\": \"files\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [],\n          \"response\": {\n            \"$ref\": \"GeneratedIds\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Generates a set of file IDs which can be provided in create or copy requests. For more information, see [Create and manage files](https://developers.google.com/workspace/drive/api/guides/create-file).\"\n        },\n        \"get\": {\n          \"id\": \"drive.files.get\",\n          \"path\": \"files/{fileId}\",\n          \"flatPath\": \"files/{fileId}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"acknowledgeAbuse\": {\n              \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when the `alt` parameter is set to `media` and the user is the owner of the file or an organizer of the shared drive in which the file resides.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"includePermissionsForView\": {\n              \"description\": \"Specifies which additional view's permissions to include in the response. Only `published` is supported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeLabels\": {\n              \"description\": \"A comma-separated list of IDs of labels to include in the `labelInfo` part of the response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"supportsSubscription\": true,\n          \"supportsMediaDownload\": true,\n          \"useMediaDownloadService\": true,\n          \"response\": {\n            \"$ref\": \"File\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \" Gets a file's metadata or content by ID. For more information, see [Search for files and folders](/workspace/drive/api/guides/search-files). If you provide the URL parameter `alt=media`, then the response includes the file contents in the response body. Downloading content with `alt=media` only works if the file is stored in Drive. To download Google Docs, Sheets, and Slides use [`files.export`](/workspace/drive/api/reference/rest/v3/files/export) instead. For more information, see [Download and export files](/workspace/drive/api/guides/manage-downloads).\"\n        },\n        \"list\": {\n          \"id\": \"drive.files.list\",\n          \"path\": \"files\",\n          \"flatPath\": \"files\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"corpora\": {\n              \"description\": \"Bodies of items (files or documents) to which the query applies. Supported bodies are: * `user` * `domain` * `drive` * `allDrives` Prefer `user` or `drive` to `allDrives` for efficiency. By default, corpora is set to `user`. However, this can change depending on the filter set through the `q` parameter. For more information, see [File organization](https://developers.google.com/workspace/drive/api/guides/about-files#file-organization).\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"corpus\": {\n              \"description\": \"Deprecated: The source of files to list. Use `corpora` instead.\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"string\",\n              \"enumDescriptions\": [\n                \"Files shared to the user's domain.\",\n                \"Files owned by or shared to the user.\"\n              ],\n              \"enum\": [\n                \"domain\",\n                \"user\"\n              ]\n            },\n            \"driveId\": {\n              \"description\": \"ID of the shared drive to search.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeItemsFromAllDrives\": {\n              \"description\": \"Whether both My Drive and shared drive items should be included in results.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includeTeamDriveItems\": {\n              \"description\": \"Deprecated: Use `includeItemsFromAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"orderBy\": {\n              \"description\": \"A comma-separated list of sort keys. Valid keys are: * `createdTime`: When the file was created. * `folder`: The folder ID. This field is sorted using alphabetical ordering. * `modifiedByMeTime`: The last time the file was modified by the user. * `modifiedTime`: The last time the file was modified by anyone. * `name`: The name of the file. This field is sorted using alphabetical ordering, so 1, 12, 2, 22. * `name_natural`: The name of the file. This field is sorted using natural sort ordering, so 1, 2, 12, 22. * `quotaBytesUsed`: The number of storage quota bytes used by the file. * `recency`: The most recent timestamp from the file's date-time fields. * `sharedWithMeTime`: When the file was shared with the user, if applicable. * `starred`: Whether the user has starred the file. * `viewedByMeTime`: The last time the file was viewed by the user. Each key sorts ascending by default, but can be reversed with the `desc` modifier. Example usage: `?orderBy=folder,modifiedTime desc,name`.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"pageSize\": {\n              \"description\": \"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\",\n              \"default\": \"100\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of `nextPageToken` from the previous response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"A query for filtering the file results. For supported syntax, see [Search for files and folders](/workspace/drive/api/guides/search-files).\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"spaces\": {\n              \"description\": \"A comma-separated list of spaces to query within the corpora. Supported values are `drive` and `appDataFolder`. For more information, see [File organization](https://developers.google.com/workspace/drive/api/guides/about-files#file-organization).\",\n              \"default\": \"drive\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"teamDriveId\": {\n              \"description\": \"Deprecated: Use `driveId` instead.\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"string\"\n            },\n            \"includePermissionsForView\": {\n              \"description\": \"Specifies which additional view's permissions to include in the response. Only `published` is supported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeLabels\": {\n              \"description\": \"A comma-separated list of IDs of labels to include in the `labelInfo` part of the response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [],\n          \"response\": {\n            \"$ref\": \"FileList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \" Lists the user's files. For more information, see [Search for files and folders](/workspace/drive/api/guides/search-files). This method accepts the `q` parameter, which is a search query combining one or more search terms. This method returns *all* files by default, including trashed files. If you don't want trashed files to appear in the list, use the `trashed=false` query parameter to remove trashed files from the results.\"\n        },\n        \"listLabels\": {\n          \"id\": \"drive.files.listLabels\",\n          \"path\": \"files/{fileId}/listLabels\",\n          \"flatPath\": \"files/{fileId}/listLabels\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID for the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"maxResults\": {\n              \"description\": \"The maximum number of labels to return per page. When not set, defaults to 100.\",\n              \"default\": \"100\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of `nextPageToken` from the previous response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"response\": {\n            \"$ref\": \"LabelList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Lists the labels on a file. For more information, see [List labels on a file](https://developers.google.com/workspace/drive/api/guides/list-labels).\"\n        },\n        \"modifyLabels\": {\n          \"id\": \"drive.files.modifyLabels\",\n          \"path\": \"files/{fileId}/modifyLabels\",\n          \"flatPath\": \"files/{fileId}/modifyLabels\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file to which the labels belong.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"request\": {\n            \"$ref\": \"ModifyLabelsRequest\"\n          },\n          \"response\": {\n            \"$ref\": \"ModifyLabelsResponse\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\"\n          ],\n          \"description\": \"Modifies the set of labels applied to a file. For more information, see [Set a label field on a file](https://developers.google.com/workspace/drive/api/guides/set-label). Returns a list of the labels that were added or modified.\"\n        },\n        \"update\": {\n          \"id\": \"drive.files.update\",\n          \"path\": \"files/{fileId}\",\n          \"flatPath\": \"files/{fileId}\",\n          \"httpMethod\": \"PATCH\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"addParents\": {\n              \"description\": \"A comma-separated list of parent IDs to add.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"enforceSingleParent\": {\n              \"description\": \"Deprecated: Adding files to multiple folders is no longer supported. Use shortcuts instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"keepRevisionForever\": {\n              \"description\": \"Whether to set the `keepForever` field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"ocrLanguage\": {\n              \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"removeParents\": {\n              \"description\": \"A comma-separated list of parent IDs to remove.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"useContentAsIndexableText\": {\n              \"description\": \"Whether to use the uploaded content as indexable text.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includePermissionsForView\": {\n              \"description\": \"Specifies which additional view's permissions to include in the response. Only `published` is supported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeLabels\": {\n              \"description\": \"A comma-separated list of IDs of labels to include in the `labelInfo` part of the response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"supportsMediaUpload\": true,\n          \"mediaUpload\": {\n            \"accept\": [\n              \"*/*\"\n            ],\n            \"maxSize\": \"5497558138880\",\n            \"protocols\": {\n              \"resumable\": {\n                \"multipart\": true,\n                \"path\": \"/resumable/upload/drive/v3/files/{fileId}\"\n              },\n              \"simple\": {\n                \"multipart\": true,\n                \"path\": \"/upload/drive/v3/files/{fileId}\"\n              }\n            }\n          },\n          \"request\": {\n            \"$ref\": \"File\"\n          },\n          \"response\": {\n            \"$ref\": \"File\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.scripts\"\n          ],\n          \"description\": \" Updates a file's metadata, content, or both. When calling this method, only populate fields in the request that you want to modify. When updating fields, some fields might be changed automatically, such as `modifiedDate`. This method supports patch semantics. This method supports an */upload* URI and accepts uploaded media with the following characteristics: - *Maximum file size:* 5,120 GB - *Accepted Media MIME types:* `*/*` (Specify a valid MIME type, rather than the literal `*/*` value. The literal `*/*` is only used to indicate that any valid MIME type can be uploaded. For more information, see [Google Workspace and Google Drive supported MIME types](/workspace/drive/api/guides/mime-types).) For more information on uploading files, see [Upload file data](/workspace/drive/api/guides/manage-uploads).\"\n        },\n        \"watch\": {\n          \"id\": \"drive.files.watch\",\n          \"path\": \"files/{fileId}/watch\",\n          \"flatPath\": \"files/{fileId}/watch\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"acknowledgeAbuse\": {\n              \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when the `alt` parameter is set to `media` and the user is the owner of the file or an organizer of the shared drive in which the file resides.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includePermissionsForView\": {\n              \"description\": \"Specifies which additional view's permissions to include in the response. Only `published` is supported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"includeLabels\": {\n              \"description\": \"A comma-separated list of IDs of labels to include in the `labelInfo` part of the response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"supportsSubscription\": true,\n          \"request\": {\n            \"parameterName\": \"resource\",\n            \"$ref\": \"Channel\"\n          },\n          \"response\": {\n            \"$ref\": \"Channel\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Subscribes to changes to a file. For more information, see [Notifications for resource changes](https://developers.google.com/workspace/drive/api/guides/push).\"\n        },\n        \"download\": {\n          \"id\": \"drive.files.download\",\n          \"path\": \"files/{fileId}/download\",\n          \"flatPath\": \"files/{fileId}/download\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"Required. The ID of the file to download.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"mimeType\": {\n              \"description\": \"Optional. The MIME type the file should be downloaded as. This field can only be set when downloading Google Workspace documents. For a list of supported MIME types, see [Export MIME types for Google Workspace documents](/workspace/drive/api/guides/ref-export-formats). If not set, a Google Workspace document is downloaded with a default MIME type. The default MIME type might change in the future.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"revisionId\": {\n              \"description\": \"Optional. The revision ID of the file to download. This field can only be set when downloading blob files, Google Docs, and Google Sheets. Returns `INVALID_ARGUMENT` if downloading a specific revision on the file is unsupported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"response\": {\n            \"$ref\": \"Operation\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Downloads the content of a file. For more information, see [Download and export files](https://developers.google.com/workspace/drive/api/guides/manage-downloads). Operations are valid for 24 hours from the time of creation.\"\n        }\n      }\n    },\n    \"permissions\": {\n      \"methods\": {\n        \"create\": {\n          \"id\": \"drive.permissions.create\",\n          \"path\": \"files/{fileId}/permissions\",\n          \"flatPath\": \"files/{fileId}/permissions\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file or shared drive.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"emailMessage\": {\n              \"description\": \"A plain text custom message to include in the notification email.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"enforceSingleParent\": {\n              \"description\": \"Deprecated: See `moveToNewOwnersRoot` for details.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"moveToNewOwnersRoot\": {\n              \"description\": \"This parameter will only take effect if the item is not in a shared drive and the request is attempting to transfer the ownership of the item. If set to `true`, the item will be moved to the new owner's My Drive root folder and all prior parents removed. If set to `false`, parents are not changed.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"sendNotificationEmail\": {\n              \"description\": \"Whether to send a notification email when sharing to users or groups. This defaults to `true` for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"transferOwnership\": {\n              \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"enforceExpansiveAccess\": {\n              \"description\": \"Whether the request should enforce expansive access rules.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"request\": {\n            \"$ref\": \"Permission\"\n          },\n          \"response\": {\n            \"$ref\": \"Permission\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Creates a permission for a file or shared drive. **Warning:** Concurrent permissions operations on the same file are not supported; only the last update is applied.\"\n        },\n        \"delete\": {\n          \"id\": \"drive.permissions.delete\",\n          \"path\": \"files/{fileId}/permissions/{permissionId}\",\n          \"flatPath\": \"files/{fileId}/permissions/{permissionId}\",\n          \"httpMethod\": \"DELETE\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file or shared drive.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"permissionId\": {\n              \"description\": \"The ID of the permission.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"enforceExpansiveAccess\": {\n              \"description\": \"Whether the request should enforce expansive access rules.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"permissionId\"\n          ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Deletes a permission. **Warning:** Concurrent permissions operations on the same file are not supported; only the last update is applied.\"\n        },\n        \"get\": {\n          \"id\": \"drive.permissions.get\",\n          \"path\": \"files/{fileId}/permissions/{permissionId}\",\n          \"flatPath\": \"files/{fileId}/permissions/{permissionId}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"permissionId\": {\n              \"description\": \"The ID of the permission.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"permissionId\"\n          ],\n          \"response\": {\n            \"$ref\": \"Permission\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Gets a permission by ID.\"\n        },\n        \"list\": {\n          \"id\": \"drive.permissions.list\",\n          \"path\": \"files/{fileId}/permissions\",\n          \"flatPath\": \"files/{fileId}/permissions\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file or shared drive.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"pageSize\": {\n              \"description\": \"The maximum number of permissions to return per page. When not set for files in a shared drive, at most 100 results will be returned. When not set for files that are not in a shared drive, the entire list will be returned.\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"includePermissionsForView\": {\n              \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"response\": {\n            \"$ref\": \"PermissionList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Lists a file's or shared drive's permissions.\"\n        },\n        \"update\": {\n          \"id\": \"drive.permissions.update\",\n          \"path\": \"files/{fileId}/permissions/{permissionId}\",\n          \"flatPath\": \"files/{fileId}/permissions/{permissionId}\",\n          \"httpMethod\": \"PATCH\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file or shared drive.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"permissionId\": {\n              \"description\": \"The ID of the permission.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"removeExpiration\": {\n              \"description\": \"Whether to remove the expiration date.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsAllDrives\": {\n              \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"supportsTeamDrives\": {\n              \"description\": \"Deprecated: Use `supportsAllDrives` instead.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"transferOwnership\": {\n              \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"enforceExpansiveAccess\": {\n              \"description\": \"Whether the request should enforce expansive access rules.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"permissionId\"\n          ],\n          \"request\": {\n            \"$ref\": \"Permission\"\n          },\n          \"response\": {\n            \"$ref\": \"Permission\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Updates a permission with patch semantics. **Warning:** Concurrent permissions operations on the same file are not supported; only the last update is applied.\"\n        }\n      }\n    },\n    \"replies\": {\n      \"methods\": {\n        \"create\": {\n          \"id\": \"drive.replies.create\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n          \"flatPath\": \"files/{fileId}/comments/{commentId}/replies\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"commentId\": {\n              \"description\": \"The ID of the comment.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n          ],\n          \"request\": {\n            \"$ref\": \"Reply\"\n          },\n          \"response\": {\n            \"$ref\": \"Reply\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Creates a reply to a comment.\"\n        },\n        \"delete\": {\n          \"id\": \"drive.replies.delete\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n          \"flatPath\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n          \"httpMethod\": \"DELETE\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"commentId\": {\n              \"description\": \"The ID of the comment.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"replyId\": {\n              \"description\": \"The ID of the reply.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\",\n            \"replyId\"\n          ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Deletes a reply.\"\n        },\n        \"get\": {\n          \"id\": \"drive.replies.get\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n          \"flatPath\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"commentId\": {\n              \"description\": \"The ID of the comment.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"replyId\": {\n              \"description\": \"The ID of the reply.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"includeDeleted\": {\n              \"description\": \"Whether to return deleted replies. Deleted replies will not include their original content.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\",\n            \"replyId\"\n          ],\n          \"response\": {\n            \"$ref\": \"Reply\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Gets a reply by ID.\"\n        },\n        \"list\": {\n          \"id\": \"drive.replies.list\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n          \"flatPath\": \"files/{fileId}/comments/{commentId}/replies\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"commentId\": {\n              \"description\": \"The ID of the comment.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"includeDeleted\": {\n              \"description\": \"Whether to include deleted replies. Deleted replies will not include their original content.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            },\n            \"pageSize\": {\n              \"description\": \"The maximum number of replies to return per page.\",\n              \"default\": \"20\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n          ],\n          \"response\": {\n            \"$ref\": \"ReplyList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Lists a comment's replies.\"\n        },\n        \"update\": {\n          \"id\": \"drive.replies.update\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n          \"flatPath\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n          \"httpMethod\": \"PATCH\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"commentId\": {\n              \"description\": \"The ID of the comment.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"replyId\": {\n              \"description\": \"The ID of the reply.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\",\n            \"replyId\"\n          ],\n          \"request\": {\n            \"$ref\": \"Reply\"\n          },\n          \"response\": {\n            \"$ref\": \"Reply\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Updates a reply with patch semantics.\"\n        }\n      }\n    },\n    \"revisions\": {\n      \"methods\": {\n        \"delete\": {\n          \"id\": \"drive.revisions.delete\",\n          \"path\": \"files/{fileId}/revisions/{revisionId}\",\n          \"flatPath\": \"files/{fileId}/revisions/{revisionId}\",\n          \"httpMethod\": \"DELETE\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"revisionId\": {\n              \"description\": \"The ID of the revision.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"revisionId\"\n          ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Permanently deletes a file version. You can only delete revisions for files with binary content in Google Drive, like images or videos. Revisions for other files, like Google Docs or Sheets, and the last remaining file version can't be deleted. For more information, see [Manage file revisions](https://developers.google.com/drive/api/guides/manage-revisions).\"\n        },\n        \"get\": {\n          \"id\": \"drive.revisions.get\",\n          \"path\": \"files/{fileId}/revisions/{revisionId}\",\n          \"flatPath\": \"files/{fileId}/revisions/{revisionId}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"revisionId\": {\n              \"description\": \"The ID of the revision.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"acknowledgeAbuse\": {\n              \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when the `alt` parameter is set to `media` and the user is the owner of the file or an organizer of the shared drive in which the file resides.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"revisionId\"\n          ],\n          \"supportsMediaDownload\": true,\n          \"useMediaDownloadService\": true,\n          \"response\": {\n            \"$ref\": \"Revision\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Gets a revision's metadata or content by ID. For more information, see [Manage file revisions](https://developers.google.com/workspace/drive/api/guides/manage-revisions).\"\n        },\n        \"list\": {\n          \"id\": \"drive.revisions.list\",\n          \"path\": \"files/{fileId}/revisions\",\n          \"flatPath\": \"files/{fileId}/revisions\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"pageSize\": {\n              \"description\": \"The maximum number of revisions to return per page.\",\n              \"default\": \"200\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"response\": {\n            \"$ref\": \"RevisionList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.meet.readonly\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Lists a file's revisions. For more information, see [Manage file revisions](https://developers.google.com/workspace/drive/api/guides/manage-revisions).\"\n        },\n        \"update\": {\n          \"id\": \"drive.revisions.update\",\n          \"path\": \"files/{fileId}/revisions/{revisionId}\",\n          \"flatPath\": \"files/{fileId}/revisions/{revisionId}\",\n          \"httpMethod\": \"PATCH\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"The ID of the file.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"revisionId\": {\n              \"description\": \"The ID of the revision.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"revisionId\"\n          ],\n          \"request\": {\n            \"$ref\": \"Revision\"\n          },\n          \"response\": {\n            \"$ref\": \"Revision\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Updates a revision with patch semantics. For more information, see [Manage file revisions](https://developers.google.com/workspace/drive/api/guides/manage-revisions).\"\n        }\n      }\n    },\n    \"teamdrives\": {\n      \"methods\": {\n        \"create\": {\n          \"id\": \"drive.teamdrives.create\",\n          \"path\": \"teamdrives\",\n          \"flatPath\": \"teamdrives\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"requestId\": {\n              \"description\": \"Required. An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\",\n              \"location\": \"query\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"requestId\"\n          ],\n          \"request\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"response\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n          ],\n          \"description\": \"Deprecated: Use `drives.create` instead.\"\n        },\n        \"delete\": {\n          \"id\": \"drive.teamdrives.delete\",\n          \"path\": \"teamdrives/{teamDriveId}\",\n          \"flatPath\": \"teamdrives/{teamDriveId}\",\n          \"httpMethod\": \"DELETE\",\n          \"parameters\": {\n            \"teamDriveId\": {\n              \"description\": \"The ID of the Team Drive\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"teamDriveId\"\n          ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n          ],\n          \"description\": \"Deprecated: Use `drives.delete` instead.\"\n        },\n        \"get\": {\n          \"id\": \"drive.teamdrives.get\",\n          \"path\": \"teamdrives/{teamDriveId}\",\n          \"flatPath\": \"teamdrives/{teamDriveId}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"teamDriveId\": {\n              \"description\": \"The ID of the Team Drive\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"teamDriveId\"\n          ],\n          \"response\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Deprecated: Use `drives.get` instead.\"\n        },\n        \"list\": {\n          \"id\": \"drive.teamdrives.list\",\n          \"path\": \"teamdrives\",\n          \"flatPath\": \"teamdrives\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"pageSize\": {\n              \"description\": \"Maximum number of Team Drives to return.\",\n              \"default\": \"10\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"pageToken\": {\n              \"description\": \"Page token for Team Drives.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"q\": {\n              \"description\": \"Query string for searching Team Drives.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then all Team Drives of the domain in which the requester is an administrator are returned.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [],\n          \"response\": {\n            \"$ref\": \"TeamDriveList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Deprecated: Use `drives.list` instead.\"\n        },\n        \"update\": {\n          \"id\": \"drive.teamdrives.update\",\n          \"path\": \"teamdrives/{teamDriveId}\",\n          \"flatPath\": \"teamdrives/{teamDriveId}\",\n          \"httpMethod\": \"PATCH\",\n          \"parameters\": {\n            \"teamDriveId\": {\n              \"description\": \"The ID of the Team Drive\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"useDomainAdminAccess\": {\n              \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n              \"default\": \"false\",\n              \"location\": \"query\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"parameterOrder\": [\n            \"teamDriveId\"\n          ],\n          \"request\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"response\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n          ],\n          \"description\": \"Deprecated: Use `drives.update` instead.\"\n        }\n      }\n    },\n    \"accessproposals\": {\n      \"methods\": {\n        \"get\": {\n          \"id\": \"drive.accessproposals.get\",\n          \"path\": \"files/{fileId}/accessproposals/{proposalId}\",\n          \"flatPath\": \"files/{fileId}/accessproposals/{proposalId}\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"Required. The id of the item the request is on.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"proposalId\": {\n              \"description\": \"Required. The id of the access proposal to resolve.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"proposalId\"\n          ],\n          \"response\": {\n            \"$ref\": \"AccessProposal\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"Retrieves an AccessProposal by ID.\"\n        },\n        \"resolve\": {\n          \"id\": \"drive.accessproposals.resolve\",\n          \"path\": \"files/{fileId}/accessproposals/{proposalId}:resolve\",\n          \"flatPath\": \"files/{fileId}/accessproposals/{proposalId}:resolve\",\n          \"httpMethod\": \"POST\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"Required. The id of the item the request is on.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"proposalId\": {\n              \"description\": \"Required. The id of the access proposal to resolve.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"proposalId\"\n          ],\n          \"request\": {\n            \"$ref\": \"ResolveAccessProposalRequest\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n          ],\n          \"description\": \"Used to approve or deny an Access Proposal.\"\n        },\n        \"list\": {\n          \"id\": \"drive.accessproposals.list\",\n          \"path\": \"files/{fileId}/accessproposals\",\n          \"flatPath\": \"files/{fileId}/accessproposals\",\n          \"httpMethod\": \"GET\",\n          \"parameters\": {\n            \"fileId\": {\n              \"description\": \"Required. The id of the item the request is on.\",\n              \"location\": \"path\",\n              \"required\": true,\n              \"type\": \"string\"\n            },\n            \"pageToken\": {\n              \"description\": \"Optional. The continuation token on the list of access requests.\",\n              \"location\": \"query\",\n              \"type\": \"string\"\n            },\n            \"pageSize\": {\n              \"description\": \"Optional. The number of results per page\",\n              \"location\": \"query\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n          ],\n          \"response\": {\n            \"$ref\": \"ListAccessProposalsResponse\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n          ],\n          \"description\": \"List the AccessProposals on a file. Note: Only approvers are able to list AccessProposals on a file. If the user is not an approver, returns a 403.\"\n        }\n      }\n    }\n  },\n  \"id\": \"drive:v3\",\n  \"documentationLink\": \"https://developers.google.com/workspace/drive/\",\n  \"title\": \"Google Drive API\",\n  \"kind\": \"discovery#restDescription\",\n  \"servicePath\": \"drive/v3/\",\n  \"protocol\": \"rest\",\n  \"rootUrl\": \"https://www.googleapis.com/\",\n  \"ownerDomain\": \"google.com\",\n  \"auth\": {\n    \"oauth2\": {\n      \"scopes\": {\n        \"https://www.googleapis.com/auth/drive\": {\n          \"description\": \"See, edit, create, and delete all of your Google Drive files\"\n        },\n        \"https://www.googleapis.com/auth/drive.appdata\": {\n          \"description\": \"See, create, and delete its own configuration data in your Google Drive\"\n        },\n        \"https://www.googleapis.com/auth/drive.apps.readonly\": {\n          \"description\": \"View your Google Drive apps\"\n        },\n        \"https://www.googleapis.com/auth/drive.file\": {\n          \"description\": \"See, edit, create, and delete only the specific Google Drive files you use with this app\"\n        },\n        \"https://www.googleapis.com/auth/drive.meet.readonly\": {\n          \"description\": \"See and download your Google Drive files that were created or edited by Google Meet.\"\n        },\n        \"https://www.googleapis.com/auth/drive.metadata\": {\n          \"description\": \"View and manage metadata of files in your Google Drive\"\n        },\n        \"https://www.googleapis.com/auth/drive.metadata.readonly\": {\n          \"description\": \"See information about your Google Drive files\"\n        },\n        \"https://www.googleapis.com/auth/drive.photos.readonly\": {\n          \"description\": \"View the photos, videos and albums in your Google Photos\"\n        },\n        \"https://www.googleapis.com/auth/drive.readonly\": {\n          \"description\": \"See and download all your Google Drive files\"\n        },\n        \"https://www.googleapis.com/auth/drive.scripts\": {\n          \"description\": \"Modify your Google Apps Script scripts' behavior\"\n        }\n      }\n    }\n  },\n  \"ownerName\": \"Google\",\n  \"batchPath\": \"batch/drive/v3\",\n  \"basePath\": \"/drive/v3/\",\n  \"schemas\": {\n    \"Operation\": {\n      \"id\": \"Operation\",\n      \"description\": \"This resource represents a long-running operation that is the result of a network API call.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"description\": \"The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should be a resource name ending with `operations/{unique_id}`.\",\n          \"type\": \"string\"\n        },\n        \"metadata\": {\n          \"description\": \"Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"any\",\n            \"description\": \"Properties of the object. Contains field @type with type URL.\"\n          }\n        },\n        \"done\": {\n          \"description\": \"If the value is `false`, it means the operation is still in progress. If `true`, the operation is completed, and either `error` or `response` is available.\",\n          \"type\": \"boolean\"\n        },\n        \"error\": {\n          \"description\": \"The error result of the operation in case of failure or cancellation.\",\n          \"$ref\": \"Status\"\n        },\n        \"response\": {\n          \"description\": \"The normal, successful response of the operation. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"any\",\n            \"description\": \"Properties of the object. Contains field @type with type URL.\"\n          }\n        }\n      }\n    },\n    \"Status\": {\n      \"id\": \"Status\",\n      \"description\": \"The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each `Status` message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors).\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"code\": {\n          \"description\": \"The status code, which should be an enum value of google.rpc.Code.\",\n          \"type\": \"integer\",\n          \"format\": \"int32\"\n        },\n        \"message\": {\n          \"description\": \"A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.\",\n          \"type\": \"string\"\n        },\n        \"details\": {\n          \"description\": \"A list of messages that carry the error details. There is a common set of message types for APIs to use.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n              \"type\": \"any\",\n              \"description\": \"Properties of the object. Contains field @type with type URL.\"\n            }\n          }\n        }\n      }\n    },\n    \"About\": {\n      \"id\": \"About\",\n      \"description\": \"Information about the user, the user's Drive, and system capabilities.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#about\\\"`.\",\n          \"default\": \"drive#about\",\n          \"type\": \"string\"\n        },\n        \"storageQuota\": {\n          \"description\": \"The user's storage quota limits and usage. For users that are part of an organization with pooled storage, information about the limit and usage across all services is for the organization, rather than the individual user. All fields are measured in bytes.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"limit\": {\n              \"description\": \"The usage limit, if applicable. This will not be present if the user has unlimited storage. For users that are part of an organization with pooled storage, this is the limit for the organization, rather than the individual user.\",\n              \"type\": \"string\",\n              \"format\": \"int64\"\n            },\n            \"usageInDrive\": {\n              \"description\": \"The usage by all files in Google Drive.\",\n              \"type\": \"string\",\n              \"format\": \"int64\"\n            },\n            \"usageInDriveTrash\": {\n              \"description\": \"The usage by trashed files in Google Drive.\",\n              \"type\": \"string\",\n              \"format\": \"int64\"\n            },\n            \"usage\": {\n              \"description\": \"The total usage across all services. For users that are part of an organization with pooled storage, this is the usage across all services for the organization, rather than the individual user.\",\n              \"type\": \"string\",\n              \"format\": \"int64\"\n            }\n          }\n        },\n        \"driveThemes\": {\n          \"description\": \"A list of themes that are supported for shared drives.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"id\": {\n                \"description\": \"The ID of the theme.\",\n                \"type\": \"string\"\n              },\n              \"backgroundImageLink\": {\n                \"description\": \"A link to this theme's background image.\",\n                \"type\": \"string\"\n              },\n              \"colorRgb\": {\n                \"description\": \"The color of this theme as an RGB hex string.\",\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"canCreateDrives\": {\n          \"description\": \"Whether the user can create shared drives.\",\n          \"type\": \"boolean\"\n        },\n        \"importFormats\": {\n          \"description\": \"A map of source MIME type to possible targets for all supported imports.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"exportFormats\": {\n          \"description\": \"A map of source MIME type to possible targets for all supported exports.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"appInstalled\": {\n          \"description\": \"Whether the user has installed the requesting app.\",\n          \"type\": \"boolean\"\n        },\n        \"user\": {\n          \"description\": \"The authenticated user.\",\n          \"$ref\": \"User\"\n        },\n        \"folderColorPalette\": {\n          \"description\": \"The currently supported folder colors as RGB hex strings.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"maxImportSizes\": {\n          \"description\": \"A map of maximum import sizes by MIME type, in bytes.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\",\n            \"format\": \"int64\"\n          }\n        },\n        \"maxUploadSize\": {\n          \"description\": \"The maximum upload size in bytes.\",\n          \"type\": \"string\",\n          \"format\": \"int64\"\n        },\n        \"teamDriveThemes\": {\n          \"description\": \"Deprecated: Use `driveThemes` instead.\",\n          \"deprecated\": true,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"id\": {\n                \"description\": \"Deprecated: Use `driveThemes/id` instead.\",\n                \"deprecated\": true,\n                \"type\": \"string\"\n              },\n              \"backgroundImageLink\": {\n                \"description\": \"Deprecated: Use `driveThemes/backgroundImageLink` instead.\",\n                \"deprecated\": true,\n                \"type\": \"string\"\n              },\n              \"colorRgb\": {\n                \"description\": \"Deprecated: Use `driveThemes/colorRgb` instead.\",\n                \"deprecated\": true,\n                \"type\": \"string\"\n              }\n            }\n          }\n        },\n        \"canCreateTeamDrives\": {\n          \"description\": \"Deprecated: Use `canCreateDrives` instead.\",\n          \"deprecated\": true,\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"User\": {\n      \"id\": \"User\",\n      \"description\": \"Information about a Drive user.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"displayName\": {\n          \"description\": \"Output only. A plain text displayable name for this user.\",\n          \"readOnly\": true,\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Output only. Identifies what kind of resource this is. Value: the fixed string `drive#user`.\",\n          \"default\": \"drive#user\",\n          \"readOnly\": true,\n          \"type\": \"string\"\n        },\n        \"me\": {\n          \"description\": \"Output only. Whether this user is the requesting user.\",\n          \"readOnly\": true,\n          \"type\": \"boolean\"\n        },\n        \"permissionId\": {\n          \"description\": \"Output only. The user's ID as visible in Permission resources.\",\n          \"readOnly\": true,\n          \"type\": \"string\"\n        },\n        \"emailAddress\": {\n          \"description\": \"Output only. The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester.\",\n          \"readOnly\": true,\n          \"type\": \"string\"\n        },\n        \"photoLink\": {\n          \"description\": \"Output only. A link to the user's profile photo, if available.\",\n          \"readOnly\": true,\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"App\": {\n      \"id\": \"App\",\n      \"description\": \"The `apps` resource provides a list of apps that a user has installed, with information about each app's supported MIME types, file extensions, and other details. Some resource methods (such as `apps.get`) require an `appId`. Use the `apps.list` method to retrieve the ID for an installed application.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"description\": \"The name of the app.\",\n          \"type\": \"string\"\n        },\n        \"objectType\": {\n          \"description\": \"The type of object this app creates such as a Chart. If empty, the app name should be used instead.\",\n          \"type\": \"string\"\n        },\n        \"supportsCreate\": {\n          \"description\": \"Whether this app supports creating objects.\",\n          \"type\": \"boolean\"\n        },\n        \"productUrl\": {\n          \"description\": \"A link to the product listing for this app.\",\n          \"type\": \"string\"\n        },\n        \"primaryMimeTypes\": {\n          \"description\": \"The list of primary MIME types.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"secondaryMimeTypes\": {\n          \"description\": \"The list of secondary MIME types.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"primaryFileExtensions\": {\n          \"description\": \"The list of primary file extensions.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"secondaryFileExtensions\": {\n          \"description\": \"The list of secondary file extensions.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"id\": {\n          \"description\": \"The ID of the app.\",\n          \"type\": \"string\"\n        },\n        \"supportsImport\": {\n          \"description\": \"Whether this app supports importing from Google Docs.\",\n          \"type\": \"boolean\"\n        },\n        \"installed\": {\n          \"description\": \"Whether the app is installed.\",\n          \"type\": \"boolean\"\n        },\n        \"authorized\": {\n          \"description\": \"Whether the app is authorized to access data on the user's Drive.\",\n          \"type\": \"boolean\"\n        },\n        \"icons\": {\n          \"description\": \"The various icons for the app.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"AppIcons\"\n          }\n        },\n        \"useByDefault\": {\n          \"description\": \"Whether the app is selected as the default handler for the types it supports.\",\n          \"type\": \"boolean\"\n        },\n        \"kind\": {\n          \"description\": \"Output only. Identifies what kind of resource this is. Value: the fixed string \\\"drive#app\\\".\",\n          \"default\": \"drive#app\",\n          \"type\": \"string\"\n        },\n        \"shortDescription\": {\n          \"description\": \"A short description of the app.\",\n          \"type\": \"string\"\n        },\n        \"longDescription\": {\n          \"description\": \"A long description of the app.\",\n          \"type\": \"string\"\n        },\n        \"supportsMultiOpen\": {\n          \"description\": \"Whether this app supports opening more than one file.\",\n          \"type\": \"boolean\"\n        },\n        \"productId\": {\n          \"description\": \"The ID of the product listing for this app.\",\n          \"type\": \"string\"\n        },\n        \"openUrlTemplate\": {\n          \"description\": \"The template URL for opening files with this app. The template contains {ids} or {exportIds} to be replaced by the actual file IDs. For more information, see Open Files for the full documentation.\",\n          \"type\": \"string\"\n        },\n        \"createUrl\": {\n          \"description\": \"The URL to create a file with this app.\",\n          \"type\": \"string\"\n        },\n        \"createInFolderTemplate\": {\n          \"description\": \"The template URL to create a file with this app in a given folder. The template contains the {folderId} to be replaced by the folder ID house the new file.\",\n          \"type\": \"string\"\n        },\n        \"supportsOfflineCreate\": {\n          \"description\": \"Whether this app supports creating files when offline.\",\n          \"type\": \"boolean\"\n        },\n        \"hasDriveWideScope\": {\n          \"description\": \"Whether the app has Drive-wide scope. An app with Drive-wide scope can access all files in the user's Drive.\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"AppIcons\": {\n      \"id\": \"AppIcons\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"size\": {\n          \"description\": \"Size of the icon. Represented as the maximum of the width and height.\",\n          \"type\": \"integer\",\n          \"format\": \"int32\"\n        },\n        \"category\": {\n          \"description\": \"Category of the icon. Allowed values are: * `application` - The icon for the application. * `document` - The icon for a file associated with the app. * `documentShared` - The icon for a shared file associated with the app.\",\n          \"type\": \"string\"\n        },\n        \"iconUrl\": {\n          \"description\": \"URL for the icon.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"AppList\": {\n      \"id\": \"AppList\",\n      \"description\": \"A list of third-party applications which the user has installed or given access to Google Drive.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"defaultAppIds\": {\n          \"description\": \"The list of app IDs that the user has specified to use by default. The list is in reverse-priority order (lowest to highest).\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"kind\": {\n          \"description\": \"Output only. Identifies what kind of resource this is. Value: the fixed string \\\"drive#appList\\\".\",\n          \"default\": \"drive#appList\",\n          \"type\": \"string\"\n        },\n        \"selfLink\": {\n          \"description\": \"A link back to this list.\",\n          \"type\": \"string\"\n        },\n        \"items\": {\n          \"description\": \"The list of apps.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"App\"\n          }\n        }\n      }\n    },\n    \"StartPageToken\": {\n      \"id\": \"StartPageToken\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"startPageToken\": {\n          \"description\": \"The starting page token for listing future changes. The page token doesn't expire.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#startPageToken\\\"`.\",\n          \"default\": \"drive#startPageToken\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ChangeList\": {\n      \"id\": \"ChangeList\",\n      \"description\": \"A list of changes for a user.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#changeList\\\"`.\",\n          \"default\": \"drive#changeList\",\n          \"type\": \"string\"\n        },\n        \"nextPageToken\": {\n          \"description\": \"The page token for the next page of changes. This will be absent if the end of the changes list has been reached. The page token doesn't expire.\",\n          \"type\": \"string\"\n        },\n        \"newStartPageToken\": {\n          \"description\": \"The starting page token for future changes. This will be present only if the end of the current changes list has been reached. The page token doesn't expire.\",\n          \"type\": \"string\"\n        },\n        \"changes\": {\n          \"description\": \"The list of changes. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Change\"\n          }\n        }\n      }\n    },\n    \"Change\": {\n      \"id\": \"Change\",\n      \"description\": \"A change to a file or shared drive.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#change\\\"`.\",\n          \"default\": \"drive#change\",\n          \"type\": \"string\"\n        },\n        \"removed\": {\n          \"description\": \"Whether the file or shared drive has been removed from this list of changes, for example by deletion or loss of access.\",\n          \"type\": \"boolean\"\n        },\n        \"file\": {\n          \"description\": \"The updated state of the file. Present if the type is file and the file has not been removed from this list of changes.\",\n          \"$ref\": \"File\"\n        },\n        \"fileId\": {\n          \"description\": \"The ID of the file which has changed.\",\n          \"type\": \"string\"\n        },\n        \"time\": {\n          \"description\": \"The time of this change (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"driveId\": {\n          \"description\": \"The ID of the shared drive associated with this change.\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"description\": \"Deprecated: Use `changeType` instead.\",\n          \"deprecated\": true,\n          \"type\": \"string\"\n        },\n        \"teamDriveId\": {\n          \"description\": \"Deprecated: Use `driveId` instead.\",\n          \"deprecated\": true,\n          \"type\": \"string\"\n        },\n        \"teamDrive\": {\n          \"description\": \"Deprecated: Use `drive` instead.\",\n          \"deprecated\": true,\n          \"$ref\": \"TeamDrive\"\n        },\n        \"changeType\": {\n          \"description\": \"The type of the change. Possible values are `file` and `drive`.\",\n          \"type\": \"string\"\n        },\n        \"drive\": {\n          \"description\": \"The updated state of the shared drive. Present if the changeType is drive, the user is still a member of the shared drive, and the shared drive has not been deleted.\",\n          \"$ref\": \"Drive\"\n        }\n      }\n    },\n    \"File\": {\n      \"id\": \"File\",\n      \"description\": \"The metadata for a file. Some resource methods (such as `files.update`) require a `fileId`. Use the `files.list` method to retrieve the ID for a file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"kind\": {\n          \"description\": \"Output only. Identifies what kind of resource this is. Value: the fixed string `\\\"drive#file\\\"`.\",\n          \"default\": \"drive#file\",\n          \"type\": \"string\"\n        },\n        \"driveId\": {\n          \"description\": \"Output only. ID of the shared drive the file resides in. Only populated for items in shared drives.\",\n          \"type\": \"string\"\n        },\n        \"fileExtension\": {\n          \"description\": \"Output only. The final component of `fullFileExtension`. This is only available for files with binary content in Google Drive.\",\n          \"type\": \"string\"\n        },\n        \"copyRequiresWriterPermission\": {\n          \"description\": \"Whether the options to copy, print, or download this file should be disabled for readers and commenters.\",\n          \"type\": \"boolean\"\n        },\n        \"md5Checksum\": {\n          \"description\": \"Output only. The MD5 checksum for the content of the file. This is only applicable to files with binary content in Google Drive.\",\n          \"type\": \"string\"\n        },\n        \"contentHints\": {\n          \"description\": \"Additional information about the content of the file. These fields are never populated in responses.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"indexableText\": {\n              \"description\": \"Text to be indexed for the file to improve fullText queries. This is limited to 128 KB in length and may contain HTML elements.\",\n              \"type\": \"string\"\n            },\n            \"thumbnail\": {\n              \"description\": \"A thumbnail for the file. This will only be used if Google Drive cannot generate a standard thumbnail.\",\n              \"type\": \"object\",\n              \"properties\": {\n                \"image\": {\n                  \"description\": \"The thumbnail data encoded with URL-safe Base64 ([RFC 4648 section 5](https://datatracker.ietf.org/doc/html/rfc4648#section-5)).\",\n                  \"type\": \"string\",\n                  \"format\": \"byte\"\n                },\n                \"mimeType\": {\n                  \"description\": \"The MIME type of the thumbnail.\",\n                  \"type\": \"string\"\n                }\n              }\n            }\n          }\n        },\n        \"writersCanShare\": {\n          \"description\": \"Whether users with only `writer` permission can modify the file's permissions. Not populated for items in shared drives.\",\n          \"type\": \"boolean\"\n        },\n        \"viewedByMe\": {\n          \"description\": \"Output only. Whether the file has been viewed by this user.\",\n          \"type\": \"boolean\"\n        },\n        \"mimeType\": {\n          \"description\": \"The MIME type of the file. Google Drive attempts to automatically detect an appropriate value from uploaded content, if no value is provided. The value cannot be changed unless a new revision is uploaded. If a file is created with a Google Doc MIME type, the uploaded content is imported, if possible. The supported import formats are published in the [`about`](/workspace/drive/api/reference/rest/v3/about) resource.\",\n          \"type\": \"string\"\n        },\n        \"exportLinks\": {\n          \"description\": \"Output only. Links for exporting Docs Editors files to specific formats.\",\n          \"readOnly\": true,\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"parents\": {\n          \"description\": \"The ID of the parent folder containing the file. A file can only have one parent folder; specifying multiple parents isn't supported. If not specified as part of a create request, the file is placed directly in the user's My Drive folder. If not specified as part of a copy request, the file inherits any discoverable parent of the source file. Update requests must use the `addParents` and `removeParents` parameters to modify the parents list.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"thumbnailLink\": {\n          \"description\": \"Output only. A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Not intended for direct usage on web applications due to [Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) policies. Consider using a proxy server. Only populated when the requesting app can access the file's content. If the file isn't shared publicly, the URL returned in `files.thumbnailLink` must be fetched using a credentialed request.\",\n          \"type\": \"string\"\n        },\n        \"iconLink\": {\n          \"description\": \"Output only. A static, unauthenticated link to the file's icon.\",\n          \"type\": \"string\"\n        },\n        \"shared\": {\n          \"description\": \"Output only. Whether the file has been shared. Not populated for items in shared drives.\",\n          \"type\": \"boolean\"\n        },\n        \"lastModifyingUser\": {\n          \"description\": \"Output only. The last user to modify the file. This field is only populated when the last modification was performed by a signed-in user.\",\n          \"$ref\": \"User\"\n        },\n        \"owners\": {\n          \"description\": \"Output only. The owner of this file. Only certain legacy files may have more than one owner. This field isn't populated for items in shared drives.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"User\"\n          }\n        },\n        \"headRevisionId\": {\n          \"description\": \"Output only. The ID of the file's head revision. This is currently only available for files with binary content in Google Drive.\",\n          \"type\": \"string\"\n        },\n        \"sharingUser\": {\n          \"description\": \"Output only. The user who shared the file with the requesting user, if applicable.\",\n          \"$ref\": \"User\"\n        },\n        \"webViewLink\": {\n          \"description\": \"Output only. A link for opening the file in a relevant Google editor or viewer in a browser.\",\n          \"type\": \"string\"\n        },\n        \"webContentLink\": {\n          \"description\": \"Output only. A link for downloading the content of the file in a browser. This is only available for files with binary content in Google Drive.\",\n          \"type\": \"string\"\n        },\n        \"size\": {\n          \"description\": \"Output only. Size in bytes of blobs and Google Workspace editor files. Won't be populated for files that have no size, like shortcuts and folders.\",\n          \"type\": \"string\",\n          \"format\": \"int64\"\n        },\n        \"viewersCanCopyContent\": {\n          \"description\": \"Deprecated: Use `copyRequiresWriterPermission` instead.\",\n          \"deprecated\": true,\n          \"type\": \"boolean\"\n        },\n        \"permissions\": {\n          \"description\": \"Output only. The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for items in shared drives.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Permission\"\n          }\n        },\n        \"hasThumbnail\": {\n          \"description\": \"Output only. Whether this file has a thumbnail. This doesn't indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\",\n          \"type\": \"boolean\"\n        },\n        \"spaces\": {\n          \"description\": \"Output only. The list of spaces which contain the file. The currently supported values are `drive`, `appDataFolder`, and `photos`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"folderColorRgb\": {\n          \"description\": \"The color for a folder or a shortcut to a folder as an RGB hex string. The supported colors are published in the `folderColorPalette` field of the [`about`](/workspace/drive/api/reference/rest/v3/about) resource. If an unsupported color is specified, the closest color in the palette is used instead.\",\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"The ID of the file.\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the file. This isn't necessarily unique within a folder. Note that for immutable items such as the top-level folders of shared drives, the My Drive root folder, and the Application Data folder, the name is constant.\",\n          \"type\": \"string\"\n        },\n        \"description\": {\n          \"description\": \"A short description of the file.\",\n          \"type\": \"string\"\n        },\n        \"starred\": {\n          \"description\": \"Whether the user has starred the file.\",\n          \"type\": \"boolean\"\n        },\n        \"trashed\": {\n          \"description\": \"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\",\n          \"type\": \"boolean\"\n        },\n        \"explicitlyTrashed\": {\n          \"description\": \"Output only. Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\",\n          \"type\": \"boolean\"\n        },\n        \"createdTime\": {\n          \"description\": \"The time at which the file was created (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"modifiedTime\": {\n          \"description\": \"he last time the file was modified by anyone (RFC 3339 date-time). Note that setting modifiedTime will also update modifiedByMeTime for the user.\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"modifiedByMeTime\": {\n          \"description\": \"The last time the file was modified by the user (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"viewedByMeTime\": {\n          \"description\": \"The last time the file was viewed by the user (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"sharedWithMeTime\": {\n          \"description\": \"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"quotaBytesUsed\": {\n          \"description\": \"Output only. The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with `keepForever` enabled.\",\n          \"type\": \"string\",\n          \"format\": \"int64\"\n        },\n        \"version\": {\n          \"description\": \"Output only. A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\",\n          \"type\": \"string\",\n          \"format\": \"int64\"\n        },\n        \"originalFilename\": {\n          \"description\": \"The original filename of the uploaded content if available, or else the original value of the `name` field. This is only available for files with binary content in Google Drive.\",\n          \"type\": \"string\"\n        },\n        \"ownedByMe\": {\n          \"description\": \"Output only. Whether the user owns the file. Not populated for items in shared drives.\",\n          \"type\": \"boolean\"\n        },\n        \"fullFileExtension\": {\n          \"description\": \"Output only. The full file extension extracted from the `name` field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Google Drive. This is automatically updated when the `name` field changes, however it's not cleared if the new name doesn't contain a valid extension.\",\n          \"type\": \"string\"\n        },\n        \"properties\": {\n          \"description\": \"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"appProperties\": {\n          \"description\": \"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests. These properties can only be retrieved using an authenticated request. An authenticated request uses an access token obtained with a OAuth 2 client ID. You cannot use an API key to retrieve private properties.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"isAppAuthorized\": {\n          \"description\": \"Output only. Whether the file was created or opened by the requesting app.\",\n          \"type\": \"boolean\"\n        },\n        \"teamDriveId\": {\n          \"description\": \"Deprecated: Output only. Use `driveId` instead.\",\n          \"deprecated\": true,\n          \"type\": \"string\"\n        },\n        \"capabilities\": {\n          \"description\": \"Output only. Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take. For more information, see [Understand file capabilities](https://developers.google.com/workspace/drive/api/guides/manage-sharing#capabilities).\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"canChangeViewersCanCopyContent\": {\n              \"description\": \"Deprecated: Output only.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canMoveChildrenOutOfDrive\": {\n              \"description\": \"Output only. Whether the current user can move children of this folder outside of the shared drive. This is `false` when the item isn't a folder. Only populated for items in shared drives.\",\n              \"type\": \"boolean\"\n            },\n            \"canReadDrive\": {\n              \"description\": \"Output only. Whether the current user can read the shared drive to which this file belongs. Only populated for items in shared drives.\",\n              \"type\": \"boolean\"\n            },\n            \"canEdit\": {\n              \"description\": \"Output only. Whether the current user can edit this file. Other factors may limit the type of changes a user can make to a file. For example, see `canChangeCopyRequiresWriterPermission` or `canModifyContent`.\",\n              \"type\": \"boolean\"\n            },\n            \"canCopy\": {\n              \"description\": \"Output only. Whether the current user can copy this file. For an item in a shared drive, whether the current user can copy non-folder descendants of this item, or this item if it's not a folder.\",\n              \"type\": \"boolean\"\n            },\n            \"canComment\": {\n              \"description\": \"Output only. Whether the current user can comment on this file.\",\n              \"type\": \"boolean\"\n            },\n            \"canAddChildren\": {\n              \"description\": \"Output only. Whether the current user can add children to this folder. This is always `false` when the item isn't a folder.\",\n              \"type\": \"boolean\"\n            },\n            \"canDelete\": {\n              \"description\": \"Output only. Whether the current user can delete this file.\",\n              \"type\": \"boolean\"\n            },\n            \"canDownload\": {\n              \"description\": \"Output only. Whether the current user can download this file.\",\n              \"type\": \"boolean\"\n            },\n            \"canListChildren\": {\n              \"description\": \"Output only. Whether the current user can list the children of this folder. This is always `false` when the item isn't a folder.\",\n              \"type\": \"boolean\"\n            },\n            \"canRemoveChildren\": {\n              \"description\": \"Output only. Whether the current user can remove children from this folder. This is always `false` when the item isn't a folder. For a folder in a shared drive, use `canDeleteChildren` or `canTrashChildren` instead.\",\n              \"type\": \"boolean\"\n            },\n            \"canRename\": {\n              \"description\": \"Output only. Whether the current user can rename this file.\",\n              \"type\": \"boolean\"\n            },\n            \"canTrash\": {\n              \"description\": \"Output only. Whether the current user can move this file to trash.\",\n              \"type\": \"boolean\"\n            },\n            \"canReadRevisions\": {\n              \"description\": \"Output only. Whether the current user can read the revisions resource of this file. For a shared drive item, whether revisions of non-folder descendants of this item, or this item if it's not a folder, can be read.\",\n              \"type\": \"boolean\"\n            },\n            \"canReadTeamDrive\": {\n              \"description\": \"Deprecated: Output only. Use `canReadDrive` instead.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canMoveTeamDriveItem\": {\n              \"description\": \"Deprecated: Output only. Use `canMoveItemWithinDrive` or `canMoveItemOutOfDrive` instead.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canChangeCopyRequiresWriterPermission\": {\n              \"description\": \"Output only. Whether the current user can change the `copyRequiresWriterPermission` restriction of this file.\",\n              \"type\": \"boolean\"\n            },\n            \"canMoveItemIntoTeamDrive\": {\n              \"description\": \"Deprecated: Output only. Use `canMoveItemOutOfDrive` instead.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canUntrash\": {\n              \"description\": \"Output only. Whether the current user can restore this file from trash.\",\n              \"type\": \"boolean\"\n            },\n            \"canModifyContent\": {\n              \"description\": \"Output only. Whether the current user can modify the content of this file.\",\n              \"type\": \"boolean\"\n            },\n            \"canMoveItemWithinTeamDrive\": {\n              \"description\": \"Deprecated: Output only. Use `canMoveItemWithinDrive` instead.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canMoveItemOutOfTeamDrive\": {\n              \"description\": \"Deprecated: Output only. Use `canMoveItemOutOfDrive` instead.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canDeleteChildren\": {\n              \"description\": \"Output only. Whether the current user can delete children of this folder. This is `false` when the item isn't a folder. Only populated for items in shared drives.\",\n              \"type\": \"boolean\"\n            },\n            \"canMoveChildrenOutOfTeamDrive\": {\n              \"description\": \"Deprecated: Output only. Use `canMoveChildrenOutOfDrive` instead.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canMoveChildrenWithinTeamDrive\": {\n              \"description\": \"Deprecated: Output only. Use `canMoveChildrenWithinDrive` instead.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canTrashChildren\": {\n              \"description\": \"Output only. Whether the current user can trash children of this folder. This is `false` when the item isn't a folder. Only populated for items in shared drives.\",\n              \"type\": \"boolean\"\n            },\n            \"canMoveItemOutOfDrive\": {\n              \"description\": \"Output only. Whether the current user can move this item outside of this drive by changing its parent. Note that a request to change the parent of the item may still fail depending on the new parent that's being added.\",\n              \"type\": \"boolean\"\n            },\n            \"canAddMyDriveParent\": {\n              \"description\": \"Output only. Whether the current user can add a parent for the item without removing an existing parent in the same request. Not populated for shared drive files.\",\n              \"type\": \"boolean\"\n            },\n            \"canRemoveMyDriveParent\": {\n              \"description\": \"Output only. Whether the current user can remove a parent from the item without adding another parent in the same request. Not populated for shared drive files.\",\n              \"type\": \"boolean\"\n            },\n            \"canMoveItemWithinDrive\": {\n              \"description\": \"Output only. Whether the current user can move this item within this drive. Note that a request to change the parent of the item may still fail depending on the new parent that's being added and the parent that is being removed.\",\n              \"type\": \"boolean\"\n            },\n            \"canShare\": {\n              \"description\": \"Output only. Whether the current user can modify the sharing settings for this file.\",\n              \"type\": \"boolean\"\n            },\n            \"canMoveChildrenWithinDrive\": {\n              \"description\": \"Output only. Whether the current user can move children of this folder within this drive. This is `false` when the item isn't a folder. Note that a request to move the child may still fail depending on the current user's access to the child and to the destination folder.\",\n              \"type\": \"boolean\"\n            },\n            \"canModifyContentRestriction\": {\n              \"description\": \"Deprecated: Output only. Use one of `canModifyEditorContentRestriction`, `canModifyOwnerContentRestriction`, or `canRemoveContentRestriction`.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canAddFolderFromAnotherDrive\": {\n              \"description\": \"Output only. Whether the current user can add a folder from another drive (different shared drive or My Drive) to this folder. This is `false` when the item isn't a folder. Only populated for items in shared drives.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeSecurityUpdateEnabled\": {\n              \"description\": \"Output only. Whether the current user can change the `securityUpdateEnabled` field on link share metadata.\",\n              \"type\": \"boolean\"\n            },\n            \"canAcceptOwnership\": {\n              \"description\": \"Output only. Whether the current user is the pending owner of the file. Not populated for shared drive files.\",\n              \"type\": \"boolean\"\n            },\n            \"canReadLabels\": {\n              \"description\": \"Output only. Whether the current user can read the labels on the file.\",\n              \"type\": \"boolean\"\n            },\n            \"canModifyLabels\": {\n              \"description\": \"Output only. Whether the current user can modify the labels on the file.\",\n              \"type\": \"boolean\"\n            },\n            \"canModifyEditorContentRestriction\": {\n              \"description\": \"Output only. Whether the current user can add or modify content restrictions on the file which are editor restricted.\",\n              \"type\": \"boolean\"\n            },\n            \"canModifyOwnerContentRestriction\": {\n              \"description\": \"Output only. Whether the current user can add or modify content restrictions which are owner restricted.\",\n              \"type\": \"boolean\"\n            },\n            \"canRemoveContentRestriction\": {\n              \"description\": \"Output only. Whether there's a content restriction on the file that can be removed by the current user.\",\n              \"type\": \"boolean\"\n            },\n            \"canDisableInheritedPermissions\": {\n              \"description\": \"Whether a user can disable inherited permissions.\",\n              \"type\": \"boolean\"\n            },\n            \"canEnableInheritedPermissions\": {\n              \"description\": \"Whether a user can re-enable inherited permissions.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeItemDownloadRestriction\": {\n              \"description\": \"Output only. Whether the current user can change the owner or organizer-applied download restrictions of the file.\",\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"hasAugmentedPermissions\": {\n          \"description\": \"Output only. Whether there are permissions directly on this file. This field is only populated for items in shared drives.\",\n          \"type\": \"boolean\"\n        },\n        \"trashingUser\": {\n          \"description\": \"Output only. If the file has been explicitly trashed, the user who trashed it. Only populated for items in shared drives.\",\n          \"$ref\": \"User\"\n        },\n        \"thumbnailVersion\": {\n          \"description\": \"Output only. The thumbnail version for use in thumbnail cache invalidation.\",\n          \"type\": \"string\",\n          \"format\": \"int64\"\n        },\n        \"trashedTime\": {\n          \"description\": \"The time that the item was trashed (RFC 3339 date-time). Only populated for items in shared drives.\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"modifiedByMe\": {\n          \"description\": \"Output only. Whether the file has been modified by this user.\",\n          \"type\": \"boolean\"\n        },\n        \"permissionIds\": {\n          \"description\": \"Output only. List of permission IDs for users with access to this file.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"imageMediaMetadata\": {\n          \"description\": \"Output only. Additional metadata about image media, if available.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"flashUsed\": {\n              \"description\": \"Output only. Whether a flash was used to create the photo.\",\n              \"type\": \"boolean\"\n            },\n            \"meteringMode\": {\n              \"description\": \"Output only. The metering mode used to create the photo.\",\n              \"type\": \"string\"\n            },\n            \"sensor\": {\n              \"description\": \"Output only. The type of sensor used to create the photo.\",\n              \"type\": \"string\"\n            },\n            \"exposureMode\": {\n              \"description\": \"Output only. The exposure mode used to create the photo.\",\n              \"type\": \"string\"\n            },\n            \"colorSpace\": {\n              \"description\": \"Output only. The color space of the photo.\",\n              \"type\": \"string\"\n            },\n            \"whiteBalance\": {\n              \"description\": \"Output only. The white balance mode used to create the photo.\",\n              \"type\": \"string\"\n            },\n            \"width\": {\n              \"description\": \"Output only. The width of the image in pixels.\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"height\": {\n              \"description\": \"Output only. The height of the image in pixels.\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"location\": {\n              \"description\": \"Output only. Geographic location information stored in the image.\",\n              \"type\": \"object\",\n              \"properties\": {\n                \"latitude\": {\n                  \"description\": \"Output only. The latitude stored in the image.\",\n                  \"type\": \"number\",\n                  \"format\": \"double\"\n                },\n                \"longitude\": {\n                  \"description\": \"Output only. The longitude stored in the image.\",\n                  \"type\": \"number\",\n                  \"format\": \"double\"\n                },\n                \"altitude\": {\n                  \"description\": \"Output only. The altitude stored in the image.\",\n                  \"type\": \"number\",\n                  \"format\": \"double\"\n                }\n              }\n            },\n            \"rotation\": {\n              \"description\": \"Output only. The number of clockwise 90 degree rotations applied from the image's original orientation.\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"time\": {\n              \"description\": \"Output only. The date and time the photo was taken (EXIF DateTime).\",\n              \"type\": \"string\"\n            },\n            \"cameraMake\": {\n              \"description\": \"Output only. The make of the camera used to create the photo.\",\n              \"type\": \"string\"\n            },\n            \"cameraModel\": {\n              \"description\": \"Output only. The model of the camera used to create the photo.\",\n              \"type\": \"string\"\n            },\n            \"exposureTime\": {\n              \"description\": \"Output only. The length of the exposure, in seconds.\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            },\n            \"aperture\": {\n              \"description\": \"Output only. The aperture used to create the photo (f-number).\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            },\n            \"focalLength\": {\n              \"description\": \"Output only. The focal length used to create the photo, in millimeters.\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            },\n            \"isoSpeed\": {\n              \"description\": \"Output only. The ISO speed used to create the photo.\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"exposureBias\": {\n              \"description\": \"Output only. The exposure bias of the photo (APEX value).\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            },\n            \"maxApertureValue\": {\n              \"description\": \"Output only. The smallest f-number of the lens at the focal length used to create the photo (APEX value).\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            },\n            \"subjectDistance\": {\n              \"description\": \"Output only. The distance to the subject of the photo, in meters.\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"lens\": {\n              \"description\": \"Output only. The lens used to create the photo.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"videoMediaMetadata\": {\n          \"description\": \"Output only. Additional metadata about video media. This may not be available immediately upon upload.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"width\": {\n              \"description\": \"Output only. The width of the video in pixels.\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"height\": {\n              \"description\": \"Output only. The height of the video in pixels.\",\n              \"type\": \"integer\",\n              \"format\": \"int32\"\n            },\n            \"durationMillis\": {\n              \"description\": \"Output only. The duration of the video in milliseconds.\",\n              \"type\": \"string\",\n              \"format\": \"int64\"\n            }\n          }\n        },\n        \"shortcutDetails\": {\n          \"description\": \"Shortcut file details. Only populated for shortcut files, which have the mimeType field set to `application/vnd.google-apps.shortcut`. Can only be set on `files.create` requests.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"targetId\": {\n              \"description\": \"The ID of the file that this shortcut points to. Can only be set on `files.create` requests.\",\n              \"type\": \"string\"\n            },\n            \"targetMimeType\": {\n              \"description\": \"Output only. The MIME type of the file that this shortcut points to. The value of this field is a snapshot of the target's MIME type, captured when the shortcut is created.\",\n              \"type\": \"string\"\n            },\n            \"targetResourceKey\": {\n              \"description\": \"Output only. The `resourceKey` for the target file.\",\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"contentRestrictions\": {\n          \"description\": \"Restrictions for accessing the content of the file. Only populated if such a restriction exists.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"ContentRestriction\"\n          }\n        },\n        \"resourceKey\": {\n          \"description\": \"Output only. A key needed to access the item via a shared link.\",\n          \"type\": \"string\"\n        },\n        \"linkShareMetadata\": {\n          \"description\": \"Contains details about the link URLs that clients are using to refer to this item.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"securityUpdateEligible\": {\n              \"description\": \"Output only. Whether the file is eligible for security update.\",\n              \"type\": \"boolean\"\n            },\n            \"securityUpdateEnabled\": {\n              \"description\": \"Output only. Whether the security update is enabled for this file.\",\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"labelInfo\": {\n          \"description\": \"Output only. An overview of the labels on the file.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"labels\": {\n              \"description\": \"Output only. The set of labels on the file as requested by the label IDs in the `includeLabels` parameter. By default, no labels are returned.\",\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"Label\"\n              }\n            }\n          }\n        },\n        \"sha1Checksum\": {\n          \"description\": \"Output only. The SHA1 checksum associated with this file, if available. This field is only populated for files with content stored in Google Drive; it's not populated for Docs Editors or shortcut files.\",\n          \"type\": \"string\"\n        },\n        \"sha256Checksum\": {\n          \"description\": \"Output only. The SHA256 checksum associated with this file, if available. This field is only populated for files with content stored in Google Drive; it's not populated for Docs Editors or shortcut files.\",\n          \"type\": \"string\"\n        },\n        \"inheritedPermissionsDisabled\": {\n          \"description\": \"Whether this file has inherited permissions disabled. Inherited permissions are enabled by default.\",\n          \"type\": \"boolean\"\n        },\n        \"downloadRestrictions\": {\n          \"description\": \"Download restrictions applied on the file.\",\n          \"$ref\": \"DownloadRestrictionsMetadata\"\n        }\n      }\n    },\n    \"Permission\": {\n      \"id\": \"Permission\",\n      \"description\": \"A permission for a file. A permission grants a user, group, domain, or the world access to a file or a folder hierarchy. By default, permissions requests only return a subset of fields. Permission kind, ID, type, and role are always returned. To retrieve specific fields, see https://developers.google.com/workspace/drive/api/guides/fields-parameter. Some resource methods (such as `permissions.update`) require a `permissionId`. Use the `permissions.list` method to retrieve the ID for a file, folder, or shared drive.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Output only. The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as `permissionId`. IDs should be treated as opaque values.\",\n          \"type\": \"string\"\n        },\n        \"displayName\": {\n          \"description\": \"Output only. The \\\"pretty\\\" name of the value of the permission. The following is a list of examples for each type of permission: * `user` - User's full name, as defined for their Google account, such as \\\"Joe Smith.\\\" * `group` - Name of the Google Group, such as \\\"The Company Administrators.\\\" * `domain` - String domain name, such as \\\"thecompany.com.\\\" * `anyone` - No `displayName` is present.\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"description\": \"The type of the grantee. Valid values are: * `user` * `group` * `domain` * `anyone` When creating a permission, if `type` is `user` or `group`, you must provide an `emailAddress` for the user or group. When `type` is `domain`, you must provide a `domain`. There isn't extra information required for an `anyone` type.\",\n          \"annotations\": {\n            \"required\": [\n              \"drive.permissions.create\"\n            ]\n          },\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Output only. Identifies what kind of resource this is. Value: the fixed string `\\\"drive#permission\\\"`.\",\n          \"default\": \"drive#permission\",\n          \"type\": \"string\"\n        },\n        \"permissionDetails\": {\n          \"description\": \"Output only. Details of whether the permissions on this item are inherited or directly on this item.\",\n          \"readOnly\": true,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"permissionType\": {\n                \"description\": \"Output only. The permission type for this user. While new values may be added in future, the following are currently possible: * `file` * `member`\",\n                \"type\": \"string\"\n              },\n              \"inheritedFrom\": {\n                \"description\": \"Output only. The ID of the item from which this permission is inherited. This is only populated for items in shared drives.\",\n                \"type\": \"string\"\n              },\n              \"role\": {\n                \"description\": \"Output only. The primary role for this user. While new values may be added in the future, the following are currently possible: * `owner` * `organizer` * `fileOrganizer` * `writer` * `commenter` * `reader`\",\n                \"type\": \"string\"\n              },\n              \"inherited\": {\n                \"description\": \"Output only. Whether this permission is inherited. This field is always populated. This is an output-only field.\",\n                \"type\": \"boolean\"\n              }\n            }\n          }\n        },\n        \"photoLink\": {\n          \"description\": \"Output only. A link to the user's profile photo, if available.\",\n          \"type\": \"string\"\n        },\n        \"emailAddress\": {\n          \"description\": \"The email address of the user or group to which this permission refers.\",\n          \"type\": \"string\"\n        },\n        \"role\": {\n          \"description\": \"The role granted by this permission. While new values may be supported in the future, the following are currently allowed: * `owner` * `organizer` * `fileOrganizer` * `writer` * `commenter` * `reader`\",\n          \"annotations\": {\n            \"required\": [\n              \"drive.permissions.create\"\n            ]\n          },\n          \"type\": \"string\"\n        },\n        \"allowFileDiscovery\": {\n          \"description\": \"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type `domain` or `anyone`.\",\n          \"type\": \"boolean\"\n        },\n        \"domain\": {\n          \"description\": \"The domain to which this permission refers.\",\n          \"type\": \"string\"\n        },\n        \"expirationTime\": {\n          \"description\": \"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions: - They can only be set on user and group permissions - The time must be in the future - The time cannot be more than a year in the future\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"teamDrivePermissionDetails\": {\n          \"description\": \"Output only. Deprecated: Output only. Use `permissionDetails` instead.\",\n          \"readOnly\": true,\n          \"deprecated\": true,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"teamDrivePermissionType\": {\n                \"description\": \"Deprecated: Output only. Use `permissionDetails/permissionType` instead.\",\n                \"deprecated\": true,\n                \"type\": \"string\"\n              },\n              \"inheritedFrom\": {\n                \"description\": \"Deprecated: Output only. Use `permissionDetails/inheritedFrom` instead.\",\n                \"deprecated\": true,\n                \"type\": \"string\"\n              },\n              \"role\": {\n                \"description\": \"Deprecated: Output only. Use `permissionDetails/role` instead.\",\n                \"deprecated\": true,\n                \"type\": \"string\"\n              },\n              \"inherited\": {\n                \"description\": \"Deprecated: Output only. Use `permissionDetails/inherited` instead.\",\n                \"deprecated\": true,\n                \"type\": \"boolean\"\n              }\n            }\n          }\n        },\n        \"deleted\": {\n          \"description\": \"Output only. Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\",\n          \"type\": \"boolean\"\n        },\n        \"view\": {\n          \"description\": \"Indicates the view for this permission. Only populated for permissions that belong to a view. published and metadata are the only supported values. - published: The permission's role is published_reader. - metadata: The item is only visible to the metadata view because the item has limited access and the scope has at least read access to the parent. Note: The metadata view is currently only supported on folders. \",\n          \"type\": \"string\"\n        },\n        \"pendingOwner\": {\n          \"description\": \"Whether the account associated with this permission is a pending owner. Only populated for `user` type permissions for files that are not in a shared drive.\",\n          \"type\": \"boolean\"\n        },\n        \"inheritedPermissionsDisabled\": {\n          \"description\": \"When true, only organizers, owners, and users with permissions added directly on the item can access it.\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"ContentRestriction\": {\n      \"id\": \"ContentRestriction\",\n      \"description\": \"A restriction for accessing the content of the file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"readOnly\": {\n          \"description\": \"Whether the content of the file is read-only. If a file is read-only, a new revision of the file may not be added, comments may not be added or modified, and the title of the file may not be modified.\",\n          \"type\": \"boolean\"\n        },\n        \"reason\": {\n          \"description\": \"Reason for why the content of the file is restricted. This is only mutable on requests that also set `readOnly=true`.\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"description\": \"Output only. The type of the content restriction. Currently the only possible value is `globalContentRestriction`.\",\n          \"type\": \"string\"\n        },\n        \"restrictingUser\": {\n          \"description\": \"Output only. The user who set the content restriction. Only populated if `readOnly=true`.\",\n          \"$ref\": \"User\"\n        },\n        \"restrictionTime\": {\n          \"description\": \"The time at which the content restriction was set (formatted RFC 3339 timestamp). Only populated if readOnly is true.\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"ownerRestricted\": {\n          \"description\": \"Whether the content restriction can only be modified or removed by a user who owns the file. For files in shared drives, any user with `organizer` capabilities can modify or remove this content restriction.\",\n          \"type\": \"boolean\"\n        },\n        \"systemRestricted\": {\n          \"description\": \"Output only. Whether the content restriction was applied by the system, for example due to an esignature. Users cannot modify or remove system restricted content restrictions.\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"Label\": {\n      \"id\": \"Label\",\n      \"description\": \"Representation of label and label fields.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"The ID of the label.\",\n          \"type\": \"string\"\n        },\n        \"revisionId\": {\n          \"description\": \"The revision ID of the label.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"This is always drive#label\",\n          \"type\": \"string\"\n        },\n        \"fields\": {\n          \"description\": \"A map of the fields on the label, keyed by the field's ID.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"$ref\": \"LabelField\"\n          }\n        }\n      }\n    },\n    \"LabelField\": {\n      \"id\": \"LabelField\",\n      \"description\": \"Representation of field, which is a typed key-value pair.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"kind\": {\n          \"description\": \"This is always drive#labelField.\",\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"The identifier of this label field.\",\n          \"type\": \"string\"\n        },\n        \"valueType\": {\n          \"description\": \"The field type. While new values may be supported in the future, the following are currently allowed: * `dateString` * `integer` * `selection` * `text` * `user`\",\n          \"type\": \"string\"\n        },\n        \"dateString\": {\n          \"description\": \"Only present if valueType is dateString. RFC 3339 formatted date: YYYY-MM-DD.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"format\": \"date\"\n          }\n        },\n        \"integer\": {\n          \"description\": \"Only present if `valueType` is `integer`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"format\": \"int64\"\n          }\n        },\n        \"selection\": {\n          \"description\": \"Only present if `valueType` is `selection`\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"text\": {\n          \"description\": \"Only present if `valueType` is `text`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"user\": {\n          \"description\": \"Only present if `valueType` is `user`.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"User\"\n          }\n        }\n      }\n    },\n    \"DownloadRestrictionsMetadata\": {\n      \"id\": \"DownloadRestrictionsMetadata\",\n      \"description\": \"Download restrictions applied to the file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"itemDownloadRestriction\": {\n          \"description\": \"The download restriction of the file applied directly by the owner or organizer. This doesn't take into account shared drive settings or DLP rules.\",\n          \"$ref\": \"DownloadRestriction\"\n        },\n        \"effectiveDownloadRestrictionWithContext\": {\n          \"description\": \"Output only. The effective download restriction applied to this file. This considers all restriction settings and DLP rules.\",\n          \"$ref\": \"DownloadRestriction\"\n        }\n      }\n    },\n    \"DownloadRestriction\": {\n      \"id\": \"DownloadRestriction\",\n      \"description\": \"A restriction for copy and download of the file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"restrictedForReaders\": {\n          \"description\": \"Whether download and copy is restricted for readers.\",\n          \"type\": \"boolean\"\n        },\n        \"restrictedForWriters\": {\n          \"description\": \"Whether download and copy is restricted for writers. If `true`, download is also restricted for readers.\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"TeamDrive\": {\n      \"id\": \"TeamDrive\",\n      \"description\": \"Deprecated: use the drive collection instead.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"The ID of this Team Drive which is also the ID of the top level folder of this Team Drive.\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of this Team Drive.\",\n          \"type\": \"string\"\n        },\n        \"colorRgb\": {\n          \"description\": \"The color of this Team Drive as an RGB hex string. It can only be set on a `drive.teamdrives.update` request that does not set `themeId`.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#teamDrive\\\"`.\",\n          \"default\": \"drive#teamDrive\",\n          \"type\": \"string\"\n        },\n        \"backgroundImageLink\": {\n          \"description\": \"A short-lived link to this Team Drive's background image.\",\n          \"type\": \"string\"\n        },\n        \"capabilities\": {\n          \"description\": \"Capabilities the current user has on this Team Drive.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"canAddChildren\": {\n              \"description\": \"Whether the current user can add children to folders in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canComment\": {\n              \"description\": \"Whether the current user can comment on files in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canCopy\": {\n              \"description\": \"Whether the current user can copy files in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canDeleteTeamDrive\": {\n              \"description\": \"Whether the current user can delete this Team Drive. Attempting to delete the Team Drive may still fail if there are untrashed items inside the Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canDownload\": {\n              \"description\": \"Whether the current user can download files in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canEdit\": {\n              \"description\": \"Whether the current user can edit files in this Team Drive\",\n              \"type\": \"boolean\"\n            },\n            \"canListChildren\": {\n              \"description\": \"Whether the current user can list the children of folders in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canManageMembers\": {\n              \"description\": \"Whether the current user can add members to this Team Drive or remove them or change their role.\",\n              \"type\": \"boolean\"\n            },\n            \"canReadRevisions\": {\n              \"description\": \"Whether the current user can read the revisions resource of files in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canRemoveChildren\": {\n              \"description\": \"Deprecated: Use `canDeleteChildren` or `canTrashChildren` instead.\",\n              \"deprecated\": true,\n              \"type\": \"boolean\"\n            },\n            \"canRename\": {\n              \"description\": \"Whether the current user can rename files or folders in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canRenameTeamDrive\": {\n              \"description\": \"Whether the current user can rename this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeTeamDriveBackground\": {\n              \"description\": \"Whether the current user can change the background of this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canShare\": {\n              \"description\": \"Whether the current user can share files or folders in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeCopyRequiresWriterPermissionRestriction\": {\n              \"description\": \"Whether the current user can change the `copyRequiresWriterPermission` restriction of this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeDomainUsersOnlyRestriction\": {\n              \"description\": \"Whether the current user can change the `domainUsersOnly` restriction of this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeSharingFoldersRequiresOrganizerPermissionRestriction\": {\n              \"description\": \"Whether the current user can change the `sharingFoldersRequiresOrganizerPermission` restriction of this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeTeamMembersOnlyRestriction\": {\n              \"description\": \"Whether the current user can change the `teamMembersOnly` restriction of this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canDeleteChildren\": {\n              \"description\": \"Whether the current user can delete children from folders in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canTrashChildren\": {\n              \"description\": \"Whether the current user can trash children from folders in this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canResetTeamDriveRestrictions\": {\n              \"description\": \"Whether the current user can reset the Team Drive restrictions to defaults.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeDownloadRestriction\": {\n              \"description\": \"Whether the current user can change organizer-applied download restrictions of this shared drive.\",\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"themeId\": {\n          \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible `teamDriveThemes` can be retrieved from a `drive.about.get` response. When not specified on a `drive.teamdrives.create` request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set `colorRgb` or `backgroundImageFile`.\",\n          \"type\": \"string\"\n        },\n        \"backgroundImageFile\": {\n          \"description\": \"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on `drive.teamdrives.update` requests that don't set `themeId`. When specified, all fields of the `backgroundImageFile` must be set.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"id\": {\n              \"description\": \"The ID of an image file in Drive to use for the background image.\",\n              \"type\": \"string\"\n            },\n            \"xCoordinate\": {\n              \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            },\n            \"yCoordinate\": {\n              \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            },\n            \"width\": {\n              \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            }\n          }\n        },\n        \"createdTime\": {\n          \"description\": \"The time at which the Team Drive was created (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"restrictions\": {\n          \"description\": \"A set of restrictions that apply to this Team Drive or items inside this Team Drive.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"copyRequiresWriterPermission\": {\n              \"description\": \"Whether the options to copy, print, or download files inside this Team Drive, should be disabled for readers and commenters. When this restriction is set to `true`, it will override the similarly named field to `true` for any file inside this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"domainUsersOnly\": {\n              \"description\": \"Whether access to this Team Drive and items inside this Team Drive is restricted to users of the domain to which this Team Drive belongs. This restriction may be overridden by other sharing policies controlled outside of this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"teamMembersOnly\": {\n              \"description\": \"Whether access to items inside this Team Drive is restricted to members of this Team Drive.\",\n              \"type\": \"boolean\"\n            },\n            \"adminManagedRestrictions\": {\n              \"description\": \"Whether administrative privileges on this Team Drive are required to modify restrictions.\",\n              \"type\": \"boolean\"\n            },\n            \"sharingFoldersRequiresOrganizerPermission\": {\n              \"description\": \"If true, only users with the organizer role can share folders. If false, users with either the organizer role or the file organizer role can share folders.\",\n              \"type\": \"boolean\"\n            },\n            \"downloadRestriction\": {\n              \"description\": \"Download restrictions applied by shared drive managers.\",\n              \"$ref\": \"DownloadRestriction\"\n            }\n          }\n        },\n        \"orgUnitId\": {\n          \"description\": \"The organizational unit of this shared drive. This field is only populated on `drives.list` responses when the `useDomainAdminAccess` parameter is set to `true`.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Drive\": {\n      \"id\": \"Drive\",\n      \"description\": \"Representation of a shared drive. Some resource methods (such as `drives.update`) require a `driveId`. Use the `drives.list` method to retrieve the ID for a shared drive.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Output only. The ID of this shared drive which is also the ID of the top level folder of this shared drive.\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of this shared drive.\",\n          \"type\": \"string\"\n        },\n        \"colorRgb\": {\n          \"description\": \"The color of this shared drive as an RGB hex string. It can only be set on a `drive.drives.update` request that does not set `themeId`.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Output only. Identifies what kind of resource this is. Value: the fixed string `\\\"drive#drive\\\"`.\",\n          \"default\": \"drive#drive\",\n          \"type\": \"string\"\n        },\n        \"backgroundImageLink\": {\n          \"description\": \"Output only. A short-lived link to this shared drive's background image.\",\n          \"type\": \"string\"\n        },\n        \"capabilities\": {\n          \"description\": \"Output only. Capabilities the current user has on this shared drive.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"canAddChildren\": {\n              \"description\": \"Output only. Whether the current user can add children to folders in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canComment\": {\n              \"description\": \"Output only. Whether the current user can comment on files in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canCopy\": {\n              \"description\": \"Output only. Whether the current user can copy files in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canDeleteDrive\": {\n              \"description\": \"Output only. Whether the current user can delete this shared drive. Attempting to delete the shared drive may still fail if there are untrashed items inside the shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canDownload\": {\n              \"description\": \"Output only. Whether the current user can download files in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canEdit\": {\n              \"description\": \"Output only. Whether the current user can edit files in this shared drive\",\n              \"type\": \"boolean\"\n            },\n            \"canListChildren\": {\n              \"description\": \"Output only. Whether the current user can list the children of folders in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canManageMembers\": {\n              \"description\": \"Output only. Whether the current user can add members to this shared drive or remove them or change their role.\",\n              \"type\": \"boolean\"\n            },\n            \"canReadRevisions\": {\n              \"description\": \"Output only. Whether the current user can read the revisions resource of files in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canRename\": {\n              \"description\": \"Output only. Whether the current user can rename files or folders in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canRenameDrive\": {\n              \"description\": \"Output only. Whether the current user can rename this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeDriveBackground\": {\n              \"description\": \"Output only. Whether the current user can change the background of this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canShare\": {\n              \"description\": \"Output only. Whether the current user can share files or folders in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeCopyRequiresWriterPermissionRestriction\": {\n              \"description\": \"Output only. Whether the current user can change the `copyRequiresWriterPermission` restriction of this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeDomainUsersOnlyRestriction\": {\n              \"description\": \"Output only. Whether the current user can change the `domainUsersOnly` restriction of this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeDriveMembersOnlyRestriction\": {\n              \"description\": \"Output only. Whether the current user can change the `driveMembersOnly` restriction of this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeSharingFoldersRequiresOrganizerPermissionRestriction\": {\n              \"description\": \"Output only. Whether the current user can change the `sharingFoldersRequiresOrganizerPermission` restriction of this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canResetDriveRestrictions\": {\n              \"description\": \"Output only. Whether the current user can reset the shared drive restrictions to defaults.\",\n              \"type\": \"boolean\"\n            },\n            \"canDeleteChildren\": {\n              \"description\": \"Output only. Whether the current user can delete children from folders in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canTrashChildren\": {\n              \"description\": \"Output only. Whether the current user can trash children from folders in this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"canChangeDownloadRestriction\": {\n              \"description\": \"Output only. Whether the current user can change organizer-applied download restrictions of this shared drive.\",\n              \"type\": \"boolean\"\n            }\n          }\n        },\n        \"themeId\": {\n          \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible `driveThemes` can be retrieved from a `drive.about.get` response. When not specified on a `drive.drives.create` request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set `colorRgb` or `backgroundImageFile`.\",\n          \"type\": \"string\"\n        },\n        \"backgroundImageFile\": {\n          \"description\": \"An image file and cropping parameters from which a background image for this shared drive is set. This is a write only field; it can only be set on `drive.drives.update` requests that don't set `themeId`. When specified, all fields of the `backgroundImageFile` must be set.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"id\": {\n              \"description\": \"The ID of an image file in Google Drive to use for the background image.\",\n              \"type\": \"string\"\n            },\n            \"xCoordinate\": {\n              \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            },\n            \"yCoordinate\": {\n              \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            },\n            \"width\": {\n              \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n              \"type\": \"number\",\n              \"format\": \"float\"\n            }\n          }\n        },\n        \"createdTime\": {\n          \"description\": \"The time at which the shared drive was created (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"hidden\": {\n          \"description\": \"Whether the shared drive is hidden from default view.\",\n          \"type\": \"boolean\"\n        },\n        \"restrictions\": {\n          \"description\": \"A set of restrictions that apply to this shared drive or items inside this shared drive. Note that restrictions can't be set when creating a shared drive. To add a restriction, first create a shared drive and then use `drives.update` to add restrictions.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"copyRequiresWriterPermission\": {\n              \"description\": \"Whether the options to copy, print, or download files inside this shared drive, should be disabled for readers and commenters. When this restriction is set to `true`, it will override the similarly named field to `true` for any file inside this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"domainUsersOnly\": {\n              \"description\": \"Whether access to this shared drive and items inside this shared drive is restricted to users of the domain to which this shared drive belongs. This restriction may be overridden by other sharing policies controlled outside of this shared drive.\",\n              \"type\": \"boolean\"\n            },\n            \"driveMembersOnly\": {\n              \"description\": \"Whether access to items inside this shared drive is restricted to its members.\",\n              \"type\": \"boolean\"\n            },\n            \"adminManagedRestrictions\": {\n              \"description\": \"Whether administrative privileges on this shared drive are required to modify restrictions.\",\n              \"type\": \"boolean\"\n            },\n            \"sharingFoldersRequiresOrganizerPermission\": {\n              \"description\": \"If true, only users with the organizer role can share folders. If false, users with either the organizer role or the file organizer role can share folders.\",\n              \"type\": \"boolean\"\n            },\n            \"downloadRestriction\": {\n              \"description\": \"Download restrictions applied by shared drive managers.\",\n              \"$ref\": \"DownloadRestriction\"\n            }\n          }\n        },\n        \"orgUnitId\": {\n          \"description\": \"Output only. The organizational unit of this shared drive. This field is only populated on `drives.list` responses when the `useDomainAdminAccess` parameter is set to `true`.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Channel\": {\n      \"id\": \"Channel\",\n      \"description\": \"A notification channel used to watch for resource changes.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"payload\": {\n          \"description\": \"A Boolean value to indicate whether payload is wanted. Optional.\",\n          \"type\": \"boolean\"\n        },\n        \"id\": {\n          \"description\": \"A UUID or similar unique string that identifies this channel.\",\n          \"type\": \"string\"\n        },\n        \"resourceId\": {\n          \"description\": \"An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.\",\n          \"type\": \"string\"\n        },\n        \"resourceUri\": {\n          \"description\": \"A version-specific identifier for the watched resource.\",\n          \"type\": \"string\"\n        },\n        \"token\": {\n          \"description\": \"An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.\",\n          \"type\": \"string\"\n        },\n        \"expiration\": {\n          \"description\": \"Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.\",\n          \"type\": \"string\",\n          \"format\": \"int64\"\n        },\n        \"type\": {\n          \"description\": \"The type of delivery mechanism used for this channel. Valid values are \\\"web_hook\\\" or \\\"webhook\\\".\",\n          \"type\": \"string\"\n        },\n        \"address\": {\n          \"description\": \"The address where notifications are delivered for this channel.\",\n          \"type\": \"string\"\n        },\n        \"params\": {\n          \"description\": \"Additional parameters controlling delivery channel behavior. Optional.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"kind\": {\n          \"description\": \"Identifies this as a notification channel used to watch for changes to a resource, which is `api#channel`.\",\n          \"default\": \"api#channel\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Comment\": {\n      \"id\": \"Comment\",\n      \"description\": \"A comment on a file. Some resource methods (such as `comments.update`) require a `commentId`. Use the `comments.list` method to retrieve the ID for a comment in a file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Output only. The ID of the comment.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Output only. Identifies what kind of resource this is. Value: the fixed string `\\\"drive#comment\\\"`.\",\n          \"default\": \"drive#comment\",\n          \"type\": \"string\"\n        },\n        \"createdTime\": {\n          \"description\": \"The time at which the comment was created (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"modifiedTime\": {\n          \"description\": \"The last time the comment or any of its replies was modified (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"resolved\": {\n          \"description\": \"Output only. Whether the comment has been resolved by one of its replies.\",\n          \"type\": \"boolean\"\n        },\n        \"anchor\": {\n          \"description\": \"A region of the document represented as a JSON string. For details on defining anchor properties, refer to [Manage comments and replies](https://developers.google.com/workspace/drive/api/v3/manage-comments).\",\n          \"type\": \"string\"\n        },\n        \"replies\": {\n          \"description\": \"Output only. The full list of replies to the comment in chronological order.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Reply\"\n          }\n        },\n        \"author\": {\n          \"description\": \"Output only. The author of the comment. The author's email address and permission ID will not be populated.\",\n          \"$ref\": \"User\"\n        },\n        \"deleted\": {\n          \"description\": \"Output only. Whether the comment has been deleted. A deleted comment has no content.\",\n          \"type\": \"boolean\"\n        },\n        \"htmlContent\": {\n          \"description\": \"Output only. The content of the comment with HTML formatting.\",\n          \"type\": \"string\"\n        },\n        \"content\": {\n          \"description\": \"The plain text content of the comment. This field is used for setting the content, while `htmlContent` should be displayed.\",\n          \"annotations\": {\n            \"required\": [\n              \"drive.comments.create\",\n              \"drive.comments.update\"\n            ]\n          },\n          \"type\": \"string\"\n        },\n        \"quotedFileContent\": {\n          \"description\": \"The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"mimeType\": {\n              \"description\": \"The MIME type of the quoted content.\",\n              \"type\": \"string\"\n            },\n            \"value\": {\n              \"description\": \"The quoted content itself. This is interpreted as plain text if set through the API.\",\n              \"type\": \"string\"\n            }\n          }\n        }\n      }\n    },\n    \"Reply\": {\n      \"id\": \"Reply\",\n      \"description\": \"A reply to a comment on a file. Some resource methods (such as `replies.update`) require a `replyId`. Use the `replies.list` method to retrieve the ID for a reply.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Output only. The ID of the reply.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Output only. Identifies what kind of resource this is. Value: the fixed string `\\\"drive#reply\\\"`.\",\n          \"default\": \"drive#reply\",\n          \"type\": \"string\"\n        },\n        \"createdTime\": {\n          \"description\": \"The time at which the reply was created (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"modifiedTime\": {\n          \"description\": \"The last time the reply was modified (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"action\": {\n          \"description\": \"The action the reply performed to the parent comment. Valid values are: * `resolve` * `reopen`\",\n          \"type\": \"string\"\n        },\n        \"author\": {\n          \"description\": \"Output only. The author of the reply. The author's email address and permission ID will not be populated.\",\n          \"$ref\": \"User\"\n        },\n        \"deleted\": {\n          \"description\": \"Output only. Whether the reply has been deleted. A deleted reply has no content.\",\n          \"type\": \"boolean\"\n        },\n        \"htmlContent\": {\n          \"description\": \"Output only. The content of the reply with HTML formatting.\",\n          \"type\": \"string\"\n        },\n        \"content\": {\n          \"description\": \"The plain text content of the reply. This field is used for setting the content, while `htmlContent` should be displayed. This is required on creates if no `action` is specified.\",\n          \"annotations\": {\n            \"required\": [\n              \"drive.replies.update\"\n            ]\n          },\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"CommentList\": {\n      \"id\": \"CommentList\",\n      \"description\": \"A list of comments on a file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#commentList\\\"`.\",\n          \"default\": \"drive#commentList\",\n          \"type\": \"string\"\n        },\n        \"comments\": {\n          \"description\": \"The list of comments. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Comment\"\n          }\n        },\n        \"nextPageToken\": {\n          \"description\": \"The page token for the next page of comments. This will be absent if the end of the comments list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results. The page token is typically valid for several hours. However, if new items are added or removed, your expected results might differ.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"DriveList\": {\n      \"id\": \"DriveList\",\n      \"description\": \"A list of shared drives.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nextPageToken\": {\n          \"description\": \"The page token for the next page of shared drives. This will be absent if the end of the list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results. The page token is typically valid for several hours. However, if new items are added or removed, your expected results might differ.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#driveList\\\"`.\",\n          \"default\": \"drive#driveList\",\n          \"type\": \"string\"\n        },\n        \"drives\": {\n          \"description\": \"The list of shared drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Drive\"\n          }\n        }\n      }\n    },\n    \"GeneratedIds\": {\n      \"id\": \"GeneratedIds\",\n      \"description\": \"A list of generated file IDs which can be provided in create requests.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"ids\": {\n          \"description\": \"The IDs generated for the requesting user in the specified space.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"space\": {\n          \"description\": \"The type of file that can be created with these IDs.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#generatedIds\\\"`.\",\n          \"default\": \"drive#generatedIds\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"FileList\": {\n      \"id\": \"FileList\",\n      \"description\": \"A list of files.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nextPageToken\": {\n          \"description\": \"The page token for the next page of files. This will be absent if the end of the files list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results. The page token is typically valid for several hours. However, if new items are added or removed, your expected results might differ.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#fileList\\\"`.\",\n          \"default\": \"drive#fileList\",\n          \"type\": \"string\"\n        },\n        \"incompleteSearch\": {\n          \"description\": \"Whether the search process was incomplete. If true, then some search results might be missing, since all documents were not searched. This can occur when searching multiple drives with the `allDrives` corpora, but all corpora couldn't be searched. When this happens, it's suggested that clients narrow their query by choosing a different corpus such as `user` or `drive`.\",\n          \"type\": \"boolean\"\n        },\n        \"files\": {\n          \"description\": \"The list of files. If `nextPageToken` is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"File\"\n          }\n        }\n      }\n    },\n    \"LabelList\": {\n      \"id\": \"LabelList\",\n      \"description\": \"A list of labels applied to a file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"labels\": {\n          \"description\": \"The list of labels.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Label\"\n          }\n        },\n        \"nextPageToken\": {\n          \"description\": \"The page token for the next page of labels. This field will be absent if the end of the list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results. The page token is typically valid for several hours. However, if new items are added or removed, your expected results might differ.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"This is always `\\\"drive#labelList\\\"`.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ModifyLabelsRequest\": {\n      \"id\": \"ModifyLabelsRequest\",\n      \"description\": \"A request to modify the set of labels on a file. This request may contain many modifications that will either all succeed or all fail atomically.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"labelModifications\": {\n          \"description\": \"The list of modifications to apply to the labels on the file.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"LabelModification\"\n          }\n        },\n        \"kind\": {\n          \"description\": \"This is always `\\\"drive#modifyLabelsRequest\\\"`.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"LabelModification\": {\n      \"id\": \"LabelModification\",\n      \"description\": \"A modification to a label on a file. A `LabelModification` can be used to apply a label to a file, update an existing label on a file, or remove a label from a file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"labelId\": {\n          \"description\": \"The ID of the label to modify.\",\n          \"annotations\": {\n            \"required\": [\n              \"drive.files.modifyLabels\"\n            ]\n          },\n          \"type\": \"string\"\n        },\n        \"fieldModifications\": {\n          \"description\": \"The list of modifications to this label's fields.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"LabelFieldModification\"\n          }\n        },\n        \"removeLabel\": {\n          \"description\": \"If true, the label will be removed from the file.\",\n          \"type\": \"boolean\"\n        },\n        \"kind\": {\n          \"description\": \"This is always `\\\"drive#labelModification\\\"`.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"LabelFieldModification\": {\n      \"id\": \"LabelFieldModification\",\n      \"description\": \"A modification to a label's field.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"fieldId\": {\n          \"description\": \"The ID of the field to be modified.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"This is always `\\\"drive#labelFieldModification\\\"`.\",\n          \"type\": \"string\"\n        },\n        \"setDateValues\": {\n          \"description\": \"Replaces the value of a dateString Field with these new values. The string must be in the RFC 3339 full-date format: YYYY-MM-DD.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"format\": \"date\"\n          }\n        },\n        \"setTextValues\": {\n          \"description\": \"Sets the value of a `text` field.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"setSelectionValues\": {\n          \"description\": \"Replaces a `selection` field with these new values.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"setIntegerValues\": {\n          \"description\": \"Replaces the value of an `integer` field with these new values.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"format\": \"int64\"\n          }\n        },\n        \"setUserValues\": {\n          \"description\": \"Replaces a `user` field with these new values. The values must be a valid email addresses.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"unsetValues\": {\n          \"description\": \"Unsets the values for this field.\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"ModifyLabelsResponse\": {\n      \"id\": \"ModifyLabelsResponse\",\n      \"description\": \"Response to a `ModifyLabels` request. This contains only those labels which were added or updated by the request.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"modifiedLabels\": {\n          \"description\": \"The list of labels which were added or updated by the request.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Label\"\n          }\n        },\n        \"kind\": {\n          \"description\": \"This is always `\\\"drive#modifyLabelsResponse\\\"`.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"PermissionList\": {\n      \"id\": \"PermissionList\",\n      \"description\": \"A list of permissions for a file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nextPageToken\": {\n          \"description\": \"The page token for the next page of permissions. This field will be absent if the end of the permissions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results. The page token is typically valid for several hours. However, if new items are added or removed, your expected results might differ.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#permissionList\\\"`.\",\n          \"default\": \"drive#permissionList\",\n          \"type\": \"string\"\n        },\n        \"permissions\": {\n          \"description\": \"The list of permissions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Permission\"\n          }\n        }\n      }\n    },\n    \"ReplyList\": {\n      \"id\": \"ReplyList\",\n      \"description\": \"A list of replies to a comment on a file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#replyList\\\"`.\",\n          \"default\": \"drive#replyList\",\n          \"type\": \"string\"\n        },\n        \"replies\": {\n          \"description\": \"The list of replies. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Reply\"\n          }\n        },\n        \"nextPageToken\": {\n          \"description\": \"The page token for the next page of replies. This will be absent if the end of the replies list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results. The page token is typically valid for several hours. However, if new items are added or removed, your expected results might differ.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Revision\": {\n      \"id\": \"Revision\",\n      \"description\": \"The metadata for a revision to a file. Some resource methods (such as `revisions.update`) require a `revisionId`. Use the `revisions.list` method to retrieve the ID for a revision.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Output only. The ID of the revision.\",\n          \"type\": \"string\"\n        },\n        \"mimeType\": {\n          \"description\": \"Output only. The MIME type of the revision.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Output only. Identifies what kind of resource this is. Value: the fixed string `\\\"drive#revision\\\"`.\",\n          \"default\": \"drive#revision\",\n          \"type\": \"string\"\n        },\n        \"published\": {\n          \"description\": \"Whether this revision is published. This is only applicable to Docs Editors files.\",\n          \"type\": \"boolean\"\n        },\n        \"exportLinks\": {\n          \"description\": \"Output only. Links for exporting Docs Editors files to specific formats.\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"keepForever\": {\n          \"description\": \"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file. This field is only applicable to files with binary content in Drive.\",\n          \"type\": \"boolean\"\n        },\n        \"md5Checksum\": {\n          \"description\": \"Output only. The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\",\n          \"type\": \"string\"\n        },\n        \"modifiedTime\": {\n          \"description\": \"The last time the revision was modified (RFC 3339 date-time).\",\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"publishAuto\": {\n          \"description\": \"Whether subsequent revisions will be automatically republished. This is only applicable to Docs Editors files.\",\n          \"type\": \"boolean\"\n        },\n        \"publishedOutsideDomain\": {\n          \"description\": \"Whether this revision is published outside the domain. This is only applicable to Docs Editors files.\",\n          \"type\": \"boolean\"\n        },\n        \"publishedLink\": {\n          \"description\": \"Output only. A link to the published revision. This is only populated for Docs Editors files.\",\n          \"type\": \"string\"\n        },\n        \"size\": {\n          \"description\": \"Output only. The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\",\n          \"type\": \"string\",\n          \"format\": \"int64\"\n        },\n        \"originalFilename\": {\n          \"description\": \"Output only. The original filename used to create this revision. This is only applicable to files with binary content in Drive.\",\n          \"type\": \"string\"\n        },\n        \"lastModifyingUser\": {\n          \"description\": \"Output only. The last user to modify this revision. This field is only populated when the last modification was performed by a signed-in user.\",\n          \"$ref\": \"User\"\n        }\n      }\n    },\n    \"RevisionList\": {\n      \"id\": \"RevisionList\",\n      \"description\": \"A list of revisions of a file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nextPageToken\": {\n          \"description\": \"The page token for the next page of revisions. This will be absent if the end of the revisions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results. The page token is typically valid for several hours. However, if new items are added or removed, your expected results might differ.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#revisionList\\\"`.\",\n          \"default\": \"drive#revisionList\",\n          \"type\": \"string\"\n        },\n        \"revisions\": {\n          \"description\": \"The list of revisions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"Revision\"\n          }\n        }\n      }\n    },\n    \"TeamDriveList\": {\n      \"id\": \"TeamDriveList\",\n      \"description\": \"A list of Team Drives.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"nextPageToken\": {\n          \"description\": \"The page token for the next page of Team Drives. This will be absent if the end of the Team Drives list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results. The page token is typically valid for several hours. However, if new items are added or removed, your expected results might differ.\",\n          \"type\": \"string\"\n        },\n        \"kind\": {\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string `\\\"drive#teamDriveList\\\"`.\",\n          \"default\": \"drive#teamDriveList\",\n          \"type\": \"string\"\n        },\n        \"teamDrives\": {\n          \"description\": \"The list of Team Drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"TeamDrive\"\n          }\n        }\n      }\n    },\n    \"AccessProposal\": {\n      \"id\": \"AccessProposal\",\n      \"description\": \"The Access Proposal resource for outstanding access proposals on a file\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"fileId\": {\n          \"description\": \"The file id that the proposal for access is on\",\n          \"type\": \"string\"\n        },\n        \"proposalId\": {\n          \"description\": \"The id of the access proposal\",\n          \"type\": \"string\"\n        },\n        \"requesterEmailAddress\": {\n          \"description\": \"The email address of the requesting user\",\n          \"type\": \"string\"\n        },\n        \"recipientEmailAddress\": {\n          \"description\": \"The email address of the user that will receive permissions if accepted\",\n          \"type\": \"string\"\n        },\n        \"rolesAndViews\": {\n          \"description\": \"A wrapper for the role and view of an access proposal.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"AccessProposalRoleAndView\"\n          }\n        },\n        \"requestMessage\": {\n          \"description\": \"The message that the requester added to the proposal\",\n          \"type\": \"string\"\n        },\n        \"createTime\": {\n          \"description\": \"The creation time\",\n          \"type\": \"string\",\n          \"format\": \"google-datetime\"\n        }\n      }\n    },\n    \"AccessProposalRoleAndView\": {\n      \"id\": \"AccessProposalRoleAndView\",\n      \"description\": \"A wrapper for the role and view of an access proposal.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"role\": {\n          \"description\": \"The role that was proposed by the requester New values may be added in the future, but the following are currently possible: * `writer` * `commenter` * `reader`\",\n          \"type\": \"string\"\n        },\n        \"view\": {\n          \"description\": \"Indicates the view for this access proposal. Only populated for proposals that belong to a view. `published` is the only supported value.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ResolveAccessProposalRequest\": {\n      \"id\": \"ResolveAccessProposalRequest\",\n      \"description\": \"Request message for resolving an AccessProposal on a file.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"role\": {\n          \"description\": \"Optional. The roles the approver has allowed, if any. Note: This field is required for the `ACCEPT` action.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"view\": {\n          \"description\": \"Optional. Indicates the view for this access proposal. This should only be set when the proposal belongs to a view. `published` is the only supported value.\",\n          \"type\": \"string\"\n        },\n        \"action\": {\n          \"description\": \"Required. The action to take on the AccessProposal.\",\n          \"type\": \"string\",\n          \"enumDescriptions\": [\n            \"Unspecified action\",\n            \"The user accepts the proposal. Note: If this action is used, the `role` field must have at least one value.\",\n            \"The user denies the proposal\"\n          ],\n          \"enum\": [\n            \"ACTION_UNSPECIFIED\",\n            \"ACCEPT\",\n            \"DENY\"\n          ]\n        },\n        \"sendNotification\": {\n          \"description\": \"Optional. Whether to send an email to the requester when the AccessProposal is denied or accepted.\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"ListAccessProposalsResponse\": {\n      \"id\": \"ListAccessProposalsResponse\",\n      \"description\": \"The response to an Access Proposal list request.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"accessProposals\": {\n          \"description\": \"The list of Access Proposals. This field is only populated in v3 and v3beta.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"AccessProposal\"\n          }\n        },\n        \"nextPageToken\": {\n          \"description\": \"The continuation token for the next page of results. This will be absent if the end of the results list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\",\n          \"type\": \"string\"\n        }\n      }\n    }\n  },\n  \"parameters\": {\n    \"access_token\": {\n      \"type\": \"string\",\n      \"description\": \"OAuth access token.\",\n      \"location\": \"query\"\n    },\n    \"alt\": {\n      \"type\": \"string\",\n      \"description\": \"Data format for response.\",\n      \"default\": \"json\",\n      \"enum\": [\n        \"json\",\n        \"media\",\n        \"proto\"\n      ],\n      \"enumDescriptions\": [\n        \"Responses with Content-Type of application/json\",\n        \"Media download with context-dependent Content-Type\",\n        \"Responses with Content-Type of application/x-protobuf\"\n      ],\n      \"location\": \"query\"\n    },\n    \"callback\": {\n      \"type\": \"string\",\n      \"description\": \"JSONP\",\n      \"location\": \"query\"\n    },\n    \"fields\": {\n      \"type\": \"string\",\n      \"description\": \"Selector specifying which fields to include in a partial response.\",\n      \"location\": \"query\"\n    },\n    \"key\": {\n      \"type\": \"string\",\n      \"description\": \"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\",\n      \"location\": \"query\"\n    },\n    \"oauth_token\": {\n      \"type\": \"string\",\n      \"description\": \"OAuth 2.0 token for the current user.\",\n      \"location\": \"query\"\n    },\n    \"prettyPrint\": {\n      \"type\": \"boolean\",\n      \"description\": \"Returns response with indentations and line breaks.\",\n      \"default\": \"true\",\n      \"location\": \"query\"\n    },\n    \"quotaUser\": {\n      \"type\": \"string\",\n      \"description\": \"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.\",\n      \"location\": \"query\"\n    },\n    \"upload_protocol\": {\n      \"type\": \"string\",\n      \"description\": \"Upload protocol for media (e.g. \\\"raw\\\", \\\"multipart\\\").\",\n      \"location\": \"query\"\n    },\n    \"uploadType\": {\n      \"type\": \"string\",\n      \"description\": \"Legacy upload protocol for media (e.g. \\\"media\\\", \\\"multipart\\\").\",\n      \"location\": \"query\"\n    },\n    \"$.xgafv\": {\n      \"type\": \"string\",\n      \"description\": \"V1 error format.\",\n      \"enum\": [\n        \"1\",\n        \"2\"\n      ],\n      \"enumDescriptions\": [\n        \"v1 error format\",\n        \"v2 error format\"\n      ],\n      \"location\": \"query\"\n    }\n  },\n  \"name\": \"drive\",\n  \"version\": \"v3\",\n  \"revision\": \"20250829\"\n}\n\n"
  },
  {
    "path": "data-raw/export-mime-type-defaults.csv",
    "content": "mime_type_google, mime_type_local\napplication/vnd.google-apps.document,application/vnd.openxmlformats-officedocument.wordprocessingml.document\napplication/vnd.google-apps.drawing,image/png\napplication/vnd.google-apps.form,application/zip\napplication/vnd.google-apps.presentation,application/vnd.openxmlformats-officedocument.presentationml.presentation\napplication/vnd.google-apps.script,application/vnd.google-apps.script+json\napplication/vnd.google-apps.spreadsheet,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\n"
  },
  {
    "path": "data-raw/extension-mime-type-defaults.csv",
    "content": "mime_type,ext\r\ntext/tab-separated-values,tsv\r\nimage/jpeg,jpeg\r\nimage/gif,gif\r\napplication/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx\r\napplication/vnd.openxmlformats-officedocument.wordprocessingml.document,docx\r\napplication/vnd.ms-excel,xls\r\napplication/vnd.sun.xml.writer,sxw\r\ntext/plain,txt\r\napplication/vnd.oasis.opendocument.spreadsheet,ods\r\nimage/png,png\r\napplication/msword,doc\r\napplication/pdf,pdf\r\napplication/json,json\r\napplication/vnd.openxmlformats-officedocument.spreadsheetml.template,xltx\r\napplication/vnd.ms-powerpoint,ppt\r\napplication/rtf,rtf\r\napplication/vnd.openxmlformats-officedocument.presentationml.template,potx\r\ntext/html,html\r\napplication/vnd.oasis.opendocument.text,odt\r\napplication/vnd.openxmlformats-officedocument.presentationml.presentation,pptx\r\napplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx\r\napplication/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx\r\ntext/csv,csv\r\napplication/vnd.oasis.opendocument.presentation,odp\r\ntext/richtext,rtx\r\napplication/zip,zip\r\nimage/svg+xml,svg\r\ntext/markdown,md\r\n"
  },
  {
    "path": "data-raw/file-fields.R",
    "content": "library(here)\nlibrary(jsonlite)\nlibrary(tidyverse)\nlibrary(fs)\n\njson_fname <- dir_ls(here(\"data-raw\"), regexp = \"drive-v3\")\nstopifnot(length(json_fname) == 1)\ndd_content <- fromJSON(json_fname)\n\nff <- pluck(dd_content, \"schemas\", \"File\", \"properties\")\ndf <- tibble(\n  name = names(ff),\n  desc = map_chr(ff, \"description\")\n)\ndf <- df |>\n  arrange(name)\n\nwrite_csv(df, here(\"inst\", \"extdata\", \"data\", \"files_fields.csv\"))\n"
  },
  {
    "path": "data-raw/mime-types-and-file-extensions.R",
    "content": "# Generate a table associating file extensions or \"type\" with MIME types.\n# Used in drive_mime_type() to do these sorts of translations:\n# Input type                        Input          MIME type\n# ---------------------------------|--------------|-----------------------------------------\n# Casual name for native Drive type \"spreadsheet\"  \"application/vnd.google-apps.spreadsheet\"\n# File extension                    \"jpeg\"         \"image/jpeg\"\n# MIME type                         \"image/gif\"    \"image/gif\"\n\n# So we need to muster file types, file extensions, and MIME types.\n\nlibrary(here)\nlibrary(tidyverse)\nlibrary(httr)\nlibrary(rvest)\n\n# The following table lists MIME types that are specific Google Workspace and\n# Google Drive\nurl <- \"https://developers.google.com/drive/api/v3/mime-types\"\n\ngoogle_mime_types <- GET(url) %>%\n  content() %>%\n  html_table(fill = TRUE) %>%\n  flatten() %>%\n  as_tibble() %>%\n  select(\n    mime_type = `MIME Type`,\n    description = Description\n  ) %>%\n  mutate(description = na_if(description, \"\"))\nnrow(google_mime_types) # 20\n\n# Another table we've made for the import and export MIME types for native Drive\n# files.\nimport_and_export <- read_csv(\n  file = here(\"inst\", \"extdata\", \"data\", \"translate_mime_types.csv\")\n)\n\n# Take the local MIME types that are supported for import or export, get rid of\n# duplicates, and add them to the Google Drive/Workspace-specific MIME types.\nmime_tbl <- import_and_export %>%\n  select(mime_type = mime_type_local) %>%\n  distinct() %>%\n  bind_rows(google_mime_types)\nnrow(mime_tbl)\n# 69 rows, i.e. 69 MIME types\n\n# mime::mimemap is a good source of associations between MIME types and  file\n# extensions.\nmime_ext <- mime::mimemap %>%\n  enframe(name = \"ext\", value = \"mime_type\") %>%\n  select(mime_type, ext)\nnrow(mime_ext) # 1548\nmime_ext %>%\n  summarise(across(everything(), n_distinct))\n# # A tibble: 1 × 2\n#   mime_type   ext\n#       <int> <int>\n# 1      1203  1548\n\nmime_tbl_2 <- mime_ext %>%\n  right_join(mime_tbl, by = \"mime_type\")\nnrow(mime_tbl_2) # 88\n# 69 -> 88 rows, because some MIME types are associated with multiple extensions\n\n# Example: JPEGs\nmime_tbl_2 |>\n  filter(str_detect(mime_type, \"image/jpeg\"))\n# # A tibble: 4 × 3\n#   mime_type  ext   description\n#   <chr>      <chr> <chr>\n# 1 image/jpeg jpeg  NA\n# 2 image/jpeg jpg   NA\n# 3 image/jpeg jpe   NA\n# 4 image/jpeg jfif  NA\n\n# weird that \"text/rtf\" appears in the Google Drive/Workspace world, but is not\n# covered by mime::mimemap\nmime_tbl_2 |>\n  filter(str_detect(mime_type, \"rtf\"))\n# # A tibble: 2 × 3\n#   mime_type       ext   description\n#   <chr>           <chr> <chr>\n# 1 application/rtf rtf   NA\n# 2 text/rtf        NA    NA\n\nmime_tbl_2 |>\n  group_by(mime_type) |>\n  count(sort = TRUE) |>\n  filter(n > 1)\n# # A tibble: 8 × 2\n# # Groups:   mime_type [8]\n#   mime_type                         n\n#   <chr>                         <int>\n# 1 application/vnd.ms-excel          6\n# 2 text/plain                        5\n# 3 image/jpeg                        4\n# 4 text/html                         3\n# 5 video/mp4                         3\n# 6 application/vnd.ms-powerpoint     2\n# 7 image/svg+xml                     2\n# 8 text/markdown                     2\n\n# We're going to need to resolve such situations where we can by declaring a\n# default extension for such MIME types.\n\n# Proposal: any MIME type that appears in the official export (and maybe\n# import?) list should have an associated file extension.\n# Note that this is *not* about import/export, but rather about upload/download.\n# We're just referring to import/export as a semi-authoritative source of\n# important MIME types.\n\nmime_tbl_2 |>\n  arrange(mime_type) |>\n  print(n = Inf)\n\nmime_tbl_2 |>\n  filter(is.na(ext)) |>\n  arrange(mime_type) |>\n  print(n = Inf)\n# rows that catch my eye\n# ...\n# 34 image/jpg                                                  NA    NA\n# ...\n# 36 image/x-bmp                                                NA    NA\n# 37 image/x-png                                                NA    NA\n# 38 text/richtext                                              NA    NA\n# 39 text/rtf                                                   NA    NA\n# 40 text/x-markdown                                            NA    NA\n\n# Fixup for special Google Drive/Workspace MIME types\ngoogle_prefix <- \"application/vnd.google-apps.\"\nmime_tbl_3 <- mime_tbl_2 %>%\n  mutate(\n    human_type = ifelse(\n      grepl(google_prefix, mime_type, fixed = TRUE),\n      sub(google_prefix, \"\", mime_type, fixed = TRUE),\n      ext\n    )\n  )\n\nmime_tbl_3 |>\n  arrange(mime_type) |>\n  print(n = Inf)\n\nmime_tbl_3 |>\n  count(is.na(ext))\n# # A tibble: 2 × 2\n#   `is.na(ext)`     n\n#   <lgl>        <int>\n# 1 FALSE           48\n# 2 TRUE            40\n\n# Where did this csv come from? these must be my choices\ndefault_ext <- here(\"data-raw\", \"extension-mime-type-defaults.csv\") %>%\n  read_csv() %>%\n  mutate(default = TRUE)\n\nmime_tbl_4 <- mime_tbl_3 %>%\n  left_join(default_ext) %>%\n  mutate(\n    default = case_when(\n      is.na(ext) ~ NA,\n      is.na(default) ~ FALSE,\n      TRUE ~ TRUE\n    )\n  )\n\nmime_tbl_5 <- mime_tbl_4 %>%\n  add_row(\n    # TODO(jennybc): consider also \"application/vnd.google.colaboratory\"\n    mime_type = \"application/vnd.google.colab\",\n    ext = \"ipynb\",\n    description = \"Colab notebook\",\n    human_type = \"colab\",\n    default = TRUE\n  )\n\n# I want to set up extension affiliation for MIME types:\n# text/richtext --> rtf\n# text/rtf      --> rtf\n# text/x-markdown --> md\n# fmt: skip\npatch <- tribble(\n  ~mime_type, ~ext, ~default,\n  \"text/richtext\", \"rtf\", TRUE,\n  \"text/rtf\", \"rtf\", TRUE,\n  \"text/x-markdown\", \"md\", TRUE\n\n)\nmime_tbl_6 <- mime_tbl_5 %>%\n  rows_patch(patch, by = \"mime_type\") |>\n  arrange(mime_type, ext)\n\nwrite_csv(mime_tbl_6, file = here(\"inst\", \"extdata\", \"data\", \"mime_tbl.csv\"))\n"
  },
  {
    "path": "data-raw/mime-types-google.R",
    "content": "# Generate a table of MIME types that maps between types that are specific to\n# Google Workspace and Google Drive and other MIME types\n\n# For example, what MIME types can be uploaded and converted to a Sheet?\n# Excel or csv, etc.\n\n# What MIME types can a Sheet be exported to as a local file?\n# Excel or csv or even pdf\n\n# Google Workspace and Google Drive supported MIME types\n# Example: application/vnd.google-apps.spreadsheet\n# https://developers.google.com/drive/api/v3/mime-types\n\n# https://developers.google.com/drive/api/v3/manage-downloads\n\n# Export MIME types for Google Workspace documents\n# https://developers.google.com/workspace/drive/api/guides/ref-export-formats\n\nlibrary(tidyverse)\nlibrary(here)\nlibrary(googledrive)\n\n# it doesn't matter who you auth as, but you need to auth as somebody\ngoogledrive:::drive_auth_testing()\n\n# MIME types for local file <--> Drive file\nabout <- drive_about()\nfmts <- about[c(\"importFormats\", \"exportFormats\")]\n\nimports <- fmts %>%\n  pluck(\"importFormats\") %>%\n  enframe(\n    name = \"mime_type_local\",\n    value = \"mime_type_google\"\n  ) %>%\n  unnest_longer(mime_type_google) %>%\n  mutate(action = \"import\")\n\nexports <- fmts %>%\n  pluck(\"exportFormats\") %>%\n  enframe(\n    name = \"mime_type_google\",\n    value = \"mime_type_local\"\n  ) %>%\n  unnest_longer(mime_type_local) %>%\n  mutate(action = \"export\")\n\ntranslate_mime_types <- bind_rows(imports, exports)\n\n# where did this csv come from? these must be my decisions, because the\n# drive.files.export endpoint has `mimeType` as a required query parameter, i.e.\n# I see no basis for saying that the Drive API has default export MIME types\ndefaults <- here(\"data-raw\", \"export-mime-type-defaults.csv\") %>%\n  read_csv() %>%\n  mutate(\n    action = \"export\",\n    default = TRUE\n  )\n\ntranslate_mime_types <- translate_mime_types %>%\n  left_join(defaults) %>%\n  mutate(\n    default = case_when(\n      action == \"import\" ~ NA,\n      is.na(default) ~ FALSE,\n      TRUE ~ TRUE\n    )\n  )\n\n# be intentional about row order so diffs are easier to make sense of\n# I think it also makes sense to set column order accordingly\ntranslate_mime_types <- translate_mime_types %>%\n  arrange(action, mime_type_google, mime_type_local) %>%\n  select(action, mime_type_google, everything())\n\nwrite_csv(\n  translate_mime_types,\n  file = here(\"inst\", \"extdata\", \"data\", \"translate_mime_types.csv\")\n)\n"
  },
  {
    "path": "data-raw/old/20170519_drive-v3_discovery-document.json",
    "content": "{\n  \"kind\": \"discovery#restDescription\",\n  \"etag\": \"\\\"YWOzh2SDasdU84ArJnpYek-OMdg/wH03RLGjiQZHXW-bECcrydLGp0c\\\"\",\n  \"discoveryVersion\": \"v1\",\n  \"id\": \"drive:v3\",\n  \"name\": \"drive\",\n  \"version\": \"v3\",\n  \"revision\": \"20170519\",\n  \"title\": \"Drive API\",\n  \"description\": \"Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.\",\n  \"ownerDomain\": \"google.com\",\n  \"ownerName\": \"Google\",\n  \"icons\": {\n    \"x16\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png\",\n    \"x32\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png\"\n  },\n  \"documentationLink\": \"https://developers.google.com/drive/\",\n  \"protocol\": \"rest\",\n  \"baseUrl\": \"https://www.googleapis.com/drive/v3/\",\n  \"basePath\": \"/drive/v3/\",\n  \"rootUrl\": \"https://www.googleapis.com/\",\n  \"servicePath\": \"drive/v3/\",\n  \"batchPath\": \"batch\",\n  \"parameters\": {\n    \"alt\": {\n      \"type\": \"string\",\n      \"description\": \"Data format for the response.\",\n      \"default\": \"json\",\n      \"enum\": [\n        \"json\"\n        ],\n      \"enumDescriptions\": [\n        \"Responses with Content-Type of application/json\"\n        ],\n      \"location\": \"query\"\n    },\n    \"fields\": {\n      \"type\": \"string\",\n      \"description\": \"Selector specifying which fields to include in a partial response.\",\n      \"location\": \"query\"\n    },\n    \"key\": {\n      \"type\": \"string\",\n      \"description\": \"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\",\n      \"location\": \"query\"\n    },\n    \"oauth_token\": {\n      \"type\": \"string\",\n      \"description\": \"OAuth 2.0 token for the current user.\",\n      \"location\": \"query\"\n    },\n    \"prettyPrint\": {\n      \"type\": \"boolean\",\n      \"description\": \"Returns response with indentations and line breaks.\",\n      \"default\": \"true\",\n      \"location\": \"query\"\n    },\n    \"quotaUser\": {\n      \"type\": \"string\",\n      \"description\": \"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\",\n      \"location\": \"query\"\n    },\n    \"userIp\": {\n      \"type\": \"string\",\n      \"description\": \"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\",\n      \"location\": \"query\"\n    }\n  },\n  \"auth\": {\n    \"oauth2\": {\n      \"scopes\": {\n        \"https://www.googleapis.com/auth/drive\": {\n          \"description\": \"View and manage the files in your Google Drive\"\n        },\n        \"https://www.googleapis.com/auth/drive.appdata\": {\n          \"description\": \"View and manage its own configuration data in your Google Drive\"\n        },\n        \"https://www.googleapis.com/auth/drive.file\": {\n          \"description\": \"View and manage Google Drive files and folders that you have opened or created with this app\"\n        },\n        \"https://www.googleapis.com/auth/drive.metadata\": {\n          \"description\": \"View and manage metadata of files in your Google Drive\"\n        },\n        \"https://www.googleapis.com/auth/drive.metadata.readonly\": {\n          \"description\": \"View metadata for files in your Google Drive\"\n        },\n        \"https://www.googleapis.com/auth/drive.photos.readonly\": {\n          \"description\": \"View the photos, videos and albums in your Google Photos\"\n        },\n        \"https://www.googleapis.com/auth/drive.readonly\": {\n          \"description\": \"View the files in your Google Drive\"\n        },\n        \"https://www.googleapis.com/auth/drive.scripts\": {\n          \"description\": \"Modify your Google Apps Script scripts' behavior\"\n        }\n      }\n    }\n  },\n  \"schemas\": {\n    \"About\": {\n      \"id\": \"About\",\n      \"type\": \"object\",\n      \"description\": \"Information about the user, the user's Drive, and system capabilities.\",\n      \"properties\": {\n        \"appInstalled\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the user has installed the requesting app.\"\n        },\n        \"exportFormats\": {\n          \"type\": \"object\",\n          \"description\": \"A map of source MIME type to possible targets for all supported exports.\",\n          \"additionalProperties\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"folderColorPalette\": {\n          \"type\": \"array\",\n          \"description\": \"The currently supported folder colors as RGB hex strings.\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"importFormats\": {\n          \"type\": \"object\",\n          \"description\": \"A map of source MIME type to possible targets for all supported imports.\",\n          \"additionalProperties\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#about\\\".\",\n          \"default\": \"drive#about\"\n        },\n        \"maxImportSizes\": {\n          \"type\": \"object\",\n          \"description\": \"A map of maximum import sizes by MIME type, in bytes.\",\n          \"additionalProperties\": {\n            \"type\": \"string\",\n            \"format\": \"int64\"\n          }\n        },\n        \"maxUploadSize\": {\n          \"type\": \"string\",\n          \"description\": \"The maximum upload size in bytes.\",\n          \"format\": \"int64\"\n        },\n        \"storageQuota\": {\n          \"type\": \"object\",\n          \"description\": \"The user's storage quota limits and usage. All fields are measured in bytes.\",\n          \"properties\": {\n            \"limit\": {\n              \"type\": \"string\",\n              \"description\": \"The usage limit, if applicable. This will not be present if the user has unlimited storage.\",\n              \"format\": \"int64\"\n            },\n            \"usage\": {\n              \"type\": \"string\",\n              \"description\": \"The total usage across all services.\",\n              \"format\": \"int64\"\n            },\n            \"usageInDrive\": {\n              \"type\": \"string\",\n              \"description\": \"The usage by all files in Google Drive.\",\n              \"format\": \"int64\"\n            },\n            \"usageInDriveTrash\": {\n              \"type\": \"string\",\n              \"description\": \"The usage by trashed files in Google Drive.\",\n              \"format\": \"int64\"\n            }\n          }\n        },\n        \"teamDriveThemes\": {\n          \"type\": \"array\",\n          \"description\": \"A list of themes that are supported for Team Drives.\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"backgroundImageLink\": {\n                \"type\": \"string\",\n                \"description\": \"A link to this Team Drive theme's background image.\"\n              },\n              \"colorRgb\": {\n                \"type\": \"string\",\n                \"description\": \"The color of this Team Drive theme as an RGB hex string.\"\n              },\n              \"id\": {\n                \"type\": \"string\",\n                \"description\": \"The ID of the theme.\"\n              }\n            }\n          }\n        },\n        \"user\": {\n          \"$ref\": \"User\",\n          \"description\": \"The authenticated user.\"\n        }\n      }\n    },\n    \"Change\": {\n      \"id\": \"Change\",\n      \"type\": \"object\",\n      \"description\": \"A change to a file or Team Drive.\",\n      \"properties\": {\n        \"file\": {\n          \"$ref\": \"File\",\n          \"description\": \"The updated state of the file. Present if the type is file and the file has not been removed from this list of changes.\"\n        },\n        \"fileId\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of the file which has changed.\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#change\\\".\",\n          \"default\": \"drive#change\"\n        },\n        \"removed\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the file or Team Drive has been removed from this list of changes, for example by deletion or loss of access.\"\n        },\n        \"teamDrive\": {\n          \"$ref\": \"TeamDrive\",\n          \"description\": \"The updated state of the Team Drive. Present if the type is teamDrive, the user is still a member of the Team Drive, and the Team Drive has not been removed.\"\n        },\n        \"teamDriveId\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of the Team Drive associated with this change.\"\n        },\n        \"time\": {\n          \"type\": \"string\",\n          \"description\": \"The time of this change (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        },\n        \"type\": {\n          \"type\": \"string\",\n          \"description\": \"The type of the change. Possible values are file and teamDrive.\"\n        }\n      }\n    },\n    \"ChangeList\": {\n      \"id\": \"ChangeList\",\n      \"type\": \"object\",\n      \"description\": \"A list of changes for a user.\",\n      \"properties\": {\n        \"changes\": {\n          \"type\": \"array\",\n          \"description\": \"The list of changes. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"items\": {\n            \"$ref\": \"Change\"\n          }\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#changeList\\\".\",\n          \"default\": \"drive#changeList\"\n        },\n        \"newStartPageToken\": {\n          \"type\": \"string\",\n          \"description\": \"The starting page token for future changes. This will be present only if the end of the current changes list has been reached.\"\n        },\n        \"nextPageToken\": {\n          \"type\": \"string\",\n          \"description\": \"The page token for the next page of changes. This will be absent if the end of the changes list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n        }\n      }\n    },\n    \"Channel\": {\n      \"id\": \"Channel\",\n      \"type\": \"object\",\n      \"description\": \"An notification channel used to watch for resource changes.\",\n      \"properties\": {\n        \"address\": {\n          \"type\": \"string\",\n          \"description\": \"The address where notifications are delivered for this channel.\"\n        },\n        \"expiration\": {\n          \"type\": \"string\",\n          \"description\": \"Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.\",\n          \"format\": \"int64\"\n        },\n        \"id\": {\n          \"type\": \"string\",\n          \"description\": \"A UUID or similar unique string that identifies this channel.\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies this as a notification channel used to watch for changes to a resource. Value: the fixed string \\\"api#channel\\\".\",\n          \"default\": \"api#channel\"\n        },\n        \"params\": {\n          \"type\": \"object\",\n          \"description\": \"Additional parameters controlling delivery channel behavior. Optional.\",\n          \"additionalProperties\": {\n            \"type\": \"string\",\n            \"description\": \"Declares a new parameter by name.\"\n          }\n        },\n        \"payload\": {\n          \"type\": \"boolean\",\n          \"description\": \"A Boolean value to indicate whether payload is wanted. Optional.\"\n        },\n        \"resourceId\": {\n          \"type\": \"string\",\n          \"description\": \"An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.\"\n        },\n        \"resourceUri\": {\n          \"type\": \"string\",\n          \"description\": \"A version-specific identifier for the watched resource.\"\n        },\n        \"token\": {\n          \"type\": \"string\",\n          \"description\": \"An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.\"\n        },\n        \"type\": {\n          \"type\": \"string\",\n          \"description\": \"The type of delivery mechanism used for this channel.\"\n        }\n      }\n    },\n    \"Comment\": {\n      \"id\": \"Comment\",\n      \"type\": \"object\",\n      \"description\": \"A comment on a file.\",\n      \"properties\": {\n        \"anchor\": {\n          \"type\": \"string\",\n          \"description\": \"A region of the document represented as a JSON string. See anchor documentation for details on how to define and interpret anchor properties.\"\n        },\n        \"author\": {\n          \"$ref\": \"User\",\n          \"description\": \"The user who created the comment.\"\n        },\n        \"content\": {\n          \"type\": \"string\",\n          \"description\": \"The plain text content of the comment. This field is used for setting the content, while htmlContent should be displayed.\",\n          \"annotations\": {\n            \"required\": [\n              \"drive.comments.create\",\n              \"drive.comments.update\"\n              ]\n          }\n        },\n        \"createdTime\": {\n          \"type\": \"string\",\n          \"description\": \"The time at which the comment was created (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        },\n        \"deleted\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the comment has been deleted. A deleted comment has no content.\"\n        },\n        \"htmlContent\": {\n          \"type\": \"string\",\n          \"description\": \"The content of the comment with HTML formatting.\"\n        },\n        \"id\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of the comment.\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#comment\\\".\",\n          \"default\": \"drive#comment\"\n        },\n        \"modifiedTime\": {\n          \"type\": \"string\",\n          \"description\": \"The last time the comment or any of its replies was modified (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        },\n        \"quotedFileContent\": {\n          \"type\": \"object\",\n          \"description\": \"The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.\",\n          \"properties\": {\n            \"mimeType\": {\n              \"type\": \"string\",\n              \"description\": \"The MIME type of the quoted content.\"\n            },\n            \"value\": {\n              \"type\": \"string\",\n              \"description\": \"The quoted content itself. This is interpreted as plain text if set through the API.\"\n            }\n          }\n        },\n        \"replies\": {\n          \"type\": \"array\",\n          \"description\": \"The full list of replies to the comment in chronological order.\",\n          \"items\": {\n            \"$ref\": \"Reply\"\n          }\n        },\n        \"resolved\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the comment has been resolved by one of its replies.\"\n        }\n      }\n    },\n    \"CommentList\": {\n      \"id\": \"CommentList\",\n      \"type\": \"object\",\n      \"description\": \"A list of comments on a file.\",\n      \"properties\": {\n        \"comments\": {\n          \"type\": \"array\",\n          \"description\": \"The list of comments. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"items\": {\n            \"$ref\": \"Comment\"\n          }\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#commentList\\\".\",\n          \"default\": \"drive#commentList\"\n        },\n        \"nextPageToken\": {\n          \"type\": \"string\",\n          \"description\": \"The page token for the next page of comments. This will be absent if the end of the comments list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n        }\n      }\n    },\n    \"File\": {\n      \"id\": \"File\",\n      \"type\": \"object\",\n      \"description\": \"The metadata for a file.\",\n      \"properties\": {\n        \"appProperties\": {\n          \"type\": \"object\",\n          \"description\": \"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"capabilities\": {\n          \"type\": \"object\",\n          \"description\": \"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\",\n          \"properties\": {\n            \"canAddChildren\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can add children to this folder. This is always false when the item is not a folder.\"\n            },\n            \"canChangeViewersCanCopyContent\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can change whether viewers can copy the contents of this file.\"\n            },\n            \"canComment\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can comment on this file.\"\n            },\n            \"canCopy\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can copy this file. For a Team Drive item, whether the current user can copy non-folder descendants of this item, or this item itself if it is not a folder.\"\n            },\n            \"canDelete\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can delete this file.\"\n            },\n            \"canDownload\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can download this file.\"\n            },\n            \"canEdit\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can edit this file.\"\n            },\n            \"canListChildren\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can list the children of this folder. This is always false when the item is not a folder.\"\n            },\n            \"canMoveItemIntoTeamDrive\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can move this item into a Team Drive. If the item is in a Team Drive, this field is equivalent to canMoveTeamDriveItem.\"\n            },\n            \"canMoveTeamDriveItem\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can move this Team Drive item by changing its parent. Note that a request to change the parent for this item may still fail depending on the new parent that is being added. Only populated for Team Drive files.\"\n            },\n            \"canReadRevisions\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can read the revisions resource of this file. For a Team Drive item, whether revisions of non-folder descendants of this item, or this item itself if it is not a folder, can be read.\"\n            },\n            \"canReadTeamDrive\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can read the Team Drive to which this file belongs. Only populated for Team Drive files.\"\n            },\n            \"canRemoveChildren\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can remove children from this folder. This is always false when the item is not a folder.\"\n            },\n            \"canRename\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can rename this file.\"\n            },\n            \"canShare\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can modify the sharing settings for this file.\"\n            },\n            \"canTrash\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can move this file to trash.\"\n            },\n            \"canUntrash\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can restore this file from trash.\"\n            }\n          }\n        },\n        \"contentHints\": {\n          \"type\": \"object\",\n          \"description\": \"Additional information about the content of the file. These fields are never populated in responses.\",\n          \"properties\": {\n            \"indexableText\": {\n              \"type\": \"string\",\n              \"description\": \"Text to be indexed for the file to improve fullText queries. This is limited to 128KB in length and may contain HTML elements.\"\n            },\n            \"thumbnail\": {\n              \"type\": \"object\",\n              \"description\": \"A thumbnail for the file. This will only be used if Drive cannot generate a standard thumbnail.\",\n              \"properties\": {\n                \"image\": {\n                  \"type\": \"string\",\n                  \"description\": \"The thumbnail data encoded with URL-safe Base64 (RFC 4648 section 5).\",\n                  \"format\": \"byte\"\n                },\n                \"mimeType\": {\n                  \"type\": \"string\",\n                  \"description\": \"The MIME type of the thumbnail.\"\n                }\n              }\n            }\n          }\n        },\n        \"createdTime\": {\n          \"type\": \"string\",\n          \"description\": \"The time at which the file was created (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        },\n        \"description\": {\n          \"type\": \"string\",\n          \"description\": \"A short description of the file.\"\n        },\n        \"explicitlyTrashed\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"\n        },\n        \"fileExtension\": {\n          \"type\": \"string\",\n          \"description\": \"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"\n        },\n        \"folderColorRgb\": {\n          \"type\": \"string\",\n          \"description\": \"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"\n        },\n        \"fullFileExtension\": {\n          \"type\": \"string\",\n          \"description\": \"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"\n        },\n        \"hasAugmentedPermissions\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"\n        },\n        \"hasThumbnail\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"\n        },\n        \"headRevisionId\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"\n        },\n        \"iconLink\": {\n          \"type\": \"string\",\n          \"description\": \"A static, unauthenticated link to the file's icon.\"\n        },\n        \"id\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of the file.\"\n        },\n        \"imageMediaMetadata\": {\n          \"type\": \"object\",\n          \"description\": \"Additional metadata about image media, if available.\",\n          \"properties\": {\n            \"aperture\": {\n              \"type\": \"number\",\n              \"description\": \"The aperture used to create the photo (f-number).\",\n              \"format\": \"float\"\n            },\n            \"cameraMake\": {\n              \"type\": \"string\",\n              \"description\": \"The make of the camera used to create the photo.\"\n            },\n            \"cameraModel\": {\n              \"type\": \"string\",\n              \"description\": \"The model of the camera used to create the photo.\"\n            },\n            \"colorSpace\": {\n              \"type\": \"string\",\n              \"description\": \"The color space of the photo.\"\n            },\n            \"exposureBias\": {\n              \"type\": \"number\",\n              \"description\": \"The exposure bias of the photo (APEX value).\",\n              \"format\": \"float\"\n            },\n            \"exposureMode\": {\n              \"type\": \"string\",\n              \"description\": \"The exposure mode used to create the photo.\"\n            },\n            \"exposureTime\": {\n              \"type\": \"number\",\n              \"description\": \"The length of the exposure, in seconds.\",\n              \"format\": \"float\"\n            },\n            \"flashUsed\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether a flash was used to create the photo.\"\n            },\n            \"focalLength\": {\n              \"type\": \"number\",\n              \"description\": \"The focal length used to create the photo, in millimeters.\",\n              \"format\": \"float\"\n            },\n            \"height\": {\n              \"type\": \"integer\",\n              \"description\": \"The height of the image in pixels.\",\n              \"format\": \"int32\"\n            },\n            \"isoSpeed\": {\n              \"type\": \"integer\",\n              \"description\": \"The ISO speed used to create the photo.\",\n              \"format\": \"int32\"\n            },\n            \"lens\": {\n              \"type\": \"string\",\n              \"description\": \"The lens used to create the photo.\"\n            },\n            \"location\": {\n              \"type\": \"object\",\n              \"description\": \"Geographic location information stored in the image.\",\n              \"properties\": {\n                \"altitude\": {\n                  \"type\": \"number\",\n                  \"description\": \"The altitude stored in the image.\",\n                  \"format\": \"double\"\n                },\n                \"latitude\": {\n                  \"type\": \"number\",\n                  \"description\": \"The latitude stored in the image.\",\n                  \"format\": \"double\"\n                },\n                \"longitude\": {\n                  \"type\": \"number\",\n                  \"description\": \"The longitude stored in the image.\",\n                  \"format\": \"double\"\n                }\n              }\n            },\n            \"maxApertureValue\": {\n              \"type\": \"number\",\n              \"description\": \"The smallest f-number of the lens at the focal length used to create the photo (APEX value).\",\n              \"format\": \"float\"\n            },\n            \"meteringMode\": {\n              \"type\": \"string\",\n              \"description\": \"The metering mode used to create the photo.\"\n            },\n            \"rotation\": {\n              \"type\": \"integer\",\n              \"description\": \"The rotation in clockwise degrees from the image's original orientation.\",\n              \"format\": \"int32\"\n            },\n            \"sensor\": {\n              \"type\": \"string\",\n              \"description\": \"The type of sensor used to create the photo.\"\n            },\n            \"subjectDistance\": {\n              \"type\": \"integer\",\n              \"description\": \"The distance to the subject of the photo, in meters.\",\n              \"format\": \"int32\"\n            },\n            \"time\": {\n              \"type\": \"string\",\n              \"description\": \"The date and time the photo was taken (EXIF DateTime).\"\n            },\n            \"whiteBalance\": {\n              \"type\": \"string\",\n              \"description\": \"The white balance mode used to create the photo.\"\n            },\n            \"width\": {\n              \"type\": \"integer\",\n              \"description\": \"The width of the image in pixels.\",\n              \"format\": \"int32\"\n            }\n          }\n        },\n        \"isAppAuthorized\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the file was created or opened by the requesting app.\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\",\n          \"default\": \"drive#file\"\n        },\n        \"lastModifyingUser\": {\n          \"$ref\": \"User\",\n          \"description\": \"The last user to modify the file.\"\n        },\n        \"md5Checksum\": {\n          \"type\": \"string\",\n          \"description\": \"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"\n        },\n        \"mimeType\": {\n          \"type\": \"string\",\n          \"description\": \"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"\n        },\n        \"modifiedByMe\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the file has been modified by this user.\"\n        },\n        \"modifiedByMeTime\": {\n          \"type\": \"string\",\n          \"description\": \"The last time the file was modified by the user (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        },\n        \"modifiedTime\": {\n          \"type\": \"string\",\n          \"description\": \"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\",\n          \"format\": \"date-time\"\n        },\n        \"name\": {\n          \"type\": \"string\",\n          \"description\": \"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"\n        },\n        \"originalFilename\": {\n          \"type\": \"string\",\n          \"description\": \"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"\n        },\n        \"ownedByMe\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the user owns the file. Not populated for Team Drive files.\"\n        },\n        \"owners\": {\n          \"type\": \"array\",\n          \"description\": \"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\",\n          \"items\": {\n            \"$ref\": \"User\"\n          }\n        },\n        \"parents\": {\n          \"type\": \"array\",\n          \"description\": \"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"permissions\": {\n          \"type\": \"array\",\n          \"description\": \"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\",\n          \"items\": {\n            \"$ref\": \"Permission\"\n          }\n        },\n        \"properties\": {\n          \"type\": \"object\",\n          \"description\": \"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\",\n          \"additionalProperties\": {\n            \"type\": \"string\"\n          }\n        },\n        \"quotaBytesUsed\": {\n          \"type\": \"string\",\n          \"description\": \"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\",\n          \"format\": \"int64\"\n        },\n        \"shared\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the file has been shared. Not populated for Team Drive files.\"\n        },\n        \"sharedWithMeTime\": {\n          \"type\": \"string\",\n          \"description\": \"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        },\n        \"sharingUser\": {\n          \"$ref\": \"User\",\n          \"description\": \"The user who shared the file with the requesting user, if applicable.\"\n        },\n        \"size\": {\n          \"type\": \"string\",\n          \"description\": \"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\",\n          \"format\": \"int64\"\n        },\n        \"spaces\": {\n          \"type\": \"array\",\n          \"description\": \"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"starred\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the user has starred the file.\"\n        },\n        \"teamDriveId\": {\n          \"type\": \"string\",\n          \"description\": \"ID of the Team Drive the file resides in.\"\n        },\n        \"thumbnailLink\": {\n          \"type\": \"string\",\n          \"description\": \"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"\n        },\n        \"thumbnailVersion\": {\n          \"type\": \"string\",\n          \"description\": \"The thumbnail version for use in thumbnail cache invalidation.\",\n          \"format\": \"int64\"\n        },\n        \"trashed\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"\n        },\n        \"trashedTime\": {\n          \"type\": \"string\",\n          \"description\": \"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\",\n          \"format\": \"date-time\"\n        },\n        \"trashingUser\": {\n          \"$ref\": \"User\",\n          \"description\": \"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"\n        },\n        \"version\": {\n          \"type\": \"string\",\n          \"description\": \"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\",\n          \"format\": \"int64\"\n        },\n        \"videoMediaMetadata\": {\n          \"type\": \"object\",\n          \"description\": \"Additional metadata about video media. This may not be available immediately upon upload.\",\n          \"properties\": {\n            \"durationMillis\": {\n              \"type\": \"string\",\n              \"description\": \"The duration of the video in milliseconds.\",\n              \"format\": \"int64\"\n            },\n            \"height\": {\n              \"type\": \"integer\",\n              \"description\": \"The height of the video in pixels.\",\n              \"format\": \"int32\"\n            },\n            \"width\": {\n              \"type\": \"integer\",\n              \"description\": \"The width of the video in pixels.\",\n              \"format\": \"int32\"\n            }\n          }\n        },\n        \"viewedByMe\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the file has been viewed by this user.\"\n        },\n        \"viewedByMeTime\": {\n          \"type\": \"string\",\n          \"description\": \"The last time the file was viewed by the user (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        },\n        \"viewersCanCopyContent\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"\n        },\n        \"webContentLink\": {\n          \"type\": \"string\",\n          \"description\": \"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"\n        },\n        \"webViewLink\": {\n          \"type\": \"string\",\n          \"description\": \"A link for opening the file in a relevant Google editor or viewer in a browser.\"\n        },\n        \"writersCanShare\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"\n        }\n      }\n    },\n    \"FileList\": {\n      \"id\": \"FileList\",\n      \"type\": \"object\",\n      \"description\": \"A list of files.\",\n      \"properties\": {\n        \"files\": {\n          \"type\": \"array\",\n          \"description\": \"The list of files. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"items\": {\n            \"$ref\": \"File\"\n          }\n        },\n        \"incompleteSearch\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the search process was incomplete. If true, then some search results may be missing, since all documents were not searched. This may occur when searching multiple Team Drives with the \\\"user,allTeamDrives\\\" corpora, but all corpora could not be searched. When this happens, it is suggested that clients narrow their query by choosing a different corpus such as \\\"user\\\" or \\\"teamDrive\\\".\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#fileList\\\".\",\n          \"default\": \"drive#fileList\"\n        },\n        \"nextPageToken\": {\n          \"type\": \"string\",\n          \"description\": \"The page token for the next page of files. This will be absent if the end of the files list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n        }\n      }\n    },\n    \"GeneratedIds\": {\n      \"id\": \"GeneratedIds\",\n      \"type\": \"object\",\n      \"description\": \"A list of generated file IDs which can be provided in create requests.\",\n      \"properties\": {\n        \"ids\": {\n          \"type\": \"array\",\n          \"description\": \"The IDs generated for the requesting user in the specified space.\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#generatedIds\\\".\",\n          \"default\": \"drive#generatedIds\"\n        },\n        \"space\": {\n          \"type\": \"string\",\n          \"description\": \"The type of file that can be created with these IDs.\"\n        }\n      }\n    },\n    \"Permission\": {\n      \"id\": \"Permission\",\n      \"type\": \"object\",\n      \"description\": \"A permission for a file. A permission grants a user, group, domain or the world access to a file or a folder hierarchy.\",\n      \"properties\": {\n        \"allowFileDiscovery\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"\n        },\n        \"deleted\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"\n        },\n        \"displayName\": {\n          \"type\": \"string\",\n          \"description\": \"A displayable name for users, groups or domains.\"\n        },\n        \"domain\": {\n          \"type\": \"string\",\n          \"description\": \"The domain to which this permission refers.\"\n        },\n        \"emailAddress\": {\n          \"type\": \"string\",\n          \"description\": \"The email address of the user or group to which this permission refers.\"\n        },\n        \"expirationTime\": {\n          \"type\": \"string\",\n          \"description\": \"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\",\n          \"format\": \"date-time\"\n        },\n        \"id\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\",\n          \"default\": \"drive#permission\"\n        },\n        \"photoLink\": {\n          \"type\": \"string\",\n          \"description\": \"A link to the user's profile photo, if available.\"\n        },\n        \"role\": {\n          \"type\": \"string\",\n          \"description\": \"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- organizer \\n- owner \\n- writer \\n- commenter \\n- reader\",\n          \"annotations\": {\n            \"required\": [\n              \"drive.permissions.create\"\n              ]\n          }\n        },\n        \"teamDrivePermissionDetails\": {\n          \"type\": \"array\",\n          \"description\": \"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"inherited\": {\n                \"type\": \"boolean\",\n                \"description\": \"Whether this permission is inherited. This field is always populated. This is an output-only field.\"\n              },\n              \"inheritedFrom\": {\n                \"type\": \"string\",\n                \"description\": \"The ID of the item from which this permission is inherited. This is an output-only field and is only populated for members of the Team Drive.\"\n              },\n              \"role\": {\n                \"type\": \"string\",\n                \"description\": \"The primary role for this user. While new values may be added in the future, the following are currently possible:  \\n- organizer \\n- writer \\n- commenter \\n- reader\"\n              },\n              \"teamDrivePermissionType\": {\n                \"type\": \"string\",\n                \"description\": \"The Team Drive permission type for this user. While new values may be added in future, the following are currently possible:  \\n- file \\n- member\"\n              }\n            }\n          }\n        },\n        \"type\": {\n          \"type\": \"string\",\n          \"description\": \"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\",\n          \"annotations\": {\n            \"required\": [\n              \"drive.permissions.create\"\n              ]\n          }\n        }\n      }\n    },\n    \"PermissionList\": {\n      \"id\": \"PermissionList\",\n      \"type\": \"object\",\n      \"description\": \"A list of permissions for a file.\",\n      \"properties\": {\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permissionList\\\".\",\n          \"default\": \"drive#permissionList\"\n        },\n        \"nextPageToken\": {\n          \"type\": \"string\",\n          \"description\": \"The page token for the next page of permissions. This field will be absent if the end of the permissions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n        },\n        \"permissions\": {\n          \"type\": \"array\",\n          \"description\": \"The list of permissions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"items\": {\n            \"$ref\": \"Permission\"\n          }\n        }\n      }\n    },\n    \"Reply\": {\n      \"id\": \"Reply\",\n      \"type\": \"object\",\n      \"description\": \"A reply to a comment on a file.\",\n      \"properties\": {\n        \"action\": {\n          \"type\": \"string\",\n          \"description\": \"The action the reply performed to the parent comment. Valid values are:  \\n- resolve \\n- reopen\"\n        },\n        \"author\": {\n          \"$ref\": \"User\",\n          \"description\": \"The user who created the reply.\"\n        },\n        \"content\": {\n          \"type\": \"string\",\n          \"description\": \"The plain text content of the reply. This field is used for setting the content, while htmlContent should be displayed. This is required on creates if no action is specified.\",\n          \"annotations\": {\n            \"required\": [\n              \"drive.replies.update\"\n              ]\n          }\n        },\n        \"createdTime\": {\n          \"type\": \"string\",\n          \"description\": \"The time at which the reply was created (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        },\n        \"deleted\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether the reply has been deleted. A deleted reply has no content.\"\n        },\n        \"htmlContent\": {\n          \"type\": \"string\",\n          \"description\": \"The content of the reply with HTML formatting.\"\n        },\n        \"id\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of the reply.\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#reply\\\".\",\n          \"default\": \"drive#reply\"\n        },\n        \"modifiedTime\": {\n          \"type\": \"string\",\n          \"description\": \"The last time the reply was modified (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        }\n      }\n    },\n    \"ReplyList\": {\n      \"id\": \"ReplyList\",\n      \"type\": \"object\",\n      \"description\": \"A list of replies to a comment on a file.\",\n      \"properties\": {\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#replyList\\\".\",\n          \"default\": \"drive#replyList\"\n        },\n        \"nextPageToken\": {\n          \"type\": \"string\",\n          \"description\": \"The page token for the next page of replies. This will be absent if the end of the replies list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n        },\n        \"replies\": {\n          \"type\": \"array\",\n          \"description\": \"The list of replies. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"items\": {\n            \"$ref\": \"Reply\"\n          }\n        }\n      }\n    },\n    \"Revision\": {\n      \"id\": \"Revision\",\n      \"type\": \"object\",\n      \"description\": \"The metadata for a revision to a file.\",\n      \"properties\": {\n        \"id\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of the revision.\"\n        },\n        \"keepForever\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\",\n          \"default\": \"drive#revision\"\n        },\n        \"lastModifyingUser\": {\n          \"$ref\": \"User\",\n          \"description\": \"The last user to modify this revision.\"\n        },\n        \"md5Checksum\": {\n          \"type\": \"string\",\n          \"description\": \"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"\n        },\n        \"mimeType\": {\n          \"type\": \"string\",\n          \"description\": \"The MIME type of the revision.\"\n        },\n        \"modifiedTime\": {\n          \"type\": \"string\",\n          \"description\": \"The last time the revision was modified (RFC 3339 date-time).\",\n          \"format\": \"date-time\"\n        },\n        \"originalFilename\": {\n          \"type\": \"string\",\n          \"description\": \"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"\n        },\n        \"publishAuto\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.\"\n        },\n        \"published\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether this revision is published. This is only applicable to Google Docs.\"\n        },\n        \"publishedOutsideDomain\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether this revision is published outside the domain. This is only applicable to Google Docs.\"\n        },\n        \"size\": {\n          \"type\": \"string\",\n          \"description\": \"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\",\n          \"format\": \"int64\"\n        }\n      }\n    },\n    \"RevisionList\": {\n      \"id\": \"RevisionList\",\n      \"type\": \"object\",\n      \"description\": \"A list of revisions of a file.\",\n      \"properties\": {\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revisionList\\\".\",\n          \"default\": \"drive#revisionList\"\n        },\n        \"nextPageToken\": {\n          \"type\": \"string\",\n          \"description\": \"The page token for the next page of revisions. This will be absent if the end of the revisions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n        },\n        \"revisions\": {\n          \"type\": \"array\",\n          \"description\": \"The list of revisions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"items\": {\n            \"$ref\": \"Revision\"\n          }\n        }\n      }\n    },\n    \"StartPageToken\": {\n      \"id\": \"StartPageToken\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#startPageToken\\\".\",\n          \"default\": \"drive#startPageToken\"\n        },\n        \"startPageToken\": {\n          \"type\": \"string\",\n          \"description\": \"The starting page token for listing changes.\"\n        }\n      }\n    },\n    \"TeamDrive\": {\n      \"id\": \"TeamDrive\",\n      \"type\": \"object\",\n      \"description\": \"Representation of a Team Drive.\",\n      \"properties\": {\n        \"backgroundImageFile\": {\n          \"type\": \"object\",\n          \"description\": \"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n          \"properties\": {\n            \"id\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of an image file in Drive to use for the background image.\"\n            },\n            \"width\": {\n              \"type\": \"number\",\n              \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n              \"format\": \"float\"\n            },\n            \"xCoordinate\": {\n              \"type\": \"number\",\n              \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n              \"format\": \"float\"\n            },\n            \"yCoordinate\": {\n              \"type\": \"number\",\n              \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n              \"format\": \"float\"\n            }\n          }\n        },\n        \"backgroundImageLink\": {\n          \"type\": \"string\",\n          \"description\": \"A short-lived link to this Team Drive's background image.\"\n        },\n        \"capabilities\": {\n          \"type\": \"object\",\n          \"description\": \"Capabilities the current user has on this Team Drive.\",\n          \"properties\": {\n            \"canAddChildren\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can add children to folders in this Team Drive.\"\n            },\n            \"canChangeTeamDriveBackground\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can change the background of this Team Drive.\"\n            },\n            \"canComment\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can comment on files in this Team Drive.\"\n            },\n            \"canCopy\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can copy files in this Team Drive.\"\n            },\n            \"canDeleteTeamDrive\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can delete this Team Drive. Attempting to delete the Team Drive may still fail if there are untrashed items inside the Team Drive.\"\n            },\n            \"canDownload\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can download files in this Team Drive.\"\n            },\n            \"canEdit\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can edit files in this Team Drive\"\n            },\n            \"canListChildren\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can list the children of folders in this Team Drive.\"\n            },\n            \"canManageMembers\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can add members to this Team Drive or remove them or change their role.\"\n            },\n            \"canReadRevisions\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can read the revisions resource of files in this Team Drive.\"\n            },\n            \"canRemoveChildren\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can remove children from folders in this Team Drive.\"\n            },\n            \"canRename\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can rename files or folders in this Team Drive.\"\n            },\n            \"canRenameTeamDrive\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can rename this Team Drive.\"\n            },\n            \"canShare\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the current user can share files or folders in this Team Drive.\"\n            }\n          }\n        },\n        \"colorRgb\": {\n          \"type\": \"string\",\n          \"description\": \"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"\n        },\n        \"id\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of this Team Drive which is also the ID of the top level folder for this Team Drive.\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\",\n          \"default\": \"drive#teamDrive\"\n        },\n        \"name\": {\n          \"type\": \"string\",\n          \"description\": \"The name of this Team Drive.\"\n        },\n        \"themeId\": {\n          \"type\": \"string\",\n          \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n        }\n      }\n    },\n    \"TeamDriveList\": {\n      \"id\": \"TeamDriveList\",\n      \"type\": \"object\",\n      \"description\": \"A list of Team Drives.\",\n      \"properties\": {\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDriveList\\\".\",\n          \"default\": \"drive#teamDriveList\"\n        },\n        \"nextPageToken\": {\n          \"type\": \"string\",\n          \"description\": \"The page token for the next page of Team Drives. This will be absent if the end of the Team Drives list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n        },\n        \"teamDrives\": {\n          \"type\": \"array\",\n          \"description\": \"The list of Team Drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n          \"items\": {\n            \"$ref\": \"TeamDrive\"\n          }\n        }\n      }\n    },\n    \"User\": {\n      \"id\": \"User\",\n      \"type\": \"object\",\n      \"description\": \"Information about a Drive user.\",\n      \"properties\": {\n        \"displayName\": {\n          \"type\": \"string\",\n          \"description\": \"A plain text displayable name for this user.\"\n        },\n        \"emailAddress\": {\n          \"type\": \"string\",\n          \"description\": \"The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester.\"\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#user\\\".\",\n          \"default\": \"drive#user\"\n        },\n        \"me\": {\n          \"type\": \"boolean\",\n          \"description\": \"Whether this user is the requesting user.\"\n        },\n        \"permissionId\": {\n          \"type\": \"string\",\n          \"description\": \"The user's ID as visible in Permission resources.\"\n        },\n        \"photoLink\": {\n          \"type\": \"string\",\n          \"description\": \"A link to the user's profile photo, if available.\"\n        }\n      }\n    }\n  },\n  \"resources\": {\n    \"about\": {\n      \"methods\": {\n        \"get\": {\n          \"id\": \"drive.about.get\",\n          \"path\": \"about\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Gets information about the user, the user's Drive, and system capabilities.\",\n          \"response\": {\n            \"$ref\": \"About\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        }\n      }\n    },\n    \"changes\": {\n      \"methods\": {\n        \"getStartPageToken\": {\n          \"id\": \"drive.changes.getStartPageToken\",\n          \"path\": \"changes/startPageToken\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Gets the starting pageToken for listing future changes.\",\n          \"parameters\": {\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"teamDriveId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the Team Drive for which the starting pageToken for listing future changes from that Team Drive will be returned.\",\n              \"location\": \"query\"\n            }\n          },\n          \"response\": {\n            \"$ref\": \"StartPageToken\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"list\": {\n          \"id\": \"drive.changes.list\",\n          \"path\": \"changes\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Lists the changes for a user or Team Drive.\",\n          \"parameters\": {\n            \"includeCorpusRemovals\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"includeRemoved\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n              \"default\": \"true\",\n              \"location\": \"query\"\n            },\n            \"includeTeamDriveItems\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether Team Drive files or changes should be included in results.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"pageSize\": {\n              \"type\": \"integer\",\n              \"description\": \"The maximum number of changes to return per page.\",\n              \"default\": \"100\",\n              \"format\": \"int32\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\"\n            },\n            \"pageToken\": {\n              \"type\": \"string\",\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n              \"required\": true,\n              \"location\": \"query\"\n            },\n            \"restrictToMyDrive\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"spaces\": {\n              \"type\": \"string\",\n              \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n              \"default\": \"drive\",\n              \"location\": \"query\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"teamDriveId\": {\n              \"type\": \"string\",\n              \"description\": \"The Team Drive from which changes will be returned. If specified the change IDs will be reflective of the Team Drive; use the combined Team Drive ID and change ID as an identifier.\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"pageToken\"\n            ],\n          \"response\": {\n            \"$ref\": \"ChangeList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ],\n          \"supportsSubscription\": true\n        },\n        \"watch\": {\n          \"id\": \"drive.changes.watch\",\n          \"path\": \"changes/watch\",\n          \"httpMethod\": \"POST\",\n          \"description\": \"Subscribes to changes for a user.\",\n          \"parameters\": {\n            \"includeCorpusRemovals\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"includeRemoved\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n              \"default\": \"true\",\n              \"location\": \"query\"\n            },\n            \"includeTeamDriveItems\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether Team Drive files or changes should be included in results.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"pageSize\": {\n              \"type\": \"integer\",\n              \"description\": \"The maximum number of changes to return per page.\",\n              \"default\": \"100\",\n              \"format\": \"int32\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\"\n            },\n            \"pageToken\": {\n              \"type\": \"string\",\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n              \"required\": true,\n              \"location\": \"query\"\n            },\n            \"restrictToMyDrive\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"spaces\": {\n              \"type\": \"string\",\n              \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n              \"default\": \"drive\",\n              \"location\": \"query\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"teamDriveId\": {\n              \"type\": \"string\",\n              \"description\": \"The Team Drive from which changes will be returned. If specified the change IDs will be reflective of the Team Drive; use the combined Team Drive ID and change ID as an identifier.\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"pageToken\"\n            ],\n          \"request\": {\n            \"$ref\": \"Channel\",\n            \"parameterName\": \"resource\"\n          },\n          \"response\": {\n            \"$ref\": \"Channel\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ],\n          \"supportsSubscription\": true\n        }\n      }\n    },\n    \"channels\": {\n      \"methods\": {\n        \"stop\": {\n          \"id\": \"drive.channels.stop\",\n          \"path\": \"channels/stop\",\n          \"httpMethod\": \"POST\",\n          \"description\": \"Stop watching resources through this channel\",\n          \"request\": {\n            \"$ref\": \"Channel\",\n            \"parameterName\": \"resource\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        }\n      }\n    },\n    \"comments\": {\n      \"methods\": {\n        \"create\": {\n          \"id\": \"drive.comments.create\",\n          \"path\": \"files/{fileId}/comments\",\n          \"httpMethod\": \"POST\",\n          \"description\": \"Creates a new comment on a file.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"request\": {\n            \"$ref\": \"Comment\"\n          },\n          \"response\": {\n            \"$ref\": \"Comment\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        },\n        \"delete\": {\n          \"id\": \"drive.comments.delete\",\n          \"path\": \"files/{fileId}/comments/{commentId}\",\n          \"httpMethod\": \"DELETE\",\n          \"description\": \"Deletes a comment.\",\n          \"parameters\": {\n            \"commentId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the comment.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n            ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        },\n        \"get\": {\n          \"id\": \"drive.comments.get\",\n          \"path\": \"files/{fileId}/comments/{commentId}\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Gets a comment by ID.\",\n          \"parameters\": {\n            \"commentId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the comment.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"includeDeleted\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to return deleted comments. Deleted comments will not include their original content.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n            ],\n          \"response\": {\n            \"$ref\": \"Comment\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"list\": {\n          \"id\": \"drive.comments.list\",\n          \"path\": \"files/{fileId}/comments\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Lists a file's comments.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"includeDeleted\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to include deleted comments. Deleted comments will not include their original content.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"pageSize\": {\n              \"type\": \"integer\",\n              \"description\": \"The maximum number of comments to return per page.\",\n              \"default\": \"20\",\n              \"format\": \"int32\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\"\n            },\n            \"pageToken\": {\n              \"type\": \"string\",\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n              \"location\": \"query\"\n            },\n            \"startModifiedTime\": {\n              \"type\": \"string\",\n              \"description\": \"The minimum value of 'modifiedTime' for the result comments (RFC 3339 date-time).\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"response\": {\n            \"$ref\": \"CommentList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"update\": {\n          \"id\": \"drive.comments.update\",\n          \"path\": \"files/{fileId}/comments/{commentId}\",\n          \"httpMethod\": \"PATCH\",\n          \"description\": \"Updates a comment with patch semantics.\",\n          \"parameters\": {\n            \"commentId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the comment.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n            ],\n          \"request\": {\n            \"$ref\": \"Comment\"\n          },\n          \"response\": {\n            \"$ref\": \"Comment\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        }\n      }\n    },\n    \"files\": {\n      \"methods\": {\n        \"copy\": {\n          \"id\": \"drive.files.copy\",\n          \"path\": \"files/{fileId}/copy\",\n          \"httpMethod\": \"POST\",\n          \"description\": \"Creates a copy of a file and applies any requested updates with patch semantics.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"ignoreDefaultVisibility\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"keepRevisionForever\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"ocrLanguage\": {\n              \"type\": \"string\",\n              \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n              \"location\": \"query\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"request\": {\n            \"$ref\": \"File\"\n          },\n          \"response\": {\n            \"$ref\": \"File\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\"\n            ]\n        },\n        \"create\": {\n          \"id\": \"drive.files.create\",\n          \"path\": \"files\",\n          \"httpMethod\": \"POST\",\n          \"description\": \"Creates a new file.\",\n          \"parameters\": {\n            \"ignoreDefaultVisibility\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"keepRevisionForever\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"ocrLanguage\": {\n              \"type\": \"string\",\n              \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n              \"location\": \"query\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"useContentAsIndexableText\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to use the uploaded content as indexable text.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"request\": {\n            \"$ref\": \"File\"\n          },\n          \"response\": {\n            \"$ref\": \"File\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ],\n          \"supportsMediaUpload\": true,\n          \"mediaUpload\": {\n            \"accept\": [\n              \"*/*\"\n              ],\n            \"maxSize\": \"5120GB\",\n            \"protocols\": {\n              \"simple\": {\n                \"multipart\": true,\n                \"path\": \"/upload/drive/v3/files\"\n              },\n              \"resumable\": {\n                \"multipart\": true,\n                \"path\": \"/resumable/upload/drive/v3/files\"\n              }\n            }\n          },\n          \"supportsSubscription\": true\n        },\n        \"delete\": {\n          \"id\": \"drive.files.delete\",\n          \"path\": \"files/{fileId}\",\n          \"httpMethod\": \"DELETE\",\n          \"description\": \"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a Team Drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        },\n        \"emptyTrash\": {\n          \"id\": \"drive.files.emptyTrash\",\n          \"path\": \"files/trash\",\n          \"httpMethod\": \"DELETE\",\n          \"description\": \"Permanently deletes all of the user's trashed files.\",\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n            ]\n        },\n        \"export\": {\n          \"id\": \"drive.files.export\",\n          \"path\": \"files/{fileId}/export\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Exports a Google Doc to the requested MIME type and returns the exported content.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"mimeType\": {\n              \"type\": \"string\",\n              \"description\": \"The MIME type of the format requested for this export.\",\n              \"required\": true,\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"mimeType\"\n            ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ],\n          \"supportsMediaDownload\": true\n        },\n        \"generateIds\": {\n          \"id\": \"drive.files.generateIds\",\n          \"path\": \"files/generateIds\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Generates a set of file IDs which can be provided in create requests.\",\n          \"parameters\": {\n            \"count\": {\n              \"type\": \"integer\",\n              \"description\": \"The number of IDs to return.\",\n              \"default\": \"10\",\n              \"format\": \"int32\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\"\n            },\n            \"space\": {\n              \"type\": \"string\",\n              \"description\": \"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\",\n              \"default\": \"drive\",\n              \"location\": \"query\"\n            }\n          },\n          \"response\": {\n            \"$ref\": \"GeneratedIds\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        },\n        \"get\": {\n          \"id\": \"drive.files.get\",\n          \"path\": \"files/{fileId}\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Gets a file's metadata or content by ID.\",\n          \"parameters\": {\n            \"acknowledgeAbuse\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"response\": {\n            \"$ref\": \"File\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ],\n          \"supportsMediaDownload\": true,\n          \"useMediaDownloadService\": true,\n          \"supportsSubscription\": true\n        },\n        \"list\": {\n          \"id\": \"drive.files.list\",\n          \"path\": \"files\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Lists or searches files.\",\n          \"parameters\": {\n            \"corpora\": {\n              \"type\": \"string\",\n              \"description\": \"Comma-separated list of bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'teamDrive' and 'allTeamDrives'. 'allTeamDrives' must be combined with 'user'; all other values must be used in isolation. Prefer 'user' or 'teamDrive' to 'allTeamDrives' for efficiency.\",\n              \"location\": \"query\"\n            },\n            \"corpus\": {\n              \"type\": \"string\",\n              \"description\": \"The source of files to list. Deprecated: use 'corpora' instead.\",\n              \"enum\": [\n                \"domain\",\n                \"user\"\n                ],\n              \"enumDescriptions\": [\n                \"Files shared to the user's domain.\",\n                \"Files owned by or shared to the user.\"\n                ],\n              \"location\": \"query\"\n            },\n            \"includeTeamDriveItems\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether Team Drive items should be included in results.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"orderBy\": {\n              \"type\": \"string\",\n              \"description\": \"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\",\n              \"location\": \"query\"\n            },\n            \"pageSize\": {\n              \"type\": \"integer\",\n              \"description\": \"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\",\n              \"default\": \"100\",\n              \"format\": \"int32\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\"\n            },\n            \"pageToken\": {\n              \"type\": \"string\",\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n              \"location\": \"query\"\n            },\n            \"q\": {\n              \"type\": \"string\",\n              \"description\": \"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\",\n              \"location\": \"query\"\n            },\n            \"spaces\": {\n              \"type\": \"string\",\n              \"description\": \"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n              \"default\": \"drive\",\n              \"location\": \"query\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"teamDriveId\": {\n              \"type\": \"string\",\n              \"description\": \"ID of Team Drive to search.\",\n              \"location\": \"query\"\n            }\n          },\n          \"response\": {\n            \"$ref\": \"FileList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"update\": {\n          \"id\": \"drive.files.update\",\n          \"path\": \"files/{fileId}\",\n          \"httpMethod\": \"PATCH\",\n          \"description\": \"Updates a file's metadata and/or content with patch semantics.\",\n          \"parameters\": {\n            \"addParents\": {\n              \"type\": \"string\",\n              \"description\": \"A comma-separated list of parent IDs to add.\",\n              \"location\": \"query\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"keepRevisionForever\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"ocrLanguage\": {\n              \"type\": \"string\",\n              \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n              \"location\": \"query\"\n            },\n            \"removeParents\": {\n              \"type\": \"string\",\n              \"description\": \"A comma-separated list of parent IDs to remove.\",\n              \"location\": \"query\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"useContentAsIndexableText\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to use the uploaded content as indexable text.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"request\": {\n            \"$ref\": \"File\"\n          },\n          \"response\": {\n            \"$ref\": \"File\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.scripts\"\n            ],\n          \"supportsMediaUpload\": true,\n          \"mediaUpload\": {\n            \"accept\": [\n              \"*/*\"\n              ],\n            \"maxSize\": \"5120GB\",\n            \"protocols\": {\n              \"simple\": {\n                \"multipart\": true,\n                \"path\": \"/upload/drive/v3/files/{fileId}\"\n              },\n              \"resumable\": {\n                \"multipart\": true,\n                \"path\": \"/resumable/upload/drive/v3/files/{fileId}\"\n              }\n            }\n          }\n        },\n        \"watch\": {\n          \"id\": \"drive.files.watch\",\n          \"path\": \"files/{fileId}/watch\",\n          \"httpMethod\": \"POST\",\n          \"description\": \"Subscribes to changes to a file\",\n          \"parameters\": {\n            \"acknowledgeAbuse\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"request\": {\n            \"$ref\": \"Channel\",\n            \"parameterName\": \"resource\"\n          },\n          \"response\": {\n            \"$ref\": \"Channel\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ],\n          \"supportsMediaDownload\": true,\n          \"useMediaDownloadService\": true,\n          \"supportsSubscription\": true\n        }\n      }\n    },\n    \"permissions\": {\n      \"methods\": {\n        \"create\": {\n          \"id\": \"drive.permissions.create\",\n          \"path\": \"files/{fileId}/permissions\",\n          \"httpMethod\": \"POST\",\n          \"description\": \"Creates a permission for a file or Team Drive.\",\n          \"parameters\": {\n            \"emailMessage\": {\n              \"type\": \"string\",\n              \"description\": \"A custom message to include in the notification email.\",\n              \"location\": \"query\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file or Team Drive.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"sendNotificationEmail\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\",\n              \"location\": \"query\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"transferOwnership\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"request\": {\n            \"$ref\": \"Permission\"\n          },\n          \"response\": {\n            \"$ref\": \"Permission\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        },\n        \"delete\": {\n          \"id\": \"drive.permissions.delete\",\n          \"path\": \"files/{fileId}/permissions/{permissionId}\",\n          \"httpMethod\": \"DELETE\",\n          \"description\": \"Deletes a permission.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file or Team Drive.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"permissionId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the permission.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"permissionId\"\n            ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        },\n        \"get\": {\n          \"id\": \"drive.permissions.get\",\n          \"path\": \"files/{fileId}/permissions/{permissionId}\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Gets a permission by ID.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"permissionId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the permission.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"permissionId\"\n            ],\n          \"response\": {\n            \"$ref\": \"Permission\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"list\": {\n          \"id\": \"drive.permissions.list\",\n          \"path\": \"files/{fileId}/permissions\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Lists a file's or Team Drive's permissions.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file or Team Drive.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"pageSize\": {\n              \"type\": \"integer\",\n              \"description\": \"The maximum number of permissions to return per page. When not set for files in a Team Drive, at most 100 results will be returned. When not set for files that are not in a Team Drive, the entire list will be returned.\",\n              \"format\": \"int32\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\"\n            },\n            \"pageToken\": {\n              \"type\": \"string\",\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n              \"location\": \"query\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"response\": {\n            \"$ref\": \"PermissionList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"update\": {\n          \"id\": \"drive.permissions.update\",\n          \"path\": \"files/{fileId}/permissions/{permissionId}\",\n          \"httpMethod\": \"PATCH\",\n          \"description\": \"Updates a permission with patch semantics.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file or Team Drive.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"permissionId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the permission.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"removeExpiration\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to remove the expiration date.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"supportsTeamDrives\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the requesting application supports Team Drives.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"transferOwnership\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"permissionId\"\n            ],\n          \"request\": {\n            \"$ref\": \"Permission\"\n          },\n          \"response\": {\n            \"$ref\": \"Permission\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        }\n      }\n    },\n    \"replies\": {\n      \"methods\": {\n        \"create\": {\n          \"id\": \"drive.replies.create\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n          \"httpMethod\": \"POST\",\n          \"description\": \"Creates a new reply to a comment.\",\n          \"parameters\": {\n            \"commentId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the comment.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n            ],\n          \"request\": {\n            \"$ref\": \"Reply\"\n          },\n          \"response\": {\n            \"$ref\": \"Reply\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        },\n        \"delete\": {\n          \"id\": \"drive.replies.delete\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n          \"httpMethod\": \"DELETE\",\n          \"description\": \"Deletes a reply.\",\n          \"parameters\": {\n            \"commentId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the comment.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"replyId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the reply.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\",\n            \"replyId\"\n            ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        },\n        \"get\": {\n          \"id\": \"drive.replies.get\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Gets a reply by ID.\",\n          \"parameters\": {\n            \"commentId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the comment.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"includeDeleted\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to return deleted replies. Deleted replies will not include their original content.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"replyId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the reply.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\",\n            \"replyId\"\n            ],\n          \"response\": {\n            \"$ref\": \"Reply\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"list\": {\n          \"id\": \"drive.replies.list\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Lists a comment's replies.\",\n          \"parameters\": {\n            \"commentId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the comment.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"includeDeleted\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether to include deleted replies. Deleted replies will not include their original content.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"pageSize\": {\n              \"type\": \"integer\",\n              \"description\": \"The maximum number of replies to return per page.\",\n              \"default\": \"20\",\n              \"format\": \"int32\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\"\n            },\n            \"pageToken\": {\n              \"type\": \"string\",\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\"\n            ],\n          \"response\": {\n            \"$ref\": \"ReplyList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"update\": {\n          \"id\": \"drive.replies.update\",\n          \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n          \"httpMethod\": \"PATCH\",\n          \"description\": \"Updates a reply with patch semantics.\",\n          \"parameters\": {\n            \"commentId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the comment.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"replyId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the reply.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"commentId\",\n            \"replyId\"\n            ],\n          \"request\": {\n            \"$ref\": \"Reply\"\n          },\n          \"response\": {\n            \"$ref\": \"Reply\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        }\n      }\n    },\n    \"revisions\": {\n      \"methods\": {\n        \"delete\": {\n          \"id\": \"drive.revisions.delete\",\n          \"path\": \"files/{fileId}/revisions/{revisionId}\",\n          \"httpMethod\": \"DELETE\",\n          \"description\": \"Permanently deletes a revision. This method is only applicable to files with binary content in Drive.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"revisionId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the revision.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"revisionId\"\n            ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        },\n        \"get\": {\n          \"id\": \"drive.revisions.get\",\n          \"path\": \"files/{fileId}/revisions/{revisionId}\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Gets a revision's metadata or content by ID.\",\n          \"parameters\": {\n            \"acknowledgeAbuse\": {\n              \"type\": \"boolean\",\n              \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n              \"default\": \"false\",\n              \"location\": \"query\"\n            },\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"revisionId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the revision.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"revisionId\"\n            ],\n          \"response\": {\n            \"$ref\": \"Revision\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ],\n          \"supportsMediaDownload\": true,\n          \"useMediaDownloadService\": true\n        },\n        \"list\": {\n          \"id\": \"drive.revisions.list\",\n          \"path\": \"files/{fileId}/revisions\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Lists a file's revisions.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"pageSize\": {\n              \"type\": \"integer\",\n              \"description\": \"The maximum number of revisions to return per page.\",\n              \"default\": \"200\",\n              \"format\": \"int32\",\n              \"minimum\": \"1\",\n              \"maximum\": \"1000\",\n              \"location\": \"query\"\n            },\n            \"pageToken\": {\n              \"type\": \"string\",\n              \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\"\n            ],\n          \"response\": {\n            \"$ref\": \"RevisionList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\",\n            \"https://www.googleapis.com/auth/drive.metadata\",\n            \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n            \"https://www.googleapis.com/auth/drive.photos.readonly\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"update\": {\n          \"id\": \"drive.revisions.update\",\n          \"path\": \"files/{fileId}/revisions/{revisionId}\",\n          \"httpMethod\": \"PATCH\",\n          \"description\": \"Updates a revision with patch semantics.\",\n          \"parameters\": {\n            \"fileId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the file.\",\n              \"required\": true,\n              \"location\": \"path\"\n            },\n            \"revisionId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the revision.\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"fileId\",\n            \"revisionId\"\n            ],\n          \"request\": {\n            \"$ref\": \"Revision\"\n          },\n          \"response\": {\n            \"$ref\": \"Revision\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.appdata\",\n            \"https://www.googleapis.com/auth/drive.file\"\n            ]\n        }\n      }\n    },\n    \"teamdrives\": {\n      \"methods\": {\n        \"create\": {\n          \"id\": \"drive.teamdrives.create\",\n          \"path\": \"teamdrives\",\n          \"httpMethod\": \"POST\",\n          \"description\": \"Creates a new Team Drive.\",\n          \"parameters\": {\n            \"requestId\": {\n              \"type\": \"string\",\n              \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\",\n              \"required\": true,\n              \"location\": \"query\"\n            }\n          },\n          \"parameterOrder\": [\n            \"requestId\"\n            ],\n          \"request\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"response\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n            ]\n        },\n        \"delete\": {\n          \"id\": \"drive.teamdrives.delete\",\n          \"path\": \"teamdrives/{teamDriveId}\",\n          \"httpMethod\": \"DELETE\",\n          \"description\": \"Permanently deletes a Team Drive for which the user is an organizer. The Team Drive cannot contain any untrashed items.\",\n          \"parameters\": {\n            \"teamDriveId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the Team Drive\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"teamDriveId\"\n            ],\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n            ]\n        },\n        \"get\": {\n          \"id\": \"drive.teamdrives.get\",\n          \"path\": \"teamdrives/{teamDriveId}\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Gets a Team Drive's metadata by ID.\",\n          \"parameters\": {\n            \"teamDriveId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the Team Drive\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"teamDriveId\"\n            ],\n          \"response\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"list\": {\n          \"id\": \"drive.teamdrives.list\",\n          \"path\": \"teamdrives\",\n          \"httpMethod\": \"GET\",\n          \"description\": \"Lists the user's Team Drives.\",\n          \"parameters\": {\n            \"pageSize\": {\n              \"type\": \"integer\",\n              \"description\": \"Maximum number of Team Drives to return.\",\n              \"default\": \"10\",\n              \"format\": \"int32\",\n              \"minimum\": \"1\",\n              \"maximum\": \"100\",\n              \"location\": \"query\"\n            },\n            \"pageToken\": {\n              \"type\": \"string\",\n              \"description\": \"Page token for Team Drives.\",\n              \"location\": \"query\"\n            }\n          },\n          \"response\": {\n            \"$ref\": \"TeamDriveList\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\",\n            \"https://www.googleapis.com/auth/drive.readonly\"\n            ]\n        },\n        \"update\": {\n          \"id\": \"drive.teamdrives.update\",\n          \"path\": \"teamdrives/{teamDriveId}\",\n          \"httpMethod\": \"PATCH\",\n          \"description\": \"Updates a Team Drive's metadata\",\n          \"parameters\": {\n            \"teamDriveId\": {\n              \"type\": \"string\",\n              \"description\": \"The ID of the Team Drive\",\n              \"required\": true,\n              \"location\": \"path\"\n            }\n          },\n          \"parameterOrder\": [\n            \"teamDriveId\"\n            ],\n          \"request\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"response\": {\n            \"$ref\": \"TeamDrive\"\n          },\n          \"scopes\": [\n            \"https://www.googleapis.com/auth/drive\"\n            ]\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "data-raw/old/20170519_drive-v3_endpoints-list.json",
    "content": "{\n  \"drive.about.get\": {\n    \"id\": [\"drive.about.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/about\"],\n    \"parameters\": {\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets information about the user, the user's Drive, and system capabilities.\"],\n    \"response\": [\"About\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.copy\": {\n    \"id\": [\"drive.files.copy\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files/{fileId}/copy\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"ignoreDefaultVisibility\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.photos.readonly\"],\n    \"description\": [\"Creates a copy of a file and applies any requested updates with patch semantics.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.create\": {\n    \"id\": [\"drive.files.create\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files\"],\n    \"parameters\": {\n      \"ignoreDefaultVisibility\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Creates a new file.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [null],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files\"]\n        }\n      }\n    },\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.delete\": {\n    \"id\": [\"drive.files.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a Team Drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.emptyTrash\": {\n    \"id\": [\"drive.files.emptyTrash\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/trash\"],\n    \"parameters\": {\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive\"],\n    \"description\": [\"Permanently deletes all of the user's trashed files.\"],\n    \"response\": [null],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.export\": {\n    \"id\": [\"drive.files.export\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/export\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the format requested for this export.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file, drive.readonly\"],\n    \"description\": [\"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId, mimeType\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.generateIds\": {\n    \"id\": [\"drive.files.generateIds\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/generateIds\"],\n    \"parameters\": {\n      \"count\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The number of IDs to return.\"]\n      },\n      \"space\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Generates a set of file IDs which can be provided in create requests.\"],\n    \"response\": [\"GeneratedIds\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.get\": {\n    \"id\": [\"drive.files.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"acknowledgeAbuse\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets a file's metadata or content by ID.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": [true]\n  },\n  \"drive.files.list\": {\n    \"id\": [\"drive.files.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files\"],\n    \"parameters\": {\n      \"corpora\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Comma-separated list of bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'teamDrive' and 'allTeamDrives'. 'allTeamDrives' must be combined with 'user'; all other values must be used in isolation. Prefer 'user' or 'teamDrive' to 'allTeamDrives' for efficiency.\"]\n      },\n      \"corpus\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"domain\"],\n        \"description\": [\"The source of files to list. Deprecated: use 'corpora' instead.\"]\n      },\n      \"includeTeamDriveItems\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether Team Drive items should be included in results.\"]\n      },\n      \"orderBy\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\"]\n      },\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\"]\n      },\n      \"q\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of Team Drive to search.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Lists or searches files.\"],\n    \"response\": [\"FileList\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.update\": {\n    \"id\": [\"drive.files.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"addParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to add.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"removeParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to remove.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.scripts\"],\n    \"description\": [\"Updates a file's metadata and/or content with patch semantics.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files/{fileId}\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files/{fileId}\"]\n        }\n      }\n    },\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.watch\": {\n    \"id\": [\"drive.files.watch\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files/{fileId}/watch\"],\n    \"parameters\": {\n      \"acknowledgeAbuse\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Subscribes to changes to a file\"],\n    \"response\": [\"Channel\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"Channel\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": [true]\n  },\n  \"drive.permissions.create\": {\n    \"id\": [\"drive.permissions.create\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions\"],\n    \"parameters\": {\n      \"emailMessage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A custom message to include in the notification email.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"sendNotificationEmail\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"transferOwnership\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\"]\n      },\n      \"allowFileDiscovery\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"]\n      },\n      \"deleted\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"]\n      },\n      \"displayName\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A displayable name for users, groups or domains.\"]\n      },\n      \"domain\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The domain to which this permission refers.\"]\n      },\n      \"emailAddress\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The email address of the user or group to which this permission refers.\"]\n      },\n      \"expirationTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\"]\n      },\n      \"photoLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link to the user's profile photo, if available.\"]\n      },\n      \"role\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- organizer \\n- owner \\n- writer \\n- commenter \\n- reader\"]\n      },\n      \"teamDrivePermissionDetails\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\"]\n      },\n      \"type\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file\"],\n    \"description\": [\"Creates a permission for a file or Team Drive.\"],\n    \"response\": [\"Permission\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"Permission\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.delete\": {\n    \"id\": [\"drive.permissions.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions/{permissionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"permissionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the permission.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file\"],\n    \"description\": [\"Deletes a permission.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId, permissionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.get\": {\n    \"id\": [\"drive.permissions.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions/{permissionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"permissionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the permission.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets a permission by ID.\"],\n    \"response\": [\"Permission\"],\n    \"parameterOrder\": [\"fileId, permissionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.list\": {\n    \"id\": [\"drive.permissions.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The maximum number of permissions to return per page. When not set for files in a Team Drive, at most 100 results will be returned. When not set for files that are not in a Team Drive, the entire list will be returned.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Lists a file's or Team Drive's permissions.\"],\n    \"response\": [\"PermissionList\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.update\": {\n    \"id\": [\"drive.permissions.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions/{permissionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"permissionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the permission.\"]\n      },\n      \"removeExpiration\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to remove the expiration date.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"transferOwnership\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\"]\n      },\n      \"allowFileDiscovery\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"]\n      },\n      \"deleted\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"]\n      },\n      \"displayName\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A displayable name for users, groups or domains.\"]\n      },\n      \"domain\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The domain to which this permission refers.\"]\n      },\n      \"emailAddress\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The email address of the user or group to which this permission refers.\"]\n      },\n      \"expirationTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\"]\n      },\n      \"photoLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link to the user's profile photo, if available.\"]\n      },\n      \"role\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- organizer \\n- owner \\n- writer \\n- commenter \\n- reader\"]\n      },\n      \"teamDrivePermissionDetails\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\"]\n      },\n      \"type\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file\"],\n    \"description\": [\"Updates a permission with patch semantics.\"],\n    \"response\": [\"Permission\"],\n    \"parameterOrder\": [\"fileId, permissionId\"],\n    \"request\": [\"Permission\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.revisions.delete\": {\n    \"id\": [\"drive.revisions.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions/{revisionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"revisionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Permanently deletes a revision. This method is only applicable to files with binary content in Drive.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId, revisionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.revisions.get\": {\n    \"id\": [\"drive.revisions.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions/{revisionId}\"],\n    \"parameters\": {\n      \"acknowledgeAbuse\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"revisionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets a revision's metadata or content by ID.\"],\n    \"response\": [\"Revision\"],\n    \"parameterOrder\": [\"fileId, revisionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": [true]\n  },\n  \"drive.revisions.list\": {\n    \"id\": [\"drive.revisions.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The maximum number of revisions to return per page.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Lists a file's revisions.\"],\n    \"response\": [\"RevisionList\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.revisions.update\": {\n    \"id\": [\"drive.revisions.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions/{revisionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"revisionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"keepForever\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify this revision.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the revision.\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the revision was modified (RFC 3339 date-time).\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"publishAuto\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.\"]\n      },\n      \"published\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this revision is published. This is only applicable to Google Docs.\"]\n      },\n      \"publishedOutsideDomain\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this revision is published outside the domain. This is only applicable to Google Docs.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Updates a revision with patch semantics.\"],\n    \"response\": [\"Revision\"],\n    \"parameterOrder\": [\"fileId, revisionId\"],\n    \"request\": [\"Revision\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.update.media\": {\n    \"id\": [\"drive.files.update.media\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"/upload/drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"addParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to add.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"removeParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to remove.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      },\n      \"uploadType\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [null]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.scripts\"],\n    \"description\": {},\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.update.media.resumable\": {\n    \"id\": [\"drive.files.update.media.resumable\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"/resumable/upload/drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"addParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to add.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"removeParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to remove.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      },\n      \"uploadType\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [null]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.scripts\"],\n    \"description\": {},\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  }\n}\n"
  },
  {
    "path": "data-raw/old/20170721_drive-v3_discovery-document.json",
    "content": "{\n \"kind\": \"discovery#restDescription\",\n \"etag\": \"\\\"YWOzh2SDasdU84ArJnpYek-OMdg/28UCLZv0WUjAkY4ueul9YtmjTwQ\\\"\",\n \"discoveryVersion\": \"v1\",\n \"id\": \"drive:v3\",\n \"name\": \"drive\",\n \"version\": \"v3\",\n \"revision\": \"20170721\",\n \"title\": \"Drive API\",\n \"description\": \"Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.\",\n \"ownerDomain\": \"google.com\",\n \"ownerName\": \"Google\",\n \"icons\": {\n  \"x16\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png\",\n  \"x32\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png\"\n },\n \"documentationLink\": \"https://developers.google.com/drive/\",\n \"protocol\": \"rest\",\n \"baseUrl\": \"https://www.googleapis.com/drive/v3/\",\n \"basePath\": \"/drive/v3/\",\n \"rootUrl\": \"https://www.googleapis.com/\",\n \"servicePath\": \"drive/v3/\",\n \"batchPath\": \"batch\",\n \"parameters\": {\n  \"alt\": {\n   \"type\": \"string\",\n   \"description\": \"Data format for the response.\",\n   \"default\": \"json\",\n   \"enum\": [\n    \"json\"\n   ],\n   \"enumDescriptions\": [\n    \"Responses with Content-Type of application/json\"\n   ],\n   \"location\": \"query\"\n  },\n  \"fields\": {\n   \"type\": \"string\",\n   \"description\": \"Selector specifying which fields to include in a partial response.\",\n   \"location\": \"query\"\n  },\n  \"key\": {\n   \"type\": \"string\",\n   \"description\": \"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\",\n   \"location\": \"query\"\n  },\n  \"oauth_token\": {\n   \"type\": \"string\",\n   \"description\": \"OAuth 2.0 token for the current user.\",\n   \"location\": \"query\"\n  },\n  \"prettyPrint\": {\n   \"type\": \"boolean\",\n   \"description\": \"Returns response with indentations and line breaks.\",\n   \"default\": \"true\",\n   \"location\": \"query\"\n  },\n  \"quotaUser\": {\n   \"type\": \"string\",\n   \"description\": \"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\",\n   \"location\": \"query\"\n  },\n  \"userIp\": {\n   \"type\": \"string\",\n   \"description\": \"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\",\n   \"location\": \"query\"\n  }\n },\n \"auth\": {\n  \"oauth2\": {\n   \"scopes\": {\n    \"https://www.googleapis.com/auth/drive\": {\n     \"description\": \"View and manage the files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.appdata\": {\n     \"description\": \"View and manage its own configuration data in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.file\": {\n     \"description\": \"View and manage Google Drive files and folders that you have opened or created with this app\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata\": {\n     \"description\": \"View and manage metadata of files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata.readonly\": {\n     \"description\": \"View metadata for files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.photos.readonly\": {\n     \"description\": \"View the photos, videos and albums in your Google Photos\"\n    },\n    \"https://www.googleapis.com/auth/drive.readonly\": {\n     \"description\": \"View the files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.scripts\": {\n     \"description\": \"Modify your Google Apps Script scripts' behavior\"\n    }\n   }\n  }\n },\n \"schemas\": {\n  \"About\": {\n   \"id\": \"About\",\n   \"type\": \"object\",\n   \"description\": \"Information about the user, the user's Drive, and system capabilities.\",\n   \"properties\": {\n    \"appInstalled\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has installed the requesting app.\"\n    },\n    \"exportFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported exports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"folderColorPalette\": {\n     \"type\": \"array\",\n     \"description\": \"The currently supported folder colors as RGB hex strings.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"importFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported imports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#about\\\".\",\n     \"default\": \"drive#about\"\n    },\n    \"maxImportSizes\": {\n     \"type\": \"object\",\n     \"description\": \"A map of maximum import sizes by MIME type, in bytes.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"format\": \"int64\"\n     }\n    },\n    \"maxUploadSize\": {\n     \"type\": \"string\",\n     \"description\": \"The maximum upload size in bytes.\",\n     \"format\": \"int64\"\n    },\n    \"storageQuota\": {\n     \"type\": \"object\",\n     \"description\": \"The user's storage quota limits and usage. All fields are measured in bytes.\",\n     \"properties\": {\n      \"limit\": {\n       \"type\": \"string\",\n       \"description\": \"The usage limit, if applicable. This will not be present if the user has unlimited storage.\",\n       \"format\": \"int64\"\n      },\n      \"usage\": {\n       \"type\": \"string\",\n       \"description\": \"The total usage across all services.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDrive\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by all files in Google Drive.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDriveTrash\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by trashed files in Google Drive.\",\n       \"format\": \"int64\"\n      }\n     }\n    },\n    \"teamDriveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"A list of themes that are supported for Team Drives.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"A link to this Team Drive theme's background image.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"The color of this Team Drive theme as an RGB hex string.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the theme.\"\n       }\n      }\n     }\n    },\n    \"user\": {\n     \"$ref\": \"User\",\n     \"description\": \"The authenticated user.\"\n    }\n   }\n  },\n  \"Change\": {\n   \"id\": \"Change\",\n   \"type\": \"object\",\n   \"description\": \"A change to a file or Team Drive.\",\n   \"properties\": {\n    \"file\": {\n     \"$ref\": \"File\",\n     \"description\": \"The updated state of the file. Present if the type is file and the file has not been removed from this list of changes.\"\n    },\n    \"fileId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file which has changed.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#change\\\".\",\n     \"default\": \"drive#change\"\n    },\n    \"removed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file or Team Drive has been removed from this list of changes, for example by deletion or loss of access.\"\n    },\n    \"teamDrive\": {\n     \"$ref\": \"TeamDrive\",\n     \"description\": \"The updated state of the Team Drive. Present if the type is teamDrive, the user is still a member of the Team Drive, and the Team Drive has not been removed.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the Team Drive associated with this change.\"\n    },\n    \"time\": {\n     \"type\": \"string\",\n     \"description\": \"The time of this change (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the change. Possible values are file and teamDrive.\"\n    }\n   }\n  },\n  \"ChangeList\": {\n   \"id\": \"ChangeList\",\n   \"type\": \"object\",\n   \"description\": \"A list of changes for a user.\",\n   \"properties\": {\n    \"changes\": {\n     \"type\": \"array\",\n     \"description\": \"The list of changes. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Change\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#changeList\\\".\",\n     \"default\": \"drive#changeList\"\n    },\n    \"newStartPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for future changes. This will be present only if the end of the current changes list has been reached.\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of changes. This will be absent if the end of the changes list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"Channel\": {\n   \"id\": \"Channel\",\n   \"type\": \"object\",\n   \"description\": \"An notification channel used to watch for resource changes.\",\n   \"properties\": {\n    \"address\": {\n     \"type\": \"string\",\n     \"description\": \"The address where notifications are delivered for this channel.\"\n    },\n    \"expiration\": {\n     \"type\": \"string\",\n     \"description\": \"Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.\",\n     \"format\": \"int64\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"A UUID or similar unique string that identifies this channel.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies this as a notification channel used to watch for changes to a resource. Value: the fixed string \\\"api#channel\\\".\",\n     \"default\": \"api#channel\"\n    },\n    \"params\": {\n     \"type\": \"object\",\n     \"description\": \"Additional parameters controlling delivery channel behavior. Optional.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"Declares a new parameter by name.\"\n     }\n    },\n    \"payload\": {\n     \"type\": \"boolean\",\n     \"description\": \"A Boolean value to indicate whether payload is wanted. Optional.\"\n    },\n    \"resourceId\": {\n     \"type\": \"string\",\n     \"description\": \"An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.\"\n    },\n    \"resourceUri\": {\n     \"type\": \"string\",\n     \"description\": \"A version-specific identifier for the watched resource.\"\n    },\n    \"token\": {\n     \"type\": \"string\",\n     \"description\": \"An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of delivery mechanism used for this channel.\"\n    }\n   }\n  },\n  \"Comment\": {\n   \"id\": \"Comment\",\n   \"type\": \"object\",\n   \"description\": \"A comment on a file.\",\n   \"properties\": {\n    \"anchor\": {\n     \"type\": \"string\",\n     \"description\": \"A region of the document represented as a JSON string. See anchor documentation for details on how to define and interpret anchor properties.\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who created the comment.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the comment. This field is used for setting the content, while htmlContent should be displayed.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.comments.create\",\n       \"drive.comments.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the comment was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been deleted. A deleted comment has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the comment with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the comment.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#comment\\\".\",\n     \"default\": \"drive#comment\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the comment or any of its replies was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"quotedFileContent\": {\n     \"type\": \"object\",\n     \"description\": \"The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.\",\n     \"properties\": {\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the quoted content.\"\n      },\n      \"value\": {\n       \"type\": \"string\",\n       \"description\": \"The quoted content itself. This is interpreted as plain text if set through the API.\"\n      }\n     }\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of replies to the comment in chronological order.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    },\n    \"resolved\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been resolved by one of its replies.\"\n    }\n   }\n  },\n  \"CommentList\": {\n   \"id\": \"CommentList\",\n   \"type\": \"object\",\n   \"description\": \"A list of comments on a file.\",\n   \"properties\": {\n    \"comments\": {\n     \"type\": \"array\",\n     \"description\": \"The list of comments. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Comment\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#commentList\\\".\",\n     \"default\": \"drive#commentList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of comments. This will be absent if the end of the comments list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"File\": {\n   \"id\": \"File\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a file.\",\n   \"properties\": {\n    \"appProperties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to this folder. This is always false when the item is not a folder.\"\n      },\n      \"canChangeViewersCanCopyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change whether viewers can copy the contents of this file.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on this file.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy this file. For a Team Drive item, whether the current user can copy non-folder descendants of this item, or this item itself if it is not a folder.\"\n      },\n      \"canDelete\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this file.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download this file.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit this file.\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of this folder. This is always false when the item is not a folder.\"\n      },\n      \"canMoveItemIntoTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item into a Team Drive. If the item is in a Team Drive, this field is equivalent to canMoveTeamDriveItem.\"\n      },\n      \"canMoveTeamDriveItem\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this Team Drive item by changing its parent. Note that a request to change the parent for this item may still fail depending on the new parent that is being added. Only populated for Team Drive files.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of this file. For a Team Drive item, whether revisions of non-folder descendants of this item, or this item itself if it is not a folder, can be read.\"\n      },\n      \"canReadTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the Team Drive to which this file belongs. Only populated for Team Drive files.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove children from this folder. This is always false when the item is not a folder.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this file.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the sharing settings for this file.\"\n      },\n      \"canTrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this file to trash.\"\n      },\n      \"canUntrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can restore this file from trash.\"\n      }\n     }\n    },\n    \"contentHints\": {\n     \"type\": \"object\",\n     \"description\": \"Additional information about the content of the file. These fields are never populated in responses.\",\n     \"properties\": {\n      \"indexableText\": {\n       \"type\": \"string\",\n       \"description\": \"Text to be indexed for the file to improve fullText queries. This is limited to 128KB in length and may contain HTML elements.\"\n      },\n      \"thumbnail\": {\n       \"type\": \"object\",\n       \"description\": \"A thumbnail for the file. This will only be used if Drive cannot generate a standard thumbnail.\",\n       \"properties\": {\n        \"image\": {\n         \"type\": \"string\",\n         \"description\": \"The thumbnail data encoded with URL-safe Base64 (RFC 4648 section 5).\",\n         \"format\": \"byte\"\n        },\n        \"mimeType\": {\n         \"type\": \"string\",\n         \"description\": \"The MIME type of the thumbnail.\"\n        }\n       }\n      }\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"description\": {\n     \"type\": \"string\",\n     \"description\": \"A short description of the file.\"\n    },\n    \"explicitlyTrashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"\n    },\n    \"fileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"\n    },\n    \"folderColorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"\n    },\n    \"fullFileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"\n    },\n    \"hasAugmentedPermissions\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"\n    },\n    \"hasThumbnail\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"\n    },\n    \"headRevisionId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"\n    },\n    \"iconLink\": {\n     \"type\": \"string\",\n     \"description\": \"A static, unauthenticated link to the file's icon.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file.\"\n    },\n    \"imageMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about image media, if available.\",\n     \"properties\": {\n      \"aperture\": {\n       \"type\": \"number\",\n       \"description\": \"The aperture used to create the photo (f-number).\",\n       \"format\": \"float\"\n      },\n      \"cameraMake\": {\n       \"type\": \"string\",\n       \"description\": \"The make of the camera used to create the photo.\"\n      },\n      \"cameraModel\": {\n       \"type\": \"string\",\n       \"description\": \"The model of the camera used to create the photo.\"\n      },\n      \"colorSpace\": {\n       \"type\": \"string\",\n       \"description\": \"The color space of the photo.\"\n      },\n      \"exposureBias\": {\n       \"type\": \"number\",\n       \"description\": \"The exposure bias of the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"exposureMode\": {\n       \"type\": \"string\",\n       \"description\": \"The exposure mode used to create the photo.\"\n      },\n      \"exposureTime\": {\n       \"type\": \"number\",\n       \"description\": \"The length of the exposure, in seconds.\",\n       \"format\": \"float\"\n      },\n      \"flashUsed\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether a flash was used to create the photo.\"\n      },\n      \"focalLength\": {\n       \"type\": \"number\",\n       \"description\": \"The focal length used to create the photo, in millimeters.\",\n       \"format\": \"float\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the image in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"isoSpeed\": {\n       \"type\": \"integer\",\n       \"description\": \"The ISO speed used to create the photo.\",\n       \"format\": \"int32\"\n      },\n      \"lens\": {\n       \"type\": \"string\",\n       \"description\": \"The lens used to create the photo.\"\n      },\n      \"location\": {\n       \"type\": \"object\",\n       \"description\": \"Geographic location information stored in the image.\",\n       \"properties\": {\n        \"altitude\": {\n         \"type\": \"number\",\n         \"description\": \"The altitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"latitude\": {\n         \"type\": \"number\",\n         \"description\": \"The latitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"longitude\": {\n         \"type\": \"number\",\n         \"description\": \"The longitude stored in the image.\",\n         \"format\": \"double\"\n        }\n       }\n      },\n      \"maxApertureValue\": {\n       \"type\": \"number\",\n       \"description\": \"The smallest f-number of the lens at the focal length used to create the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"meteringMode\": {\n       \"type\": \"string\",\n       \"description\": \"The metering mode used to create the photo.\"\n      },\n      \"rotation\": {\n       \"type\": \"integer\",\n       \"description\": \"The rotation in clockwise degrees from the image's original orientation.\",\n       \"format\": \"int32\"\n      },\n      \"sensor\": {\n       \"type\": \"string\",\n       \"description\": \"The type of sensor used to create the photo.\"\n      },\n      \"subjectDistance\": {\n       \"type\": \"integer\",\n       \"description\": \"The distance to the subject of the photo, in meters.\",\n       \"format\": \"int32\"\n      },\n      \"time\": {\n       \"type\": \"string\",\n       \"description\": \"The date and time the photo was taken (EXIF DateTime).\"\n      },\n      \"whiteBalance\": {\n       \"type\": \"string\",\n       \"description\": \"The white balance mode used to create the photo.\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the image in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"isAppAuthorized\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file was created or opened by the requesting app.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\",\n     \"default\": \"drive#file\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify the file.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"\n    },\n    \"modifiedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been modified by this user.\"\n    },\n    \"modifiedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\",\n     \"format\": \"date-time\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"\n    },\n    \"ownedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user owns the file. Not populated for Team Drive files.\"\n    },\n    \"owners\": {\n     \"type\": \"array\",\n     \"description\": \"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\",\n     \"items\": {\n      \"$ref\": \"User\"\n     }\n    },\n    \"parents\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    },\n    \"properties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"quotaBytesUsed\": {\n     \"type\": \"string\",\n     \"description\": \"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\",\n     \"format\": \"int64\"\n    },\n    \"shared\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been shared. Not populated for Team Drive files.\"\n    },\n    \"sharedWithMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"sharingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who shared the file with the requesting user, if applicable.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    },\n    \"spaces\": {\n     \"type\": \"array\",\n     \"description\": \"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"starred\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has starred the file.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"ID of the Team Drive the file resides in.\"\n    },\n    \"thumbnailLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"\n    },\n    \"thumbnailVersion\": {\n     \"type\": \"string\",\n     \"description\": \"The thumbnail version for use in thumbnail cache invalidation.\",\n     \"format\": \"int64\"\n    },\n    \"trashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"\n    },\n    \"trashedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\",\n     \"format\": \"date-time\"\n    },\n    \"trashingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"\n    },\n    \"version\": {\n     \"type\": \"string\",\n     \"description\": \"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\",\n     \"format\": \"int64\"\n    },\n    \"videoMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about video media. This may not be available immediately upon upload.\",\n     \"properties\": {\n      \"durationMillis\": {\n       \"type\": \"string\",\n       \"description\": \"The duration of the video in milliseconds.\",\n       \"format\": \"int64\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the video in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the video in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"viewedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been viewed by this user.\"\n    },\n    \"viewedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was viewed by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"viewersCanCopyContent\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"\n    },\n    \"webContentLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"\n    },\n    \"webViewLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for opening the file in a relevant Google editor or viewer in a browser.\"\n    },\n    \"writersCanShare\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"\n    }\n   }\n  },\n  \"FileList\": {\n   \"id\": \"FileList\",\n   \"type\": \"object\",\n   \"description\": \"A list of files.\",\n   \"properties\": {\n    \"files\": {\n     \"type\": \"array\",\n     \"description\": \"The list of files. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"File\"\n     }\n    },\n    \"incompleteSearch\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the search process was incomplete. If true, then some search results may be missing, since all documents were not searched. This may occur when searching multiple Team Drives with the \\\"user,allTeamDrives\\\" corpora, but all corpora could not be searched. When this happens, it is suggested that clients narrow their query by choosing a different corpus such as \\\"user\\\" or \\\"teamDrive\\\".\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#fileList\\\".\",\n     \"default\": \"drive#fileList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of files. This will be absent if the end of the files list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"GeneratedIds\": {\n   \"id\": \"GeneratedIds\",\n   \"type\": \"object\",\n   \"description\": \"A list of generated file IDs which can be provided in create requests.\",\n   \"properties\": {\n    \"ids\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs generated for the requesting user in the specified space.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#generatedIds\\\".\",\n     \"default\": \"drive#generatedIds\"\n    },\n    \"space\": {\n     \"type\": \"string\",\n     \"description\": \"The type of file that can be created with these IDs.\"\n    }\n   }\n  },\n  \"Permission\": {\n   \"id\": \"Permission\",\n   \"type\": \"object\",\n   \"description\": \"A permission for a file. A permission grants a user, group, domain or the world access to a file or a folder hierarchy.\",\n   \"properties\": {\n    \"allowFileDiscovery\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"\n    },\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A displayable name for users, groups or domains.\"\n    },\n    \"domain\": {\n     \"type\": \"string\",\n     \"description\": \"The domain to which this permission refers.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user or group to which this permission refers.\"\n    },\n    \"expirationTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\",\n     \"default\": \"drive#permission\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    },\n    \"role\": {\n     \"type\": \"string\",\n     \"description\": \"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- organizer \\n- owner \\n- writer \\n- commenter \\n- reader\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    },\n    \"teamDrivePermissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Whether this permission is inherited. This field is always populated. This is an output-only field.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the item from which this permission is inherited. This is an output-only field and is only populated for members of the Team Drive.\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"The primary role for this user. While new values may be added in the future, the following are currently possible:  \\n- organizer \\n- writer \\n- commenter \\n- reader\"\n       },\n       \"teamDrivePermissionType\": {\n        \"type\": \"string\",\n        \"description\": \"The Team Drive permission type for this user. While new values may be added in future, the following are currently possible:  \\n- file \\n- member\"\n       }\n      }\n     }\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    }\n   }\n  },\n  \"PermissionList\": {\n   \"id\": \"PermissionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of permissions for a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permissionList\\\".\",\n     \"default\": \"drive#permissionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of permissions. This field will be absent if the end of the permissions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of permissions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    }\n   }\n  },\n  \"Reply\": {\n   \"id\": \"Reply\",\n   \"type\": \"object\",\n   \"description\": \"A reply to a comment on a file.\",\n   \"properties\": {\n    \"action\": {\n     \"type\": \"string\",\n     \"description\": \"The action the reply performed to the parent comment. Valid values are:  \\n- resolve \\n- reopen\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who created the reply.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the reply. This field is used for setting the content, while htmlContent should be displayed. This is required on creates if no action is specified.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.replies.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the reply was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the reply has been deleted. A deleted reply has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the reply with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the reply.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#reply\\\".\",\n     \"default\": \"drive#reply\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the reply was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    }\n   }\n  },\n  \"ReplyList\": {\n   \"id\": \"ReplyList\",\n   \"type\": \"object\",\n   \"description\": \"A list of replies to a comment on a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#replyList\\\".\",\n     \"default\": \"drive#replyList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of replies. This will be absent if the end of the replies list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The list of replies. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    }\n   }\n  },\n  \"Revision\": {\n   \"id\": \"Revision\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a revision to a file.\",\n   \"properties\": {\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the revision.\"\n    },\n    \"keepForever\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\",\n     \"default\": \"drive#revision\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify this revision.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the revision.\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the revision was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"\n    },\n    \"publishAuto\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.\"\n    },\n    \"published\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published. This is only applicable to Google Docs.\"\n    },\n    \"publishedOutsideDomain\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published outside the domain. This is only applicable to Google Docs.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    }\n   }\n  },\n  \"RevisionList\": {\n   \"id\": \"RevisionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of revisions of a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revisionList\\\".\",\n     \"default\": \"drive#revisionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of revisions. This will be absent if the end of the revisions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"revisions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of revisions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Revision\"\n     }\n    }\n   }\n  },\n  \"StartPageToken\": {\n   \"id\": \"StartPageToken\",\n   \"type\": \"object\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#startPageToken\\\".\",\n     \"default\": \"drive#startPageToken\"\n    },\n    \"startPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for listing changes.\"\n    }\n   }\n  },\n  \"TeamDrive\": {\n   \"id\": \"TeamDrive\",\n   \"type\": \"object\",\n   \"description\": \"Representation of a Team Drive.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this Team Drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this Team Drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this Team Drive.\"\n      },\n      \"canChangeTeamDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this Team Drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this Team Drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this Team Drive.\"\n      },\n      \"canDeleteTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this Team Drive. Attempting to delete the Team Drive may still fail if there are untrashed items inside the Team Drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this Team Drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this Team Drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this Team Drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this Team Drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this Team Drive.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove children from folders in this Team Drive.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this Team Drive.\"\n      },\n      \"canRenameTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this Team Drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this Team Drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this Team Drive which is also the ID of the top level folder for this Team Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\",\n     \"default\": \"drive#teamDrive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this Team Drive.\"\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"TeamDriveList\": {\n   \"id\": \"TeamDriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of Team Drives.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDriveList\\\".\",\n     \"default\": \"drive#teamDriveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of Team Drives. This will be absent if the end of the Team Drives list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"teamDrives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of Team Drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"TeamDrive\"\n     }\n    }\n   }\n  },\n  \"User\": {\n   \"id\": \"User\",\n   \"type\": \"object\",\n   \"description\": \"Information about a Drive user.\",\n   \"properties\": {\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A plain text displayable name for this user.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#user\\\".\",\n     \"default\": \"drive#user\"\n    },\n    \"me\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this user is the requesting user.\"\n    },\n    \"permissionId\": {\n     \"type\": \"string\",\n     \"description\": \"The user's ID as visible in Permission resources.\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    }\n   }\n  }\n },\n \"resources\": {\n  \"about\": {\n   \"methods\": {\n    \"get\": {\n     \"id\": \"drive.about.get\",\n     \"path\": \"about\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets information about the user, the user's Drive, and system capabilities.\",\n     \"response\": {\n      \"$ref\": \"About\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"changes\": {\n   \"methods\": {\n    \"getStartPageToken\": {\n     \"id\": \"drive.changes.getStartPageToken\",\n     \"path\": \"changes/startPageToken\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets the starting pageToken for listing future changes.\",\n     \"parameters\": {\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive for which the starting pageToken for listing future changes from that Team Drive will be returned.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"StartPageToken\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.changes.list\",\n     \"path\": \"changes\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the changes for a user or Team Drive.\",\n     \"parameters\": {\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether Team Drive files or changes should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The Team Drive from which changes will be returned. If specified the change IDs will be reflective of the Team Drive; use the combined Team Drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"response\": {\n      \"$ref\": \"ChangeList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    },\n    \"watch\": {\n     \"id\": \"drive.changes.watch\",\n     \"path\": \"changes/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes for a user.\",\n     \"parameters\": {\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether Team Drive files or changes should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The Team Drive from which changes will be returned. If specified the change IDs will be reflective of the Team Drive; use the combined Team Drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"channels\": {\n   \"methods\": {\n    \"stop\": {\n     \"id\": \"drive.channels.stop\",\n     \"path\": \"channels/stop\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Stop watching resources through this channel\",\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"comments\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.comments.create\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new comment on a file.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.comments.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.comments.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a comment by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.comments.list\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's comments.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of comments to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"startModifiedTime\": {\n       \"type\": \"string\",\n       \"description\": \"The minimum value of 'modifiedTime' for the result comments (RFC 3339 date-time).\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"CommentList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.comments.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a comment with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"files\": {\n   \"methods\": {\n    \"copy\": {\n     \"id\": \"drive.files.copy\",\n     \"path\": \"files/{fileId}/copy\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a copy of a file and applies any requested updates with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\"\n     ]\n    },\n    \"create\": {\n     \"id\": \"drive.files.create\",\n     \"path\": \"files\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new file.\",\n     \"parameters\": {\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files\"\n       }\n      }\n     },\n     \"supportsSubscription\": true\n    },\n    \"delete\": {\n     \"id\": \"drive.files.delete\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a Team Drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"emptyTrash\": {\n     \"id\": \"drive.files.emptyTrash\",\n     \"path\": \"files/trash\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes all of the user's trashed files.\",\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"export\": {\n     \"id\": \"drive.files.export\",\n     \"path\": \"files/{fileId}/export\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the format requested for this export.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"mimeType\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true\n    },\n    \"generateIds\": {\n     \"id\": \"drive.files.generateIds\",\n     \"path\": \"files/generateIds\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Generates a set of file IDs which can be provided in create requests.\",\n     \"parameters\": {\n      \"count\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of IDs to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"space\": {\n       \"type\": \"string\",\n       \"description\": \"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"GeneratedIds\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.files.get\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a file's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    },\n    \"list\": {\n     \"id\": \"drive.files.list\",\n     \"path\": \"files\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists or searches files.\",\n     \"parameters\": {\n      \"corpora\": {\n       \"type\": \"string\",\n       \"description\": \"Comma-separated list of bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'teamDrive' and 'allTeamDrives'. 'allTeamDrives' must be combined with 'user'; all other values must be used in isolation. Prefer 'user' or 'teamDrive' to 'allTeamDrives' for efficiency.\",\n       \"location\": \"query\"\n      },\n      \"corpus\": {\n       \"type\": \"string\",\n       \"description\": \"The source of files to list. Deprecated: use 'corpora' instead.\",\n       \"enum\": [\n        \"domain\",\n        \"user\"\n       ],\n       \"enumDescriptions\": [\n        \"Files shared to the user's domain.\",\n        \"Files owned by or shared to the user.\"\n       ],\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether Team Drive items should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"orderBy\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"ID of Team Drive to search.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"FileList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.files.update\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a file's metadata and/or content with patch semantics.\",\n     \"parameters\": {\n      \"addParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to add.\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"removeParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to remove.\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.scripts\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files/{fileId}\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files/{fileId}\"\n       }\n      }\n     }\n    },\n    \"watch\": {\n     \"id\": \"drive.files.watch\",\n     \"path\": \"files/{fileId}/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes to a file\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"permissions\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.permissions.create\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a permission for a file or Team Drive.\",\n     \"parameters\": {\n      \"emailMessage\": {\n       \"type\": \"string\",\n       \"description\": \"A custom message to include in the notification email.\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"sendNotificationEmail\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.permissions.delete\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a permission.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.permissions.get\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a permission by ID.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.permissions.list\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's or Team Drive's permissions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of permissions to return per page. When not set for files in a Team Drive, at most 100 results will be returned. When not set for files that are not in a Team Drive, the entire list will be returned.\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"PermissionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.permissions.update\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a permission with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"removeExpiration\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to remove the expiration date.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"replies\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.replies.create\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new reply to a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.replies.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a reply.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.replies.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a reply by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.replies.list\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a comment's replies.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of replies to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"ReplyList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.replies.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a reply with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"revisions\": {\n   \"methods\": {\n    \"delete\": {\n     \"id\": \"drive.revisions.delete\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a revision. This method is only applicable to files with binary content in Drive.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.revisions.get\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a revision's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true\n    },\n    \"list\": {\n     \"id\": \"drive.revisions.list\",\n     \"path\": \"files/{fileId}/revisions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's revisions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of revisions to return per page.\",\n       \"default\": \"200\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"RevisionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.revisions.update\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a revision with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Revision\"\n     },\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"teamdrives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.teamdrives.create\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new Team Drive.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.teamdrives.delete\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a Team Drive for which the user is an organizer. The Team Drive cannot contain any untrashed items.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.teamdrives.get\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a Team Drive's metadata by ID.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.teamdrives.list\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the user's Team Drives.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of Team Drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for Team Drives.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"TeamDriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.teamdrives.update\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a Team Drive's metadata\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  }\n }\n}\n\n"
  },
  {
    "path": "data-raw/old/20170721_drive-v3_endpoints-list.json",
    "content": "{\n  \"drive.about.get\": {\n    \"id\": [\"drive.about.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/about\"],\n    \"parameters\": {\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets information about the user, the user's Drive, and system capabilities.\"],\n    \"response\": [\"About\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.copy\": {\n    \"id\": [\"drive.files.copy\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files/{fileId}/copy\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"ignoreDefaultVisibility\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.photos.readonly\"],\n    \"description\": [\"Creates a copy of a file and applies any requested updates with patch semantics.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.create\": {\n    \"id\": [\"drive.files.create\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files\"],\n    \"parameters\": {\n      \"ignoreDefaultVisibility\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Creates a new file.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [null],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files\"]\n        }\n      }\n    },\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.create.media\": {\n    \"id\": [\"drive.files.create.media\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"/upload/drive/v3/files\"],\n    \"parameters\": {\n      \"ignoreDefaultVisibility\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      },\n      \"uploadType\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [null]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Creates a new file.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [null],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files\"]\n        }\n      }\n    },\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.delete\": {\n    \"id\": [\"drive.files.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a Team Drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.emptyTrash\": {\n    \"id\": [\"drive.files.emptyTrash\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/trash\"],\n    \"parameters\": {\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive\"],\n    \"description\": [\"Permanently deletes all of the user's trashed files.\"],\n    \"response\": [null],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.export\": {\n    \"id\": [\"drive.files.export\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/export\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the format requested for this export.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file, drive.readonly\"],\n    \"description\": [\"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId, mimeType\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.generateIds\": {\n    \"id\": [\"drive.files.generateIds\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/generateIds\"],\n    \"parameters\": {\n      \"count\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The number of IDs to return.\"]\n      },\n      \"space\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Generates a set of file IDs which can be provided in create requests.\"],\n    \"response\": [\"GeneratedIds\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.get\": {\n    \"id\": [\"drive.files.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"acknowledgeAbuse\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets a file's metadata or content by ID.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": [true]\n  },\n  \"drive.files.list\": {\n    \"id\": [\"drive.files.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files\"],\n    \"parameters\": {\n      \"corpora\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Comma-separated list of bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'teamDrive' and 'allTeamDrives'. 'allTeamDrives' must be combined with 'user'; all other values must be used in isolation. Prefer 'user' or 'teamDrive' to 'allTeamDrives' for efficiency.\"]\n      },\n      \"corpus\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"domain\"],\n        \"description\": [\"The source of files to list. Deprecated: use 'corpora' instead.\"]\n      },\n      \"includeTeamDriveItems\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether Team Drive items should be included in results.\"]\n      },\n      \"orderBy\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\"]\n      },\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\"]\n      },\n      \"q\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of Team Drive to search.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Lists or searches files.\"],\n    \"response\": [\"FileList\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.update\": {\n    \"id\": [\"drive.files.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"addParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to add.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"removeParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to remove.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.scripts\"],\n    \"description\": [\"Updates a file's metadata and/or content with patch semantics.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files/{fileId}\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files/{fileId}\"]\n        }\n      }\n    },\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.update.media\": {\n    \"id\": [\"drive.files.update.media\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"/upload/drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"addParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to add.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"removeParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to remove.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      },\n      \"uploadType\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [null]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.scripts\"],\n    \"description\": [\"Updates a file's metadata and/or content with patch semantics.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files/{fileId}\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files/{fileId}\"]\n        }\n      }\n    },\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.watch\": {\n    \"id\": [\"drive.files.watch\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files/{fileId}/watch\"],\n    \"parameters\": {\n      \"acknowledgeAbuse\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Subscribes to changes to a file\"],\n    \"response\": [\"Channel\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"Channel\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": [true]\n  },\n  \"drive.permissions.create\": {\n    \"id\": [\"drive.permissions.create\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions\"],\n    \"parameters\": {\n      \"emailMessage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A custom message to include in the notification email.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"sendNotificationEmail\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"transferOwnership\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\"]\n      },\n      \"allowFileDiscovery\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"]\n      },\n      \"deleted\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"]\n      },\n      \"displayName\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A displayable name for users, groups or domains.\"]\n      },\n      \"domain\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The domain to which this permission refers.\"]\n      },\n      \"emailAddress\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The email address of the user or group to which this permission refers.\"]\n      },\n      \"expirationTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\"]\n      },\n      \"photoLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link to the user's profile photo, if available.\"]\n      },\n      \"role\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- organizer \\n- owner \\n- writer \\n- commenter \\n- reader\"]\n      },\n      \"teamDrivePermissionDetails\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\"]\n      },\n      \"type\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file\"],\n    \"description\": [\"Creates a permission for a file or Team Drive.\"],\n    \"response\": [\"Permission\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"Permission\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.delete\": {\n    \"id\": [\"drive.permissions.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions/{permissionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"permissionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the permission.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file\"],\n    \"description\": [\"Deletes a permission.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId, permissionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.get\": {\n    \"id\": [\"drive.permissions.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions/{permissionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"permissionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the permission.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets a permission by ID.\"],\n    \"response\": [\"Permission\"],\n    \"parameterOrder\": [\"fileId, permissionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.list\": {\n    \"id\": [\"drive.permissions.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The maximum number of permissions to return per page. When not set for files in a Team Drive, at most 100 results will be returned. When not set for files that are not in a Team Drive, the entire list will be returned.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Lists a file's or Team Drive's permissions.\"],\n    \"response\": [\"PermissionList\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.update\": {\n    \"id\": [\"drive.permissions.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions/{permissionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"permissionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the permission.\"]\n      },\n      \"removeExpiration\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to remove the expiration date.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"transferOwnership\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\"]\n      },\n      \"allowFileDiscovery\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"]\n      },\n      \"deleted\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"]\n      },\n      \"displayName\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A displayable name for users, groups or domains.\"]\n      },\n      \"domain\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The domain to which this permission refers.\"]\n      },\n      \"emailAddress\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The email address of the user or group to which this permission refers.\"]\n      },\n      \"expirationTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\"]\n      },\n      \"photoLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link to the user's profile photo, if available.\"]\n      },\n      \"role\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- organizer \\n- owner \\n- writer \\n- commenter \\n- reader\"]\n      },\n      \"teamDrivePermissionDetails\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\"]\n      },\n      \"type\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file\"],\n    \"description\": [\"Updates a permission with patch semantics.\"],\n    \"response\": [\"Permission\"],\n    \"parameterOrder\": [\"fileId, permissionId\"],\n    \"request\": [\"Permission\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.revisions.delete\": {\n    \"id\": [\"drive.revisions.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions/{revisionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"revisionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Permanently deletes a revision. This method is only applicable to files with binary content in Drive.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId, revisionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.revisions.get\": {\n    \"id\": [\"drive.revisions.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions/{revisionId}\"],\n    \"parameters\": {\n      \"acknowledgeAbuse\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"revisionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets a revision's metadata or content by ID.\"],\n    \"response\": [\"Revision\"],\n    \"parameterOrder\": [\"fileId, revisionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": [true]\n  },\n  \"drive.revisions.list\": {\n    \"id\": [\"drive.revisions.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The maximum number of revisions to return per page.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Lists a file's revisions.\"],\n    \"response\": [\"RevisionList\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.revisions.update\": {\n    \"id\": [\"drive.revisions.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions/{revisionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"revisionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"keepForever\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify this revision.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the revision.\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the revision was modified (RFC 3339 date-time).\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"publishAuto\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.\"]\n      },\n      \"published\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this revision is published. This is only applicable to Google Docs.\"]\n      },\n      \"publishedOutsideDomain\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this revision is published outside the domain. This is only applicable to Google Docs.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Updates a revision with patch semantics.\"],\n    \"response\": [\"Revision\"],\n    \"parameterOrder\": [\"fileId, revisionId\"],\n    \"request\": [\"Revision\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.create\": {\n    \"id\": [\"drive.teamdrives.create\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/teamdrives\"],\n    \"parameters\": {\n      \"requestId\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\"]\n      },\n      \"backgroundImageFile\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\"]\n      },\n      \"backgroundImageLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to this Team Drive's background image.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this Team Drive.\"]\n      },\n      \"colorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this Team Drive which is also the ID of the top level folder for this Team Drive.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of this Team Drive.\"]\n      },\n      \"themeId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive\"],\n    \"description\": [\"Creates a new Team Drive.\"],\n    \"response\": [\"TeamDrive\"],\n    \"parameterOrder\": [\"requestId\"],\n    \"request\": [\"TeamDrive\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.delete\": {\n    \"id\": [\"drive.teamdrives.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/teamdrives/{teamDriveId}\"],\n    \"parameters\": {\n      \"teamDriveId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the Team Drive\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive\"],\n    \"description\": [\"Permanently deletes a Team Drive for which the user is an organizer. The Team Drive cannot contain any untrashed items.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"teamDriveId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.get\": {\n    \"id\": [\"drive.teamdrives.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/teamdrives/{teamDriveId}\"],\n    \"parameters\": {\n      \"teamDriveId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the Team Drive\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.readonly\"],\n    \"description\": [\"Gets a Team Drive's metadata by ID.\"],\n    \"response\": [\"TeamDrive\"],\n    \"parameterOrder\": [\"teamDriveId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.list\": {\n    \"id\": [\"drive.teamdrives.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/teamdrives\"],\n    \"parameters\": {\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"Maximum number of Team Drives to return.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Page token for Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.readonly\"],\n    \"description\": [\"Lists the user's Team Drives.\"],\n    \"response\": [\"TeamDriveList\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.update\": {\n    \"id\": [\"drive.teamdrives.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/teamdrives/{teamDriveId}\"],\n    \"parameters\": {\n      \"teamDriveId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the Team Drive\"]\n      },\n      \"backgroundImageFile\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\"]\n      },\n      \"backgroundImageLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to this Team Drive's background image.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this Team Drive.\"]\n      },\n      \"colorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this Team Drive which is also the ID of the top level folder for this Team Drive.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of this Team Drive.\"]\n      },\n      \"themeId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive\"],\n    \"description\": [\"Updates a Team Drive's metadata\"],\n    \"response\": [\"TeamDrive\"],\n    \"parameterOrder\": [\"teamDriveId\"],\n    \"request\": [\"TeamDrive\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  }\n}\n"
  },
  {
    "path": "data-raw/old/20171110_drive-v3_discovery-document.json",
    "content": "{\n \"kind\": \"discovery#restDescription\",\n \"etag\": \"\\\"YWOzh2SDasdU84ArJnpYek-OMdg/AEVtwe7z5EsohwHDzv8_woT69CA\\\"\",\n \"discoveryVersion\": \"v1\",\n \"id\": \"drive:v3\",\n \"name\": \"drive\",\n \"version\": \"v3\",\n \"revision\": \"20171110\",\n \"title\": \"Drive API\",\n \"description\": \"Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.\",\n \"ownerDomain\": \"google.com\",\n \"ownerName\": \"Google\",\n \"icons\": {\n  \"x16\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png\",\n  \"x32\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png\"\n },\n \"documentationLink\": \"https://developers.google.com/drive/\",\n \"protocol\": \"rest\",\n \"baseUrl\": \"https://www.googleapis.com/drive/v3/\",\n \"basePath\": \"/drive/v3/\",\n \"rootUrl\": \"https://www.googleapis.com/\",\n \"servicePath\": \"drive/v3/\",\n \"batchPath\": \"batch/drive/v3\",\n \"parameters\": {\n  \"alt\": {\n   \"type\": \"string\",\n   \"description\": \"Data format for the response.\",\n   \"default\": \"json\",\n   \"enum\": [\n    \"json\"\n   ],\n   \"enumDescriptions\": [\n    \"Responses with Content-Type of application/json\"\n   ],\n   \"location\": \"query\"\n  },\n  \"fields\": {\n   \"type\": \"string\",\n   \"description\": \"Selector specifying which fields to include in a partial response.\",\n   \"location\": \"query\"\n  },\n  \"key\": {\n   \"type\": \"string\",\n   \"description\": \"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\",\n   \"location\": \"query\"\n  },\n  \"oauth_token\": {\n   \"type\": \"string\",\n   \"description\": \"OAuth 2.0 token for the current user.\",\n   \"location\": \"query\"\n  },\n  \"prettyPrint\": {\n   \"type\": \"boolean\",\n   \"description\": \"Returns response with indentations and line breaks.\",\n   \"default\": \"true\",\n   \"location\": \"query\"\n  },\n  \"quotaUser\": {\n   \"type\": \"string\",\n   \"description\": \"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\",\n   \"location\": \"query\"\n  },\n  \"userIp\": {\n   \"type\": \"string\",\n   \"description\": \"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\",\n   \"location\": \"query\"\n  }\n },\n \"auth\": {\n  \"oauth2\": {\n   \"scopes\": {\n    \"https://www.googleapis.com/auth/drive\": {\n     \"description\": \"View and manage the files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.appdata\": {\n     \"description\": \"View and manage its own configuration data in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.file\": {\n     \"description\": \"View and manage Google Drive files and folders that you have opened or created with this app\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata\": {\n     \"description\": \"View and manage metadata of files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata.readonly\": {\n     \"description\": \"View metadata for files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.photos.readonly\": {\n     \"description\": \"View the photos, videos and albums in your Google Photos\"\n    },\n    \"https://www.googleapis.com/auth/drive.readonly\": {\n     \"description\": \"View the files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.scripts\": {\n     \"description\": \"Modify your Google Apps Script scripts' behavior\"\n    }\n   }\n  }\n },\n \"schemas\": {\n  \"About\": {\n   \"id\": \"About\",\n   \"type\": \"object\",\n   \"description\": \"Information about the user, the user's Drive, and system capabilities.\",\n   \"properties\": {\n    \"appInstalled\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has installed the requesting app.\"\n    },\n    \"exportFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported exports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"folderColorPalette\": {\n     \"type\": \"array\",\n     \"description\": \"The currently supported folder colors as RGB hex strings.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"importFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported imports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#about\\\".\",\n     \"default\": \"drive#about\"\n    },\n    \"maxImportSizes\": {\n     \"type\": \"object\",\n     \"description\": \"A map of maximum import sizes by MIME type, in bytes.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"format\": \"int64\"\n     }\n    },\n    \"maxUploadSize\": {\n     \"type\": \"string\",\n     \"description\": \"The maximum upload size in bytes.\",\n     \"format\": \"int64\"\n    },\n    \"storageQuota\": {\n     \"type\": \"object\",\n     \"description\": \"The user's storage quota limits and usage. All fields are measured in bytes.\",\n     \"properties\": {\n      \"limit\": {\n       \"type\": \"string\",\n       \"description\": \"The usage limit, if applicable. This will not be present if the user has unlimited storage.\",\n       \"format\": \"int64\"\n      },\n      \"usage\": {\n       \"type\": \"string\",\n       \"description\": \"The total usage across all services.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDrive\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by all files in Google Drive.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDriveTrash\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by trashed files in Google Drive.\",\n       \"format\": \"int64\"\n      }\n     }\n    },\n    \"teamDriveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"A list of themes that are supported for Team Drives.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"A link to this Team Drive theme's background image.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"The color of this Team Drive theme as an RGB hex string.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the theme.\"\n       }\n      }\n     }\n    },\n    \"user\": {\n     \"$ref\": \"User\",\n     \"description\": \"The authenticated user.\"\n    }\n   }\n  },\n  \"Change\": {\n   \"id\": \"Change\",\n   \"type\": \"object\",\n   \"description\": \"A change to a file or Team Drive.\",\n   \"properties\": {\n    \"file\": {\n     \"$ref\": \"File\",\n     \"description\": \"The updated state of the file. Present if the type is file and the file has not been removed from this list of changes.\"\n    },\n    \"fileId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file which has changed.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#change\\\".\",\n     \"default\": \"drive#change\"\n    },\n    \"removed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file or Team Drive has been removed from this list of changes, for example by deletion or loss of access.\"\n    },\n    \"teamDrive\": {\n     \"$ref\": \"TeamDrive\",\n     \"description\": \"The updated state of the Team Drive. Present if the type is teamDrive, the user is still a member of the Team Drive, and the Team Drive has not been removed.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the Team Drive associated with this change.\"\n    },\n    \"time\": {\n     \"type\": \"string\",\n     \"description\": \"The time of this change (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the change. Possible values are file and teamDrive.\"\n    }\n   }\n  },\n  \"ChangeList\": {\n   \"id\": \"ChangeList\",\n   \"type\": \"object\",\n   \"description\": \"A list of changes for a user.\",\n   \"properties\": {\n    \"changes\": {\n     \"type\": \"array\",\n     \"description\": \"The list of changes. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Change\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#changeList\\\".\",\n     \"default\": \"drive#changeList\"\n    },\n    \"newStartPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for future changes. This will be present only if the end of the current changes list has been reached.\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of changes. This will be absent if the end of the changes list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"Channel\": {\n   \"id\": \"Channel\",\n   \"type\": \"object\",\n   \"description\": \"An notification channel used to watch for resource changes.\",\n   \"properties\": {\n    \"address\": {\n     \"type\": \"string\",\n     \"description\": \"The address where notifications are delivered for this channel.\"\n    },\n    \"expiration\": {\n     \"type\": \"string\",\n     \"description\": \"Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.\",\n     \"format\": \"int64\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"A UUID or similar unique string that identifies this channel.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies this as a notification channel used to watch for changes to a resource. Value: the fixed string \\\"api#channel\\\".\",\n     \"default\": \"api#channel\"\n    },\n    \"params\": {\n     \"type\": \"object\",\n     \"description\": \"Additional parameters controlling delivery channel behavior. Optional.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"Declares a new parameter by name.\"\n     }\n    },\n    \"payload\": {\n     \"type\": \"boolean\",\n     \"description\": \"A Boolean value to indicate whether payload is wanted. Optional.\"\n    },\n    \"resourceId\": {\n     \"type\": \"string\",\n     \"description\": \"An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.\"\n    },\n    \"resourceUri\": {\n     \"type\": \"string\",\n     \"description\": \"A version-specific identifier for the watched resource.\"\n    },\n    \"token\": {\n     \"type\": \"string\",\n     \"description\": \"An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of delivery mechanism used for this channel.\"\n    }\n   }\n  },\n  \"Comment\": {\n   \"id\": \"Comment\",\n   \"type\": \"object\",\n   \"description\": \"A comment on a file.\",\n   \"properties\": {\n    \"anchor\": {\n     \"type\": \"string\",\n     \"description\": \"A region of the document represented as a JSON string. See anchor documentation for details on how to define and interpret anchor properties.\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who created the comment.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the comment. This field is used for setting the content, while htmlContent should be displayed.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.comments.create\",\n       \"drive.comments.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the comment was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been deleted. A deleted comment has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the comment with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the comment.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#comment\\\".\",\n     \"default\": \"drive#comment\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the comment or any of its replies was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"quotedFileContent\": {\n     \"type\": \"object\",\n     \"description\": \"The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.\",\n     \"properties\": {\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the quoted content.\"\n      },\n      \"value\": {\n       \"type\": \"string\",\n       \"description\": \"The quoted content itself. This is interpreted as plain text if set through the API.\"\n      }\n     }\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of replies to the comment in chronological order.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    },\n    \"resolved\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been resolved by one of its replies.\"\n    }\n   }\n  },\n  \"CommentList\": {\n   \"id\": \"CommentList\",\n   \"type\": \"object\",\n   \"description\": \"A list of comments on a file.\",\n   \"properties\": {\n    \"comments\": {\n     \"type\": \"array\",\n     \"description\": \"The list of comments. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Comment\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#commentList\\\".\",\n     \"default\": \"drive#commentList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of comments. This will be absent if the end of the comments list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"File\": {\n   \"id\": \"File\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a file.\",\n   \"properties\": {\n    \"appProperties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to this folder. This is always false when the item is not a folder.\"\n      },\n      \"canChangeViewersCanCopyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change whether viewers can copy the contents of this file.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on this file.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy this file. For a Team Drive item, whether the current user can copy non-folder descendants of this item, or this item itself if it is not a folder.\"\n      },\n      \"canDelete\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this file.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download this file.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit this file.\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of this folder. This is always false when the item is not a folder.\"\n      },\n      \"canMoveItemIntoTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item into a Team Drive. If the item is in a Team Drive, this field is equivalent to canMoveTeamDriveItem.\"\n      },\n      \"canMoveTeamDriveItem\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this Team Drive item by changing its parent. Note that a request to change the parent for this item may still fail depending on the new parent that is being added. Only populated for Team Drive files.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of this file. For a Team Drive item, whether revisions of non-folder descendants of this item, or this item itself if it is not a folder, can be read.\"\n      },\n      \"canReadTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the Team Drive to which this file belongs. Only populated for Team Drive files.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove children from this folder. This is always false when the item is not a folder.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this file.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the sharing settings for this file.\"\n      },\n      \"canTrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this file to trash.\"\n      },\n      \"canUntrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can restore this file from trash.\"\n      }\n     }\n    },\n    \"contentHints\": {\n     \"type\": \"object\",\n     \"description\": \"Additional information about the content of the file. These fields are never populated in responses.\",\n     \"properties\": {\n      \"indexableText\": {\n       \"type\": \"string\",\n       \"description\": \"Text to be indexed for the file to improve fullText queries. This is limited to 128KB in length and may contain HTML elements.\"\n      },\n      \"thumbnail\": {\n       \"type\": \"object\",\n       \"description\": \"A thumbnail for the file. This will only be used if Drive cannot generate a standard thumbnail.\",\n       \"properties\": {\n        \"image\": {\n         \"type\": \"string\",\n         \"description\": \"The thumbnail data encoded with URL-safe Base64 (RFC 4648 section 5).\",\n         \"format\": \"byte\"\n        },\n        \"mimeType\": {\n         \"type\": \"string\",\n         \"description\": \"The MIME type of the thumbnail.\"\n        }\n       }\n      }\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"description\": {\n     \"type\": \"string\",\n     \"description\": \"A short description of the file.\"\n    },\n    \"explicitlyTrashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"\n    },\n    \"fileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"\n    },\n    \"folderColorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"\n    },\n    \"fullFileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"\n    },\n    \"hasAugmentedPermissions\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"\n    },\n    \"hasThumbnail\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"\n    },\n    \"headRevisionId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"\n    },\n    \"iconLink\": {\n     \"type\": \"string\",\n     \"description\": \"A static, unauthenticated link to the file's icon.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file.\"\n    },\n    \"imageMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about image media, if available.\",\n     \"properties\": {\n      \"aperture\": {\n       \"type\": \"number\",\n       \"description\": \"The aperture used to create the photo (f-number).\",\n       \"format\": \"float\"\n      },\n      \"cameraMake\": {\n       \"type\": \"string\",\n       \"description\": \"The make of the camera used to create the photo.\"\n      },\n      \"cameraModel\": {\n       \"type\": \"string\",\n       \"description\": \"The model of the camera used to create the photo.\"\n      },\n      \"colorSpace\": {\n       \"type\": \"string\",\n       \"description\": \"The color space of the photo.\"\n      },\n      \"exposureBias\": {\n       \"type\": \"number\",\n       \"description\": \"The exposure bias of the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"exposureMode\": {\n       \"type\": \"string\",\n       \"description\": \"The exposure mode used to create the photo.\"\n      },\n      \"exposureTime\": {\n       \"type\": \"number\",\n       \"description\": \"The length of the exposure, in seconds.\",\n       \"format\": \"float\"\n      },\n      \"flashUsed\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether a flash was used to create the photo.\"\n      },\n      \"focalLength\": {\n       \"type\": \"number\",\n       \"description\": \"The focal length used to create the photo, in millimeters.\",\n       \"format\": \"float\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the image in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"isoSpeed\": {\n       \"type\": \"integer\",\n       \"description\": \"The ISO speed used to create the photo.\",\n       \"format\": \"int32\"\n      },\n      \"lens\": {\n       \"type\": \"string\",\n       \"description\": \"The lens used to create the photo.\"\n      },\n      \"location\": {\n       \"type\": \"object\",\n       \"description\": \"Geographic location information stored in the image.\",\n       \"properties\": {\n        \"altitude\": {\n         \"type\": \"number\",\n         \"description\": \"The altitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"latitude\": {\n         \"type\": \"number\",\n         \"description\": \"The latitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"longitude\": {\n         \"type\": \"number\",\n         \"description\": \"The longitude stored in the image.\",\n         \"format\": \"double\"\n        }\n       }\n      },\n      \"maxApertureValue\": {\n       \"type\": \"number\",\n       \"description\": \"The smallest f-number of the lens at the focal length used to create the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"meteringMode\": {\n       \"type\": \"string\",\n       \"description\": \"The metering mode used to create the photo.\"\n      },\n      \"rotation\": {\n       \"type\": \"integer\",\n       \"description\": \"The rotation in clockwise degrees from the image's original orientation.\",\n       \"format\": \"int32\"\n      },\n      \"sensor\": {\n       \"type\": \"string\",\n       \"description\": \"The type of sensor used to create the photo.\"\n      },\n      \"subjectDistance\": {\n       \"type\": \"integer\",\n       \"description\": \"The distance to the subject of the photo, in meters.\",\n       \"format\": \"int32\"\n      },\n      \"time\": {\n       \"type\": \"string\",\n       \"description\": \"The date and time the photo was taken (EXIF DateTime).\"\n      },\n      \"whiteBalance\": {\n       \"type\": \"string\",\n       \"description\": \"The white balance mode used to create the photo.\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the image in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"isAppAuthorized\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file was created or opened by the requesting app.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\",\n     \"default\": \"drive#file\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify the file.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"\n    },\n    \"modifiedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been modified by this user.\"\n    },\n    \"modifiedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\",\n     \"format\": \"date-time\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"\n    },\n    \"ownedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user owns the file. Not populated for Team Drive files.\"\n    },\n    \"owners\": {\n     \"type\": \"array\",\n     \"description\": \"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\",\n     \"items\": {\n      \"$ref\": \"User\"\n     }\n    },\n    \"parents\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissionIds\": {\n     \"type\": \"array\",\n     \"description\": \"List of permission IDs for users with access to this file.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    },\n    \"properties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"quotaBytesUsed\": {\n     \"type\": \"string\",\n     \"description\": \"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\",\n     \"format\": \"int64\"\n    },\n    \"shared\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been shared. Not populated for Team Drive files.\"\n    },\n    \"sharedWithMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"sharingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who shared the file with the requesting user, if applicable.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    },\n    \"spaces\": {\n     \"type\": \"array\",\n     \"description\": \"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"starred\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has starred the file.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"ID of the Team Drive the file resides in.\"\n    },\n    \"thumbnailLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"\n    },\n    \"thumbnailVersion\": {\n     \"type\": \"string\",\n     \"description\": \"The thumbnail version for use in thumbnail cache invalidation.\",\n     \"format\": \"int64\"\n    },\n    \"trashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"\n    },\n    \"trashedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\",\n     \"format\": \"date-time\"\n    },\n    \"trashingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"\n    },\n    \"version\": {\n     \"type\": \"string\",\n     \"description\": \"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\",\n     \"format\": \"int64\"\n    },\n    \"videoMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about video media. This may not be available immediately upon upload.\",\n     \"properties\": {\n      \"durationMillis\": {\n       \"type\": \"string\",\n       \"description\": \"The duration of the video in milliseconds.\",\n       \"format\": \"int64\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the video in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the video in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"viewedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been viewed by this user.\"\n    },\n    \"viewedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was viewed by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"viewersCanCopyContent\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"\n    },\n    \"webContentLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"\n    },\n    \"webViewLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for opening the file in a relevant Google editor or viewer in a browser.\"\n    },\n    \"writersCanShare\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"\n    }\n   }\n  },\n  \"FileList\": {\n   \"id\": \"FileList\",\n   \"type\": \"object\",\n   \"description\": \"A list of files.\",\n   \"properties\": {\n    \"files\": {\n     \"type\": \"array\",\n     \"description\": \"The list of files. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"File\"\n     }\n    },\n    \"incompleteSearch\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the search process was incomplete. If true, then some search results may be missing, since all documents were not searched. This may occur when searching multiple Team Drives with the \\\"user,allTeamDrives\\\" corpora, but all corpora could not be searched. When this happens, it is suggested that clients narrow their query by choosing a different corpus such as \\\"user\\\" or \\\"teamDrive\\\".\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#fileList\\\".\",\n     \"default\": \"drive#fileList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of files. This will be absent if the end of the files list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"GeneratedIds\": {\n   \"id\": \"GeneratedIds\",\n   \"type\": \"object\",\n   \"description\": \"A list of generated file IDs which can be provided in create requests.\",\n   \"properties\": {\n    \"ids\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs generated for the requesting user in the specified space.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#generatedIds\\\".\",\n     \"default\": \"drive#generatedIds\"\n    },\n    \"space\": {\n     \"type\": \"string\",\n     \"description\": \"The type of file that can be created with these IDs.\"\n    }\n   }\n  },\n  \"Permission\": {\n   \"id\": \"Permission\",\n   \"type\": \"object\",\n   \"description\": \"A permission for a file. A permission grants a user, group, domain or the world access to a file or a folder hierarchy.\",\n   \"properties\": {\n    \"allowFileDiscovery\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"\n    },\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A displayable name for users, groups or domains.\"\n    },\n    \"domain\": {\n     \"type\": \"string\",\n     \"description\": \"The domain to which this permission refers.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user or group to which this permission refers.\"\n    },\n    \"expirationTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\",\n     \"default\": \"drive#permission\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    },\n    \"role\": {\n     \"type\": \"string\",\n     \"description\": \"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- organizer \\n- owner \\n- writer \\n- commenter \\n- reader\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    },\n    \"teamDrivePermissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Whether this permission is inherited. This field is always populated. This is an output-only field.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the item from which this permission is inherited. This is an output-only field and is only populated for members of the Team Drive.\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"The primary role for this user. While new values may be added in the future, the following are currently possible:  \\n- organizer \\n- writer \\n- commenter \\n- reader\"\n       },\n       \"teamDrivePermissionType\": {\n        \"type\": \"string\",\n        \"description\": \"The Team Drive permission type for this user. While new values may be added in future, the following are currently possible:  \\n- file \\n- member\"\n       }\n      }\n     }\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    }\n   }\n  },\n  \"PermissionList\": {\n   \"id\": \"PermissionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of permissions for a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permissionList\\\".\",\n     \"default\": \"drive#permissionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of permissions. This field will be absent if the end of the permissions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of permissions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    }\n   }\n  },\n  \"Reply\": {\n   \"id\": \"Reply\",\n   \"type\": \"object\",\n   \"description\": \"A reply to a comment on a file.\",\n   \"properties\": {\n    \"action\": {\n     \"type\": \"string\",\n     \"description\": \"The action the reply performed to the parent comment. Valid values are:  \\n- resolve \\n- reopen\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who created the reply.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the reply. This field is used for setting the content, while htmlContent should be displayed. This is required on creates if no action is specified.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.replies.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the reply was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the reply has been deleted. A deleted reply has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the reply with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the reply.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#reply\\\".\",\n     \"default\": \"drive#reply\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the reply was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    }\n   }\n  },\n  \"ReplyList\": {\n   \"id\": \"ReplyList\",\n   \"type\": \"object\",\n   \"description\": \"A list of replies to a comment on a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#replyList\\\".\",\n     \"default\": \"drive#replyList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of replies. This will be absent if the end of the replies list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The list of replies. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    }\n   }\n  },\n  \"Revision\": {\n   \"id\": \"Revision\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a revision to a file.\",\n   \"properties\": {\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the revision.\"\n    },\n    \"keepForever\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\",\n     \"default\": \"drive#revision\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify this revision.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the revision.\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the revision was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"\n    },\n    \"publishAuto\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.\"\n    },\n    \"published\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published. This is only applicable to Google Docs.\"\n    },\n    \"publishedOutsideDomain\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published outside the domain. This is only applicable to Google Docs.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    }\n   }\n  },\n  \"RevisionList\": {\n   \"id\": \"RevisionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of revisions of a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revisionList\\\".\",\n     \"default\": \"drive#revisionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of revisions. This will be absent if the end of the revisions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"revisions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of revisions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Revision\"\n     }\n    }\n   }\n  },\n  \"StartPageToken\": {\n   \"id\": \"StartPageToken\",\n   \"type\": \"object\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#startPageToken\\\".\",\n     \"default\": \"drive#startPageToken\"\n    },\n    \"startPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for listing changes.\"\n    }\n   }\n  },\n  \"TeamDrive\": {\n   \"id\": \"TeamDrive\",\n   \"type\": \"object\",\n   \"description\": \"Representation of a Team Drive.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this Team Drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this Team Drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this Team Drive.\"\n      },\n      \"canChangeTeamDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this Team Drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this Team Drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this Team Drive.\"\n      },\n      \"canDeleteTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this Team Drive. Attempting to delete the Team Drive may still fail if there are untrashed items inside the Team Drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this Team Drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this Team Drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this Team Drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this Team Drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this Team Drive.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove children from folders in this Team Drive.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this Team Drive.\"\n      },\n      \"canRenameTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this Team Drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this Team Drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the Team Drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this Team Drive which is also the ID of the top level folder for this Team Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\",\n     \"default\": \"drive#teamDrive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this Team Drive.\"\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"TeamDriveList\": {\n   \"id\": \"TeamDriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of Team Drives.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDriveList\\\".\",\n     \"default\": \"drive#teamDriveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of Team Drives. This will be absent if the end of the Team Drives list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"teamDrives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of Team Drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"TeamDrive\"\n     }\n    }\n   }\n  },\n  \"User\": {\n   \"id\": \"User\",\n   \"type\": \"object\",\n   \"description\": \"Information about a Drive user.\",\n   \"properties\": {\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A plain text displayable name for this user.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#user\\\".\",\n     \"default\": \"drive#user\"\n    },\n    \"me\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this user is the requesting user.\"\n    },\n    \"permissionId\": {\n     \"type\": \"string\",\n     \"description\": \"The user's ID as visible in Permission resources.\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    }\n   }\n  }\n },\n \"resources\": {\n  \"about\": {\n   \"methods\": {\n    \"get\": {\n     \"id\": \"drive.about.get\",\n     \"path\": \"about\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets information about the user, the user's Drive, and system capabilities.\",\n     \"response\": {\n      \"$ref\": \"About\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"changes\": {\n   \"methods\": {\n    \"getStartPageToken\": {\n     \"id\": \"drive.changes.getStartPageToken\",\n     \"path\": \"changes/startPageToken\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets the starting pageToken for listing future changes.\",\n     \"parameters\": {\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive for which the starting pageToken for listing future changes from that Team Drive will be returned.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"StartPageToken\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.changes.list\",\n     \"path\": \"changes\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the changes for a user or Team Drive.\",\n     \"parameters\": {\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether Team Drive files or changes should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The Team Drive from which changes will be returned. If specified the change IDs will be reflective of the Team Drive; use the combined Team Drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"response\": {\n      \"$ref\": \"ChangeList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    },\n    \"watch\": {\n     \"id\": \"drive.changes.watch\",\n     \"path\": \"changes/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes for a user.\",\n     \"parameters\": {\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether Team Drive files or changes should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The Team Drive from which changes will be returned. If specified the change IDs will be reflective of the Team Drive; use the combined Team Drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"channels\": {\n   \"methods\": {\n    \"stop\": {\n     \"id\": \"drive.channels.stop\",\n     \"path\": \"channels/stop\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Stop watching resources through this channel\",\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"comments\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.comments.create\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new comment on a file.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.comments.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.comments.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a comment by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.comments.list\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's comments.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of comments to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"startModifiedTime\": {\n       \"type\": \"string\",\n       \"description\": \"The minimum value of 'modifiedTime' for the result comments (RFC 3339 date-time).\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"CommentList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.comments.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a comment with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"files\": {\n   \"methods\": {\n    \"copy\": {\n     \"id\": \"drive.files.copy\",\n     \"path\": \"files/{fileId}/copy\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a copy of a file and applies any requested updates with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\"\n     ]\n    },\n    \"create\": {\n     \"id\": \"drive.files.create\",\n     \"path\": \"files\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new file.\",\n     \"parameters\": {\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files\"\n       }\n      }\n     },\n     \"supportsSubscription\": true\n    },\n    \"delete\": {\n     \"id\": \"drive.files.delete\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a Team Drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"emptyTrash\": {\n     \"id\": \"drive.files.emptyTrash\",\n     \"path\": \"files/trash\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes all of the user's trashed files.\",\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"export\": {\n     \"id\": \"drive.files.export\",\n     \"path\": \"files/{fileId}/export\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the format requested for this export.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"mimeType\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true\n    },\n    \"generateIds\": {\n     \"id\": \"drive.files.generateIds\",\n     \"path\": \"files/generateIds\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Generates a set of file IDs which can be provided in create requests.\",\n     \"parameters\": {\n      \"count\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of IDs to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"space\": {\n       \"type\": \"string\",\n       \"description\": \"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"GeneratedIds\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.files.get\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a file's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    },\n    \"list\": {\n     \"id\": \"drive.files.list\",\n     \"path\": \"files\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists or searches files.\",\n     \"parameters\": {\n      \"corpora\": {\n       \"type\": \"string\",\n       \"description\": \"Comma-separated list of bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'teamDrive' and 'allTeamDrives'. 'allTeamDrives' must be combined with 'user'; all other values must be used in isolation. Prefer 'user' or 'teamDrive' to 'allTeamDrives' for efficiency.\",\n       \"location\": \"query\"\n      },\n      \"corpus\": {\n       \"type\": \"string\",\n       \"description\": \"The source of files to list. Deprecated: use 'corpora' instead.\",\n       \"enum\": [\n        \"domain\",\n        \"user\"\n       ],\n       \"enumDescriptions\": [\n        \"Files shared to the user's domain.\",\n        \"Files owned by or shared to the user.\"\n       ],\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether Team Drive items should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"orderBy\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"ID of Team Drive to search.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"FileList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.files.update\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a file's metadata and/or content with patch semantics.\",\n     \"parameters\": {\n      \"addParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to add.\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"removeParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to remove.\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.scripts\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files/{fileId}\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files/{fileId}\"\n       }\n      }\n     }\n    },\n    \"watch\": {\n     \"id\": \"drive.files.watch\",\n     \"path\": \"files/{fileId}/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes to a file\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"permissions\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.permissions.create\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a permission for a file or Team Drive.\",\n     \"parameters\": {\n      \"emailMessage\": {\n       \"type\": \"string\",\n       \"description\": \"A custom message to include in the notification email.\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"sendNotificationEmail\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.permissions.delete\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a permission.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.permissions.get\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a permission by ID.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.permissions.list\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's or Team Drive's permissions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of permissions to return per page. When not set for files in a Team Drive, at most 100 results will be returned. When not set for files that are not in a Team Drive, the entire list will be returned.\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"PermissionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.permissions.update\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a permission with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"removeExpiration\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to remove the expiration date.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"replies\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.replies.create\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new reply to a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.replies.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a reply.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.replies.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a reply by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.replies.list\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a comment's replies.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of replies to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"ReplyList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.replies.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a reply with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"revisions\": {\n   \"methods\": {\n    \"delete\": {\n     \"id\": \"drive.revisions.delete\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a revision. This method is only applicable to files with binary content in Drive.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.revisions.get\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a revision's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true\n    },\n    \"list\": {\n     \"id\": \"drive.revisions.list\",\n     \"path\": \"files/{fileId}/revisions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's revisions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of revisions to return per page.\",\n       \"default\": \"200\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"RevisionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.revisions.update\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a revision with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Revision\"\n     },\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"teamdrives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.teamdrives.create\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new Team Drive.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.teamdrives.delete\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a Team Drive for which the user is an organizer. The Team Drive cannot contain any untrashed items.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.teamdrives.get\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a Team Drive's metadata by ID.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.teamdrives.list\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the user's Team Drives.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of Team Drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then all Team Drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"TeamDriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.teamdrives.update\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a Team Drive's metadata\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  }\n }\n}\n\n"
  },
  {
    "path": "data-raw/old/20171110_drive-v3_endpoints-list.json",
    "content": "{\n  \"drive.about.get\": {\n    \"id\": [\"drive.about.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/about\"],\n    \"parameters\": {\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets information about the user, the user's Drive, and system capabilities.\"],\n    \"response\": [\"About\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.copy\": {\n    \"id\": [\"drive.files.copy\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files/{fileId}/copy\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"ignoreDefaultVisibility\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissionIds\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"List of permission IDs for users with access to this file.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.photos.readonly\"],\n    \"description\": [\"Creates a copy of a file and applies any requested updates with patch semantics.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.create\": {\n    \"id\": [\"drive.files.create\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files\"],\n    \"parameters\": {\n      \"ignoreDefaultVisibility\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissionIds\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"List of permission IDs for users with access to this file.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Creates a new file.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [null],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files\"]\n        }\n      }\n    },\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.create.media\": {\n    \"id\": [\"drive.files.create.media\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"/upload/drive/v3/files\"],\n    \"parameters\": {\n      \"ignoreDefaultVisibility\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissionIds\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"List of permission IDs for users with access to this file.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      },\n      \"uploadType\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [null]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Creates a new file.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [null],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files\"]\n        }\n      }\n    },\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.delete\": {\n    \"id\": [\"drive.files.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a Team Drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.emptyTrash\": {\n    \"id\": [\"drive.files.emptyTrash\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/trash\"],\n    \"parameters\": {\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive\"],\n    \"description\": [\"Permanently deletes all of the user's trashed files.\"],\n    \"response\": [null],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.export\": {\n    \"id\": [\"drive.files.export\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/export\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the format requested for this export.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file, drive.readonly\"],\n    \"description\": [\"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId, mimeType\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.generateIds\": {\n    \"id\": [\"drive.files.generateIds\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/generateIds\"],\n    \"parameters\": {\n      \"count\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The number of IDs to return.\"]\n      },\n      \"space\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Generates a set of file IDs which can be provided in create requests.\"],\n    \"response\": [\"GeneratedIds\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.get\": {\n    \"id\": [\"drive.files.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"acknowledgeAbuse\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets a file's metadata or content by ID.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": [true]\n  },\n  \"drive.files.list\": {\n    \"id\": [\"drive.files.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files\"],\n    \"parameters\": {\n      \"corpora\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Comma-separated list of bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'teamDrive' and 'allTeamDrives'. 'allTeamDrives' must be combined with 'user'; all other values must be used in isolation. Prefer 'user' or 'teamDrive' to 'allTeamDrives' for efficiency.\"]\n      },\n      \"corpus\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"domain\"],\n        \"description\": [\"The source of files to list. Deprecated: use 'corpora' instead.\"]\n      },\n      \"includeTeamDriveItems\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether Team Drive items should be included in results.\"]\n      },\n      \"orderBy\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\"]\n      },\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\"]\n      },\n      \"q\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of Team Drive to search.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Lists or searches files.\"],\n    \"response\": [\"FileList\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.update\": {\n    \"id\": [\"drive.files.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"addParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to add.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"removeParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to remove.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissionIds\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"List of permission IDs for users with access to this file.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.scripts\"],\n    \"description\": [\"Updates a file's metadata and/or content with patch semantics.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files/{fileId}\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files/{fileId}\"]\n        }\n      }\n    },\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.update.media\": {\n    \"id\": [\"drive.files.update.media\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"/upload/drive/v3/files/{fileId}\"],\n    \"parameters\": {\n      \"addParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to add.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"keepRevisionForever\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"ocrLanguage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A language hint for OCR processing during image import (ISO 639-1 code).\"]\n      },\n      \"removeParents\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A comma-separated list of parent IDs to remove.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useContentAsIndexableText\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to use the uploaded content as indexable text.\"]\n      },\n      \"appProperties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\"]\n      },\n      \"contentHints\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional information about the content of the file. These fields are never populated in responses.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was created (RFC 3339 date-time).\"]\n      },\n      \"description\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short description of the file.\"]\n      },\n      \"explicitlyTrashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"]\n      },\n      \"fileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"]\n      },\n      \"folderColorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"]\n      },\n      \"fullFileExtension\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"]\n      },\n      \"hasAugmentedPermissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"]\n      },\n      \"hasThumbnail\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"]\n      },\n      \"headRevisionId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"]\n      },\n      \"iconLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A static, unauthenticated link to the file's icon.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"imageMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about image media, if available.\"]\n      },\n      \"isAppAuthorized\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file was created or opened by the requesting app.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify the file.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"]\n      },\n      \"modifiedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been modified by this user.\"]\n      },\n      \"modifiedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by the user (RFC 3339 date-time).\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"]\n      },\n      \"ownedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user owns the file. Not populated for Team Drive files.\"]\n      },\n      \"owners\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\"]\n      },\n      \"parents\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the My Drive folder. Update requests must use the addParents and removeParents parameters to modify the values.\"]\n      },\n      \"permissionIds\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"List of permission IDs for users with access to this file.\"]\n      },\n      \"permissions\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\"]\n      },\n      \"properties\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\"]\n      },\n      \"quotaBytesUsed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\"]\n      },\n      \"shared\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been shared. Not populated for Team Drive files.\"]\n      },\n      \"sharedWithMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"]\n      },\n      \"sharingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The user who shared the file with the requesting user, if applicable.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"spaces\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\"]\n      },\n      \"starred\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user has starred the file.\"]\n      },\n      \"teamDriveId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"ID of the Team Drive the file resides in.\"]\n      },\n      \"thumbnailLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"]\n      },\n      \"thumbnailVersion\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The thumbnail version for use in thumbnail cache invalidation.\"]\n      },\n      \"trashed\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"]\n      },\n      \"trashedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\"]\n      },\n      \"trashingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"]\n      },\n      \"version\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"]\n      },\n      \"videoMediaMetadata\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Additional metadata about video media. This may not be available immediately upon upload.\"]\n      },\n      \"viewedByMe\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the file has been viewed by this user.\"]\n      },\n      \"viewedByMeTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the file was viewed by the user (RFC 3339 date-time).\"]\n      },\n      \"viewersCanCopyContent\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only reader or commenter permission can copy the file's content. This affects copy, download, and print operations.\"]\n      },\n      \"webContentLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"]\n      },\n      \"webViewLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link for opening the file in a relevant Google editor or viewer in a browser.\"]\n      },\n      \"writersCanShare\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      },\n      \"uploadType\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [null]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.scripts\"],\n    \"description\": [\"Updates a file's metadata and/or content with patch semantics.\"],\n    \"response\": [\"File\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"File\"],\n    \"supportsMediaUpload\": [true],\n    \"mediaUpload\": {\n      \"accept\": [\"*/*\"],\n      \"maxSize\": [\"5120GB\"],\n      \"protocols\": {\n        \"simple\": {\n          \"multipart\": [true],\n          \"path\": [\"/upload/drive/v3/files/{fileId}\"]\n        },\n        \"resumable\": {\n          \"multipart\": [true],\n          \"path\": [\"/resumable/upload/drive/v3/files/{fileId}\"]\n        }\n      }\n    },\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.files.watch\": {\n    \"id\": [\"drive.files.watch\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files/{fileId}/watch\"],\n    \"parameters\": {\n      \"acknowledgeAbuse\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Subscribes to changes to a file\"],\n    \"response\": [\"Channel\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"Channel\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": [true],\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": [true]\n  },\n  \"drive.permissions.create\": {\n    \"id\": [\"drive.permissions.create\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions\"],\n    \"parameters\": {\n      \"emailMessage\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A custom message to include in the notification email.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"sendNotificationEmail\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"transferOwnership\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\"]\n      },\n      \"useDomainAdminAccess\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\"]\n      },\n      \"allowFileDiscovery\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"]\n      },\n      \"deleted\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"]\n      },\n      \"displayName\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A displayable name for users, groups or domains.\"]\n      },\n      \"domain\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The domain to which this permission refers.\"]\n      },\n      \"emailAddress\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The email address of the user or group to which this permission refers.\"]\n      },\n      \"expirationTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\"]\n      },\n      \"photoLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link to the user's profile photo, if available.\"]\n      },\n      \"role\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- organizer \\n- owner \\n- writer \\n- commenter \\n- reader\"]\n      },\n      \"teamDrivePermissionDetails\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\"]\n      },\n      \"type\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file\"],\n    \"description\": [\"Creates a permission for a file or Team Drive.\"],\n    \"response\": [\"Permission\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [\"Permission\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.delete\": {\n    \"id\": [\"drive.permissions.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions/{permissionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"permissionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the permission.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useDomainAdminAccess\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file\"],\n    \"description\": [\"Deletes a permission.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId, permissionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.get\": {\n    \"id\": [\"drive.permissions.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions/{permissionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"permissionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the permission.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useDomainAdminAccess\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets a permission by ID.\"],\n    \"response\": [\"Permission\"],\n    \"parameterOrder\": [\"fileId, permissionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.list\": {\n    \"id\": [\"drive.permissions.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The maximum number of permissions to return per page. When not set for files in a Team Drive, at most 100 results will be returned. When not set for files that are not in a Team Drive, the entire list will be returned.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"useDomainAdminAccess\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Lists a file's or Team Drive's permissions.\"],\n    \"response\": [\"PermissionList\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.permissions.update\": {\n    \"id\": [\"drive.permissions.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/files/{fileId}/permissions/{permissionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file or Team Drive.\"]\n      },\n      \"permissionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the permission.\"]\n      },\n      \"removeExpiration\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to remove the expiration date.\"]\n      },\n      \"supportsTeamDrives\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the requesting application supports Team Drives.\"]\n      },\n      \"transferOwnership\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\"]\n      },\n      \"useDomainAdminAccess\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\"]\n      },\n      \"allowFileDiscovery\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"]\n      },\n      \"deleted\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"]\n      },\n      \"displayName\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A displayable name for users, groups or domains.\"]\n      },\n      \"domain\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The domain to which this permission refers.\"]\n      },\n      \"emailAddress\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The email address of the user or group to which this permission refers.\"]\n      },\n      \"expirationTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\"]\n      },\n      \"photoLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A link to the user's profile photo, if available.\"]\n      },\n      \"role\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- organizer \\n- owner \\n- writer \\n- commenter \\n- reader\"]\n      },\n      \"teamDrivePermissionDetails\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"array\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\"]\n      },\n      \"type\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.file\"],\n    \"description\": [\"Updates a permission with patch semantics.\"],\n    \"response\": [\"Permission\"],\n    \"parameterOrder\": [\"fileId, permissionId\"],\n    \"request\": [\"Permission\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.revisions.delete\": {\n    \"id\": [\"drive.revisions.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions/{revisionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"revisionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Permanently deletes a revision. This method is only applicable to files with binary content in Drive.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"fileId, revisionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.revisions.get\": {\n    \"id\": [\"drive.revisions.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions/{revisionId}\"],\n    \"parameters\": {\n      \"acknowledgeAbuse\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\"]\n      },\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"revisionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Gets a revision's metadata or content by ID.\"],\n    \"response\": [\"Revision\"],\n    \"parameterOrder\": [\"fileId, revisionId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": [true],\n    \"useMediaDownloadService\": [true]\n  },\n  \"drive.revisions.list\": {\n    \"id\": [\"drive.revisions.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"The maximum number of revisions to return per page.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file, drive.metadata, drive.metadata.readonly, drive.photos.readonly, drive.readonly\"],\n    \"description\": [\"Lists a file's revisions.\"],\n    \"response\": [\"RevisionList\"],\n    \"parameterOrder\": [\"fileId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.revisions.update\": {\n    \"id\": [\"drive.revisions.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/files/{fileId}/revisions/{revisionId}\"],\n    \"parameters\": {\n      \"fileId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the file.\"]\n      },\n      \"revisionId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the revision.\"]\n      },\n      \"keepForever\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\"]\n      },\n      \"lastModifyingUser\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [null],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The last user to modify this revision.\"]\n      },\n      \"md5Checksum\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"mimeType\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The MIME type of the revision.\"]\n      },\n      \"modifiedTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The last time the revision was modified (RFC 3339 date-time).\"]\n      },\n      \"originalFilename\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"publishAuto\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.\"]\n      },\n      \"published\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this revision is published. This is only applicable to Google Docs.\"]\n      },\n      \"publishedOutsideDomain\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether this revision is published outside the domain. This is only applicable to Google Docs.\"]\n      },\n      \"size\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"int64\"],\n        \"enum\": [null],\n        \"description\": [\"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.appdata, drive.file\"],\n    \"description\": [\"Updates a revision with patch semantics.\"],\n    \"response\": [\"Revision\"],\n    \"parameterOrder\": [\"fileId, revisionId\"],\n    \"request\": [\"Revision\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.create\": {\n    \"id\": [\"drive.teamdrives.create\"],\n    \"httpMethod\": [\"POST\"],\n    \"path\": [\"drive/v3/teamdrives\"],\n    \"parameters\": {\n      \"requestId\": {\n        \"location\": [\"query\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\"]\n      },\n      \"backgroundImageFile\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\"]\n      },\n      \"backgroundImageLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to this Team Drive's background image.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this Team Drive.\"]\n      },\n      \"colorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the Team Drive was created (RFC 3339 date-time).\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this Team Drive which is also the ID of the top level folder for this Team Drive.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of this Team Drive.\"]\n      },\n      \"themeId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive\"],\n    \"description\": [\"Creates a new Team Drive.\"],\n    \"response\": [\"TeamDrive\"],\n    \"parameterOrder\": [\"requestId\"],\n    \"request\": [\"TeamDrive\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.delete\": {\n    \"id\": [\"drive.teamdrives.delete\"],\n    \"httpMethod\": [\"DELETE\"],\n    \"path\": [\"drive/v3/teamdrives/{teamDriveId}\"],\n    \"parameters\": {\n      \"teamDriveId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the Team Drive\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive\"],\n    \"description\": [\"Permanently deletes a Team Drive for which the user is an organizer. The Team Drive cannot contain any untrashed items.\"],\n    \"response\": [null],\n    \"parameterOrder\": [\"teamDriveId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.get\": {\n    \"id\": [\"drive.teamdrives.get\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/teamdrives/{teamDriveId}\"],\n    \"parameters\": {\n      \"teamDriveId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the Team Drive\"]\n      },\n      \"useDomainAdminAccess\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.readonly\"],\n    \"description\": [\"Gets a Team Drive's metadata by ID.\"],\n    \"response\": [\"TeamDrive\"],\n    \"parameterOrder\": [\"teamDriveId\"],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.list\": {\n    \"id\": [\"drive.teamdrives.list\"],\n    \"httpMethod\": [\"GET\"],\n    \"path\": [\"drive/v3/teamdrives\"],\n    \"parameters\": {\n      \"pageSize\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"integer\"],\n        \"repeated\": [null],\n        \"format\": [\"int32\"],\n        \"enum\": [null],\n        \"description\": [\"Maximum number of Team Drives to return.\"]\n      },\n      \"pageToken\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Page token for Team Drives.\"]\n      },\n      \"q\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Query string for searching Team Drives.\"]\n      },\n      \"useDomainAdminAccess\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Whether the request should be treated as if it was issued by a domain administrator; if set to true, then all Team Drives of the domain in which the requester is an administrator are returned.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive, drive.readonly\"],\n    \"description\": [\"Lists the user's Team Drives.\"],\n    \"response\": [\"TeamDriveList\"],\n    \"parameterOrder\": [null],\n    \"request\": [null],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  },\n  \"drive.teamdrives.update\": {\n    \"id\": [\"drive.teamdrives.update\"],\n    \"httpMethod\": [\"PATCH\"],\n    \"path\": [\"drive/v3/teamdrives/{teamDriveId}\"],\n    \"parameters\": {\n      \"teamDriveId\": {\n        \"location\": [\"path\"],\n        \"required\": [true],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the Team Drive\"]\n      },\n      \"backgroundImageFile\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\"]\n      },\n      \"backgroundImageLink\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"A short-lived link to this Team Drive's background image.\"]\n      },\n      \"capabilities\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"object\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Capabilities the current user has on this Team Drive.\"]\n      },\n      \"colorRgb\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"]\n      },\n      \"createdTime\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [\"date-time\"],\n        \"enum\": [null],\n        \"description\": [\"The time at which the Team Drive was created (RFC 3339 date-time).\"]\n      },\n      \"id\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of this Team Drive which is also the ID of the top level folder for this Team Drive.\"]\n      },\n      \"kind\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\"]\n      },\n      \"name\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The name of this Team Drive.\"]\n      },\n      \"themeId\": {\n        \"location\": [\"body\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"]\n      },\n      \"alt\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [\"json\"],\n        \"description\": [\"Data format for the response.\"]\n      },\n      \"fields\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Selector specifying which fields to include in a partial response.\"]\n      },\n      \"key\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\"]\n      },\n      \"oauth_token\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"OAuth 2.0 token for the current user.\"]\n      },\n      \"prettyPrint\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"boolean\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Returns response with indentations and line breaks.\"]\n      },\n      \"quotaUser\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.\"]\n      },\n      \"userIp\": {\n        \"location\": [\"query\"],\n        \"required\": [null],\n        \"type\": [\"string\"],\n        \"repeated\": [null],\n        \"format\": [null],\n        \"enum\": [null],\n        \"description\": [\"IP address of the site where the request originates. Use this if you want to enforce per-user limits.\"]\n      }\n    },\n    \"scopes\": [\"drive\"],\n    \"description\": [\"Updates a Team Drive's metadata\"],\n    \"response\": [\"TeamDrive\"],\n    \"parameterOrder\": [\"teamDriveId\"],\n    \"request\": [\"TeamDrive\"],\n    \"supportsMediaUpload\": {},\n    \"mediaUpload\": {},\n    \"supportsSubscription\": {},\n    \"supportsMediaDownload\": {},\n    \"useMediaDownloadService\": {}\n  }\n}\n"
  },
  {
    "path": "data-raw/old/discovery-doc-prep.R",
    "content": "library(rprojroot)\nlibrary(jsonlite)\nlibrary(httr)\nlibrary(tidyverse)\ndevtools::load_all(find_package_root_file())\n\n## load the API spec, including download if necessary\ndd_cache <- find_package_root_file(\"data-raw\") |>\n  list.files(pattern = \"discovery-document.json$\", full.names = TRUE)\nif (length(dd_cache) == 0) {\n  dd_get <- GET(\"https://www.googleapis.com/discovery/v1/apis/drive/v3/rest\")\n  dd_content <- content(dd_get)\n  json_fname <- dd_content[c(\"revision\", \"id\")] |>\n    c(\"discovery-document\") |>\n    map(~ str_replace_all(.x, \":\", \"-\")) |>\n    str_c(collapse = \"_\") |>\n    str_c(\".json\") |>\n    find_package_root_file(\"data-raw\", .)\n  write_lines(\n    content(dd_get, as = \"text\"),\n    json_fname\n  )\n} else {\n  json_fname <- rev(dd_cache)[1]\n}\ndd_content <- fromJSON(json_fname)\n## View(dd_content)\n## listviewer::jsonedit(dd_content)\n\n## extract the method collections and bring to same level of hierarchy\nendpoints <- c(\"about\", \"files\", \"permissions\", \"revisions\", \"teamdrives\") |>\n  set_names() |>\n  map(~ dd_content[[c(\"resources\", .x, \"methods\")]]) |>\n  imap(function(.x, nm) set_names(.x, ~ paste(nm, ., sep = \".\"))) |>\n  flatten()\n# str(endpoints, max.level = 1)\n# listviewer::jsonedit(endpoints)\n\nadd_schema_params <- function(endpoint, nm) {\n  req <- endpoint$request$`$ref`\n  if (is.null(req) || req == \"Channel\") {\n    return(endpoint)\n  }\n  message_glue(\"{nm} gains {req} schema params\\n\")\n  endpoint$parameters <- c(\n    endpoint$parameters,\n    dd_content[[c(\"schemas\", req, \"properties\")]]\n  )\n  endpoint\n}\nendpoints <- imap(endpoints, add_schema_params)\n\n## add API-wide params to all endpoints\nadd_global_params <- function(x) {\n  x[[\"parameters\"]] <- c(x[[\"parameters\"]], dd_content[[\"parameters\"]])\n  x\n}\nendpoints <- map(endpoints, add_global_params)\n\n\n## duplicate files.update endpoint so we can hold URI for media update\nendpoints[[\"files.update.media\"]] <- endpoints[[\"files.update\"]]\nendpoints[[c(\"files.update.media\", \"id\")]] <- \"drive.files.update.media\"\nendpoints[[c(\"files.update.media\", \"path\")]] <-\n  endpoints[[c(\"files.update\", \"mediaUpload\", \"protocols\", \"simple\", \"path\")]]\nendpoints[[c(\"files.update.media\", \"parameters\")]] <- c(\n  endpoints[[c(\"files.update.media\", \"parameters\")]],\n  uploadType = list(list(type = \"string\", required = TRUE, location = \"query\"))\n)\n\n## duplicate files.create endpoint so we can hold URI for media upload\nendpoints[[\"files.create.media\"]] <- endpoints[[\"files.create\"]]\nendpoints[[c(\"files.create.media\", \"id\")]] <- \"drive.files.create.media\"\nendpoints[[c(\"files.create.media\", \"path\")]] <-\n  endpoints[[c(\"files.create\", \"mediaUpload\", \"protocols\", \"simple\", \"path\")]]\nendpoints[[c(\"files.create.media\", \"parameters\")]] <- c(\n  endpoints[[c(\"files.create.media\", \"parameters\")]],\n  uploadType = list(list(type = \"string\", required = TRUE, location = \"query\"))\n)\n\nnms <- endpoints |>\n  map(names) |>\n  reduce(union)\n\n## tibble with one row per endpoint\nedf <- endpoints |>\n  transpose(.names = nms) |>\n  simplify_all(.type = character(1)) |>\n  as_tibble() |>\n  arrange(id)\n## View(edf)\n\n## clean up individual variables\n\n## enforce my own order\nedf <- edf |>\n  select(id, httpMethod, path, parameters, scopes, description, everything())\n\nedf$path <- edf$path |>\n  modify_if(~ !grepl(\"drive/v3\", .x), ~ paste0(\"drive/v3/\", .x))\n\nedf$scopes <- edf$scopes |>\n  map(~ gsub(\"https://www.googleapis.com/auth/\", \"\", .)) |>\n  map_chr(str_c, collapse = \", \")\n\nedf$parameterOrder <- edf$parameterOrder |>\n  modify_if(~ length(.x) < 1, ~NA_character_) |>\n  map_chr(str_c, collapse = \", \")\n\nedf$response <- edf$response |>\n  map_chr(\"$ref\", .null = NA_character_)\nedf$request <- edf$request |>\n  map_chr(\"$ref\", .null = NA_character_)\n## View(edf)\n\n## loooong side journey to clean up parameters; give them\n##   * common sub-elements, even if sparsely unpopulated\n##   * common order\nparams <- edf |>\n  select(id, parameters) |>\n  {\n    ## unnest() won't work with a list ... doing it manually\n    tibble(\n      id = rep(.$id, lengths(.$parameters)),\n      parameters = purrr::flatten(.$parameters),\n      pname = names(parameters)\n    )\n  } |>\n  select(id, pname, parameters)\n# params$parameters |> map(names) |> reduce(union)\n\n## keeping repeated and enum so it can generalize to sheets in the future.\nnms <-\n  c(\"location\", \"required\", \"type\", \"repeated\", \"format\", \"enum\", \"description\")\n\n## tibble with one row per parameter\n## variables method and pname keep track of endpoint and parameter name\nparams <- params$parameters |>\n  transpose(.names = nms) |>\n  as_tibble() |>\n  add_column(pname = params$pname, .before = 1) |>\n  add_column(id = params$id, .before = 1)\nparams <- params |>\n  mutate(\n    location = location |> map(1, .null = \"body\") |> flatten_chr(),\n    required = required |> map(1, .null = NA) |> flatten_lgl(),\n    type = type |> map(1, .null = NA) |> flatten_chr(),\n    repeated = repeated |> map(1, .null = NA) |> flatten_lgl(),\n    format = format |> map(1, .null = NA) |> flatten_chr(),\n    enum = enum |> map(1, .null = NA) |> flatten_chr(),\n    description = description |> map(1, .null = NA) |> flatten_chr()\n  )\n## repack all the info for each parameter into a list\nrepacked <- params |>\n  select(-id, -pname) |>\n  pmap(list)\nparams <- params |>\n  select(id, pname) |>\n  mutate(pdata = repacked)\n## repack all the parameters for each method into a named list\nparams <- params |>\n  group_by(id) |>\n  nest(.key = parameters) |>\n  mutate(parameters = map(parameters, deframe))\n\n## replace the parameters in the main endpoint tibble\nedf <- edf |>\n  select(-parameters) |>\n  left_join(params) |>\n  select(id, httpMethod, path, parameters, everything())\n## View(edf)\n\n## WE ARE DONE (THANK YOU JENNY!!)\n## saving in various forms\n\n## full spec as tibble, one row per endpoint\nout_fname <- str_replace(\n  json_fname,\n  \"discovery-document.json\",\n  \"endpoints-tibble.rds\"\n)\nsaveRDS(edf, file = out_fname)\n\n## full spec as list\n## transpose again, back to a list with one component per endpoint\nelist <- edf |>\n  pmap(list) |>\n  set_names(edf$id)\n## View(elist)\n\nout_fname <- str_replace(\n  json_fname,\n  \"discovery-document.json\",\n  \"endpoints-list.rds\"\n)\nsaveRDS(elist, file = out_fname)\n\nout_fname <- str_replace(\n  json_fname,\n  \"discovery-document.json\",\n  \"endpoints-list.json\"\n)\nelist |>\n  toJSON(pretty = TRUE) |>\n  writeLines(out_fname)\n\n## partial spec as list, i.e. keep only the variables I currently use to\n## create the API\n## convert to my naming scheme, which is more consistent with general use\n.endpoints <- edf |>\n  select(id, method = httpMethod, path, parameters) |>\n  pmap(list) |>\n  set_names(edf$id)\nattr(.endpoints, \"base_url\") <- dd_content$baseUrl\n## View(.endpoints)\n\ndevtools::use_data(.endpoints, internal = TRUE, overwrite = TRUE)\n"
  },
  {
    "path": "data-raw/old/drive-v3_2019-02-14.json",
    "content": "{\n \"kind\": \"discovery#restDescription\",\n \"etag\": \"\\\"J3WqvAcMk4eQjJXvfSI4Yr8VouA/f-jeGQ4IdJCazKkL_1D6ZQ3gAjs\\\"\",\n \"discoveryVersion\": \"v1\",\n \"id\": \"drive:v3\",\n \"name\": \"drive\",\n \"version\": \"v3\",\n \"revision\": \"20190214\",\n \"title\": \"Drive API\",\n \"description\": \"Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.\",\n \"ownerDomain\": \"google.com\",\n \"ownerName\": \"Google\",\n \"icons\": {\n  \"x16\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png\",\n  \"x32\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png\"\n },\n \"documentationLink\": \"https://developers.google.com/drive/\",\n \"protocol\": \"rest\",\n \"baseUrl\": \"https://www.googleapis.com/drive/v3/\",\n \"basePath\": \"/drive/v3/\",\n \"rootUrl\": \"https://www.googleapis.com/\",\n \"servicePath\": \"drive/v3/\",\n \"batchPath\": \"batch/drive/v3\",\n \"parameters\": {\n  \"alt\": {\n   \"type\": \"string\",\n   \"description\": \"Data format for the response.\",\n   \"default\": \"json\",\n   \"enum\": [\n    \"json\"\n   ],\n   \"enumDescriptions\": [\n    \"Responses with Content-Type of application/json\"\n   ],\n   \"location\": \"query\"\n  },\n  \"fields\": {\n   \"type\": \"string\",\n   \"description\": \"Selector specifying which fields to include in a partial response.\",\n   \"location\": \"query\"\n  },\n  \"key\": {\n   \"type\": \"string\",\n   \"description\": \"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\",\n   \"location\": \"query\"\n  },\n  \"oauth_token\": {\n   \"type\": \"string\",\n   \"description\": \"OAuth 2.0 token for the current user.\",\n   \"location\": \"query\"\n  },\n  \"prettyPrint\": {\n   \"type\": \"boolean\",\n   \"description\": \"Returns response with indentations and line breaks.\",\n   \"default\": \"true\",\n   \"location\": \"query\"\n  },\n  \"quotaUser\": {\n   \"type\": \"string\",\n   \"description\": \"An opaque string that represents a user for quota purposes. Must not exceed 40 characters.\",\n   \"location\": \"query\"\n  },\n  \"userIp\": {\n   \"type\": \"string\",\n   \"description\": \"Deprecated. Please use quotaUser instead.\",\n   \"location\": \"query\"\n  }\n },\n \"auth\": {\n  \"oauth2\": {\n   \"scopes\": {\n    \"https://www.googleapis.com/auth/drive\": {\n     \"description\": \"See, edit, create, and delete all of your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.appdata\": {\n     \"description\": \"View and manage its own configuration data in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.file\": {\n     \"description\": \"View and manage Google Drive files and folders that you have opened or created with this app\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata\": {\n     \"description\": \"View and manage metadata of files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata.readonly\": {\n     \"description\": \"View metadata for files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.photos.readonly\": {\n     \"description\": \"View the photos, videos and albums in your Google Photos\"\n    },\n    \"https://www.googleapis.com/auth/drive.readonly\": {\n     \"description\": \"See and download all your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.scripts\": {\n     \"description\": \"Modify your Google Apps Script scripts' behavior\"\n    }\n   }\n  }\n },\n \"schemas\": {\n  \"About\": {\n   \"id\": \"About\",\n   \"type\": \"object\",\n   \"description\": \"Information about the user, the user's Drive, and system capabilities.\",\n   \"properties\": {\n    \"appInstalled\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has installed the requesting app.\"\n    },\n    \"canCreateTeamDrives\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user can create Team Drives.\"\n    },\n    \"exportFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported exports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"folderColorPalette\": {\n     \"type\": \"array\",\n     \"description\": \"The currently supported folder colors as RGB hex strings.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"importFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported imports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#about\\\".\",\n     \"default\": \"drive#about\"\n    },\n    \"maxImportSizes\": {\n     \"type\": \"object\",\n     \"description\": \"A map of maximum import sizes by MIME type, in bytes.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"format\": \"int64\"\n     }\n    },\n    \"maxUploadSize\": {\n     \"type\": \"string\",\n     \"description\": \"The maximum upload size in bytes.\",\n     \"format\": \"int64\"\n    },\n    \"storageQuota\": {\n     \"type\": \"object\",\n     \"description\": \"The user's storage quota limits and usage. All fields are measured in bytes.\",\n     \"properties\": {\n      \"limit\": {\n       \"type\": \"string\",\n       \"description\": \"The usage limit, if applicable. This will not be present if the user has unlimited storage.\",\n       \"format\": \"int64\"\n      },\n      \"usage\": {\n       \"type\": \"string\",\n       \"description\": \"The total usage across all services.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDrive\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by all files in Google Drive.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDriveTrash\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by trashed files in Google Drive.\",\n       \"format\": \"int64\"\n      }\n     }\n    },\n    \"teamDriveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"A list of themes that are supported for Team Drives.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"A link to this Team Drive theme's background image.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"The color of this Team Drive theme as an RGB hex string.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the theme.\"\n       }\n      }\n     }\n    },\n    \"user\": {\n     \"$ref\": \"User\",\n     \"description\": \"The authenticated user.\"\n    }\n   }\n  },\n  \"Change\": {\n   \"id\": \"Change\",\n   \"type\": \"object\",\n   \"description\": \"A change to a file or Team Drive.\",\n   \"properties\": {\n    \"file\": {\n     \"$ref\": \"File\",\n     \"description\": \"The updated state of the file. Present if the type is file and the file has not been removed from this list of changes.\"\n    },\n    \"fileId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file which has changed.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#change\\\".\",\n     \"default\": \"drive#change\"\n    },\n    \"removed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file or Team Drive has been removed from this list of changes, for example by deletion or loss of access.\"\n    },\n    \"teamDrive\": {\n     \"$ref\": \"TeamDrive\",\n     \"description\": \"The updated state of the Team Drive. Present if the type is teamDrive, the user is still a member of the Team Drive, and the Team Drive has not been removed.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the Team Drive associated with this change.\"\n    },\n    \"time\": {\n     \"type\": \"string\",\n     \"description\": \"The time of this change (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the change. Possible values are file and teamDrive.\"\n    }\n   }\n  },\n  \"ChangeList\": {\n   \"id\": \"ChangeList\",\n   \"type\": \"object\",\n   \"description\": \"A list of changes for a user.\",\n   \"properties\": {\n    \"changes\": {\n     \"type\": \"array\",\n     \"description\": \"The list of changes. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Change\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#changeList\\\".\",\n     \"default\": \"drive#changeList\"\n    },\n    \"newStartPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for future changes. This will be present only if the end of the current changes list has been reached.\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of changes. This will be absent if the end of the changes list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"Channel\": {\n   \"id\": \"Channel\",\n   \"type\": \"object\",\n   \"description\": \"An notification channel used to watch for resource changes.\",\n   \"properties\": {\n    \"address\": {\n     \"type\": \"string\",\n     \"description\": \"The address where notifications are delivered for this channel.\"\n    },\n    \"expiration\": {\n     \"type\": \"string\",\n     \"description\": \"Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.\",\n     \"format\": \"int64\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"A UUID or similar unique string that identifies this channel.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies this as a notification channel used to watch for changes to a resource. Value: the fixed string \\\"api#channel\\\".\",\n     \"default\": \"api#channel\"\n    },\n    \"params\": {\n     \"type\": \"object\",\n     \"description\": \"Additional parameters controlling delivery channel behavior. Optional.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"Declares a new parameter by name.\"\n     }\n    },\n    \"payload\": {\n     \"type\": \"boolean\",\n     \"description\": \"A Boolean value to indicate whether payload is wanted. Optional.\"\n    },\n    \"resourceId\": {\n     \"type\": \"string\",\n     \"description\": \"An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.\"\n    },\n    \"resourceUri\": {\n     \"type\": \"string\",\n     \"description\": \"A version-specific identifier for the watched resource.\"\n    },\n    \"token\": {\n     \"type\": \"string\",\n     \"description\": \"An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of delivery mechanism used for this channel.\"\n    }\n   }\n  },\n  \"Comment\": {\n   \"id\": \"Comment\",\n   \"type\": \"object\",\n   \"description\": \"A comment on a file.\",\n   \"properties\": {\n    \"anchor\": {\n     \"type\": \"string\",\n     \"description\": \"A region of the document represented as a JSON string. See anchor documentation for details on how to define and interpret anchor properties.\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who created the comment.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the comment. This field is used for setting the content, while htmlContent should be displayed.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.comments.create\",\n       \"drive.comments.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the comment was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been deleted. A deleted comment has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the comment with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the comment.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#comment\\\".\",\n     \"default\": \"drive#comment\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the comment or any of its replies was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"quotedFileContent\": {\n     \"type\": \"object\",\n     \"description\": \"The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.\",\n     \"properties\": {\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the quoted content.\"\n      },\n      \"value\": {\n       \"type\": \"string\",\n       \"description\": \"The quoted content itself. This is interpreted as plain text if set through the API.\"\n      }\n     }\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of replies to the comment in chronological order.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    },\n    \"resolved\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been resolved by one of its replies.\"\n    }\n   }\n  },\n  \"CommentList\": {\n   \"id\": \"CommentList\",\n   \"type\": \"object\",\n   \"description\": \"A list of comments on a file.\",\n   \"properties\": {\n    \"comments\": {\n     \"type\": \"array\",\n     \"description\": \"The list of comments. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Comment\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#commentList\\\".\",\n     \"default\": \"drive#commentList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of comments. This will be absent if the end of the comments list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"File\": {\n   \"id\": \"File\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a file.\",\n   \"properties\": {\n    \"appProperties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to this folder. This is always false when the item is not a folder.\"\n      },\n      \"canChangeCopyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this file.\"\n      },\n      \"canChangeViewersCanCopyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on this file.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy this file. For a Team Drive item, whether the current user can copy non-folder descendants of this item, or this item itself if it is not a folder.\"\n      },\n      \"canDelete\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this file.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children of this folder. This is false when the item is not a folder. Only populated for Team Drive items.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download this file.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit this file.\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of this folder. This is always false when the item is not a folder.\"\n      },\n      \"canMoveChildrenOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder outside of the Team Drive. This is false when the item is not a folder. Only populated for Team Drive items.\"\n      },\n      \"canMoveChildrenWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder within the Team Drive. This is false when the item is not a folder. Only populated for Team Drive items.\"\n      },\n      \"canMoveItemIntoTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item into a Team Drive. If the item is in a Team Drive, this field is equivalent to canMoveTeamDriveItem.\"\n      },\n      \"canMoveItemOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this Team Drive item outside of this Team Drive by changing its parent. Note that a request to change the parent of the item may still fail depending on the new parent that is being added. Only populated for Team Drive items.\"\n      },\n      \"canMoveItemWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this Team Drive item within this Team Drive. Note that a request to change the parent of the item may still fail depending on the new parent that is being added. Only populated for Team Drive items.\"\n      },\n      \"canMoveTeamDriveItem\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemWithinTeamDrive or canMoveItemOutOfTeamDrive instead.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of this file. For a Team Drive item, whether revisions of non-folder descendants of this item, or this item itself if it is not a folder, can be read.\"\n      },\n      \"canReadTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the Team Drive to which this file belongs. Only populated for Team Drive files.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove children from this folder. This is always false when the item is not a folder. For Team Drive items, use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this file.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the sharing settings for this file.\"\n      },\n      \"canTrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this file to trash.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children of this folder. This is false when the item is not a folder. Only populated for Team Drive items.\"\n      },\n      \"canUntrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can restore this file from trash.\"\n      }\n     }\n    },\n    \"contentHints\": {\n     \"type\": \"object\",\n     \"description\": \"Additional information about the content of the file. These fields are never populated in responses.\",\n     \"properties\": {\n      \"indexableText\": {\n       \"type\": \"string\",\n       \"description\": \"Text to be indexed for the file to improve fullText queries. This is limited to 128KB in length and may contain HTML elements.\"\n      },\n      \"thumbnail\": {\n       \"type\": \"object\",\n       \"description\": \"A thumbnail for the file. This will only be used if Drive cannot generate a standard thumbnail.\",\n       \"properties\": {\n        \"image\": {\n         \"type\": \"string\",\n         \"description\": \"The thumbnail data encoded with URL-safe Base64 (RFC 4648 section 5).\",\n         \"format\": \"byte\"\n        },\n        \"mimeType\": {\n         \"type\": \"string\",\n         \"description\": \"The MIME type of the thumbnail.\"\n        }\n       }\n      }\n     }\n    },\n    \"copyRequiresWriterPermission\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the options to copy, print, or download this file, should be disabled for readers and commenters.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"description\": {\n     \"type\": \"string\",\n     \"description\": \"A short description of the file.\"\n    },\n    \"explicitlyTrashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"\n    },\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Google Docs to specific formats.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"fileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The final component of fullFileExtension. This is only available for files with binary content in Drive.\"\n    },\n    \"folderColorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"\n    },\n    \"fullFileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"\n    },\n    \"hasAugmentedPermissions\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether any users are granted file access directly on this file. This field is only populated for Team Drive files.\"\n    },\n    \"hasThumbnail\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"\n    },\n    \"headRevisionId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file's head revision. This is currently only available for files with binary content in Drive.\"\n    },\n    \"iconLink\": {\n     \"type\": \"string\",\n     \"description\": \"A static, unauthenticated link to the file's icon.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file.\"\n    },\n    \"imageMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about image media, if available.\",\n     \"properties\": {\n      \"aperture\": {\n       \"type\": \"number\",\n       \"description\": \"The aperture used to create the photo (f-number).\",\n       \"format\": \"float\"\n      },\n      \"cameraMake\": {\n       \"type\": \"string\",\n       \"description\": \"The make of the camera used to create the photo.\"\n      },\n      \"cameraModel\": {\n       \"type\": \"string\",\n       \"description\": \"The model of the camera used to create the photo.\"\n      },\n      \"colorSpace\": {\n       \"type\": \"string\",\n       \"description\": \"The color space of the photo.\"\n      },\n      \"exposureBias\": {\n       \"type\": \"number\",\n       \"description\": \"The exposure bias of the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"exposureMode\": {\n       \"type\": \"string\",\n       \"description\": \"The exposure mode used to create the photo.\"\n      },\n      \"exposureTime\": {\n       \"type\": \"number\",\n       \"description\": \"The length of the exposure, in seconds.\",\n       \"format\": \"float\"\n      },\n      \"flashUsed\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether a flash was used to create the photo.\"\n      },\n      \"focalLength\": {\n       \"type\": \"number\",\n       \"description\": \"The focal length used to create the photo, in millimeters.\",\n       \"format\": \"float\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the image in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"isoSpeed\": {\n       \"type\": \"integer\",\n       \"description\": \"The ISO speed used to create the photo.\",\n       \"format\": \"int32\"\n      },\n      \"lens\": {\n       \"type\": \"string\",\n       \"description\": \"The lens used to create the photo.\"\n      },\n      \"location\": {\n       \"type\": \"object\",\n       \"description\": \"Geographic location information stored in the image.\",\n       \"properties\": {\n        \"altitude\": {\n         \"type\": \"number\",\n         \"description\": \"The altitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"latitude\": {\n         \"type\": \"number\",\n         \"description\": \"The latitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"longitude\": {\n         \"type\": \"number\",\n         \"description\": \"The longitude stored in the image.\",\n         \"format\": \"double\"\n        }\n       }\n      },\n      \"maxApertureValue\": {\n       \"type\": \"number\",\n       \"description\": \"The smallest f-number of the lens at the focal length used to create the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"meteringMode\": {\n       \"type\": \"string\",\n       \"description\": \"The metering mode used to create the photo.\"\n      },\n      \"rotation\": {\n       \"type\": \"integer\",\n       \"description\": \"The rotation in clockwise degrees from the image's original orientation.\",\n       \"format\": \"int32\"\n      },\n      \"sensor\": {\n       \"type\": \"string\",\n       \"description\": \"The type of sensor used to create the photo.\"\n      },\n      \"subjectDistance\": {\n       \"type\": \"integer\",\n       \"description\": \"The distance to the subject of the photo, in meters.\",\n       \"format\": \"int32\"\n      },\n      \"time\": {\n       \"type\": \"string\",\n       \"description\": \"The date and time the photo was taken (EXIF DateTime).\"\n      },\n      \"whiteBalance\": {\n       \"type\": \"string\",\n       \"description\": \"The white balance mode used to create the photo.\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the image in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"isAppAuthorized\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file was created or opened by the requesting app.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\",\n     \"default\": \"drive#file\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify the file.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the file.\\nDrive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"\n    },\n    \"modifiedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been modified by this user.\"\n    },\n    \"modifiedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\",\n     \"format\": \"date-time\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of Team Drives, My Drive root folder, and Application Data folder the name is constant.\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Drive.\"\n    },\n    \"ownedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user owns the file. Not populated for Team Drive files.\"\n    },\n    \"owners\": {\n     \"type\": \"array\",\n     \"description\": \"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for Team Drive files.\",\n     \"items\": {\n      \"$ref\": \"User\"\n     }\n    },\n    \"parents\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the user's My Drive folder. If not specified as part of a copy request, the file will inherit any discoverable parents of the source file. Update requests must use the addParents and removeParents parameters to modify the parents list.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissionIds\": {\n     \"type\": \"array\",\n     \"description\": \"List of permission IDs for users with access to this file.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for Team Drive files.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    },\n    \"properties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"quotaBytesUsed\": {\n     \"type\": \"string\",\n     \"description\": \"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\",\n     \"format\": \"int64\"\n    },\n    \"shared\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been shared. Not populated for Team Drive files.\"\n    },\n    \"sharedWithMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"sharingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who shared the file with the requesting user, if applicable.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the file's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    },\n    \"spaces\": {\n     \"type\": \"array\",\n     \"description\": \"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"starred\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has starred the file.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"ID of the Team Drive the file resides in.\"\n    },\n    \"thumbnailLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"\n    },\n    \"thumbnailVersion\": {\n     \"type\": \"string\",\n     \"description\": \"The thumbnail version for use in thumbnail cache invalidation.\",\n     \"format\": \"int64\"\n    },\n    \"trashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"\n    },\n    \"trashedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time that the item was trashed (RFC 3339 date-time). Only populated for Team Drive files.\",\n     \"format\": \"date-time\"\n    },\n    \"trashingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"If the file has been explicitly trashed, the user who trashed it. Only populated for Team Drive files.\"\n    },\n    \"version\": {\n     \"type\": \"string\",\n     \"description\": \"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\",\n     \"format\": \"int64\"\n    },\n    \"videoMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about video media. This may not be available immediately upon upload.\",\n     \"properties\": {\n      \"durationMillis\": {\n       \"type\": \"string\",\n       \"description\": \"The duration of the video in milliseconds.\",\n       \"format\": \"int64\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the video in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the video in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"viewedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been viewed by this user.\"\n    },\n    \"viewedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was viewed by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"viewersCanCopyContent\": {\n     \"type\": \"boolean\",\n     \"description\": \"Deprecated - use copyRequiresWriterPermission instead.\"\n    },\n    \"webContentLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for downloading the content of the file in a browser. This is only available for files with binary content in Drive.\"\n    },\n    \"webViewLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for opening the file in a relevant Google editor or viewer in a browser.\"\n    },\n    \"writersCanShare\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether users with only writer permission can modify the file's permissions. Not populated for Team Drive files.\"\n    }\n   }\n  },\n  \"FileList\": {\n   \"id\": \"FileList\",\n   \"type\": \"object\",\n   \"description\": \"A list of files.\",\n   \"properties\": {\n    \"files\": {\n     \"type\": \"array\",\n     \"description\": \"The list of files. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"File\"\n     }\n    },\n    \"incompleteSearch\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the search process was incomplete. If true, then some search results may be missing, since all documents were not searched. This may occur when searching multiple Team Drives with the \\\"user,allTeamDrives\\\" corpora, but all corpora could not be searched. When this happens, it is suggested that clients narrow their query by choosing a different corpus such as \\\"user\\\" or \\\"teamDrive\\\".\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#fileList\\\".\",\n     \"default\": \"drive#fileList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of files. This will be absent if the end of the files list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"GeneratedIds\": {\n   \"id\": \"GeneratedIds\",\n   \"type\": \"object\",\n   \"description\": \"A list of generated file IDs which can be provided in create requests.\",\n   \"properties\": {\n    \"ids\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs generated for the requesting user in the specified space.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#generatedIds\\\".\",\n     \"default\": \"drive#generatedIds\"\n    },\n    \"space\": {\n     \"type\": \"string\",\n     \"description\": \"The type of file that can be created with these IDs.\"\n    }\n   }\n  },\n  \"Permission\": {\n   \"id\": \"Permission\",\n   \"type\": \"object\",\n   \"description\": \"A permission for a file. A permission grants a user, group, domain or the world access to a file or a folder hierarchy.\",\n   \"properties\": {\n    \"allowFileDiscovery\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"\n    },\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A displayable name for users, groups or domains.\"\n    },\n    \"domain\": {\n     \"type\": \"string\",\n     \"description\": \"The domain to which this permission refers.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user or group to which this permission refers.\"\n    },\n    \"expirationTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\",\n     \"default\": \"drive#permission\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    },\n    \"role\": {\n     \"type\": \"string\",\n     \"description\": \"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- owner \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    },\n    \"teamDrivePermissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Details of whether the permissions on this Team Drive item are inherited or directly on this item. This is an output-only field which is present only for Team Drive items.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Whether this permission is inherited. This field is always populated. This is an output-only field.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the item from which this permission is inherited. This is an output-only field and is only populated for members of the Team Drive.\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"The primary role for this user. While new values may be added in the future, the following are currently possible:  \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\"\n       },\n       \"teamDrivePermissionType\": {\n        \"type\": \"string\",\n        \"description\": \"The Team Drive permission type for this user. While new values may be added in future, the following are currently possible:  \\n- file \\n- member\"\n       }\n      }\n     }\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    }\n   }\n  },\n  \"PermissionList\": {\n   \"id\": \"PermissionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of permissions for a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permissionList\\\".\",\n     \"default\": \"drive#permissionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of permissions. This field will be absent if the end of the permissions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of permissions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    }\n   }\n  },\n  \"Reply\": {\n   \"id\": \"Reply\",\n   \"type\": \"object\",\n   \"description\": \"A reply to a comment on a file.\",\n   \"properties\": {\n    \"action\": {\n     \"type\": \"string\",\n     \"description\": \"The action the reply performed to the parent comment. Valid values are:  \\n- resolve \\n- reopen\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who created the reply.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the reply. This field is used for setting the content, while htmlContent should be displayed. This is required on creates if no action is specified.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.replies.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the reply was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the reply has been deleted. A deleted reply has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the reply with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the reply.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#reply\\\".\",\n     \"default\": \"drive#reply\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the reply was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    }\n   }\n  },\n  \"ReplyList\": {\n   \"id\": \"ReplyList\",\n   \"type\": \"object\",\n   \"description\": \"A list of replies to a comment on a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#replyList\\\".\",\n     \"default\": \"drive#replyList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of replies. This will be absent if the end of the replies list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The list of replies. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    }\n   }\n  },\n  \"Revision\": {\n   \"id\": \"Revision\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a revision to a file.\",\n   \"properties\": {\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Google Docs to specific formats.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the revision.\"\n    },\n    \"keepForever\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\",\n     \"default\": \"drive#revision\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify this revision.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the revision.\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the revision was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"\n    },\n    \"publishAuto\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.\"\n    },\n    \"published\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published. This is only applicable to Google Docs.\"\n    },\n    \"publishedOutsideDomain\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published outside the domain. This is only applicable to Google Docs.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    }\n   }\n  },\n  \"RevisionList\": {\n   \"id\": \"RevisionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of revisions of a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revisionList\\\".\",\n     \"default\": \"drive#revisionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of revisions. This will be absent if the end of the revisions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"revisions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of revisions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Revision\"\n     }\n    }\n   }\n  },\n  \"StartPageToken\": {\n   \"id\": \"StartPageToken\",\n   \"type\": \"object\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#startPageToken\\\".\",\n     \"default\": \"drive#startPageToken\"\n    },\n    \"startPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for listing changes.\"\n    }\n   }\n  },\n  \"TeamDrive\": {\n   \"id\": \"TeamDrive\",\n   \"type\": \"object\",\n   \"description\": \"Representation of a Team Drive.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this Team Drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this Team Drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this Team Drive.\"\n      },\n      \"canChangeCopyRequiresWriterPermissionRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this Team Drive.\"\n      },\n      \"canChangeDomainUsersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the domainUsersOnly restriction of this Team Drive.\"\n      },\n      \"canChangeTeamDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this Team Drive.\"\n      },\n      \"canChangeTeamMembersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the teamMembersOnly restriction of this Team Drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this Team Drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this Team Drive.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children from folders in this Team Drive.\"\n      },\n      \"canDeleteTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this Team Drive. Attempting to delete the Team Drive may still fail if there are untrashed items inside the Team Drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this Team Drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this Team Drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this Team Drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this Team Drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this Team Drive.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this Team Drive.\"\n      },\n      \"canRenameTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this Team Drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this Team Drive.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children from folders in this Team Drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the Team Drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this Team Drive which is also the ID of the top level folder of this Team Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\",\n     \"default\": \"drive#teamDrive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this Team Drive.\"\n    },\n    \"restrictions\": {\n     \"type\": \"object\",\n     \"description\": \"A set of restrictions that apply to this Team Drive or items inside this Team Drive.\",\n     \"properties\": {\n      \"adminManagedRestrictions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether administrative privileges on this Team Drive are required to modify restrictions.\"\n      },\n      \"copyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the options to copy, print, or download files inside this Team Drive, should be disabled for readers and commenters. When this restriction is set to true, it will override the similarly named field to true for any file inside this Team Drive.\"\n      },\n      \"domainUsersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to this Team Drive and items inside this Team Drive is restricted to users of the domain to which this Team Drive belongs. This restriction may be overridden by other sharing policies controlled outside of this Team Drive.\"\n      },\n      \"teamMembersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to items inside this Team Drive is restricted to members of this Team Drive.\"\n      }\n     }\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"TeamDriveList\": {\n   \"id\": \"TeamDriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of Team Drives.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDriveList\\\".\",\n     \"default\": \"drive#teamDriveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of Team Drives. This will be absent if the end of the Team Drives list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"teamDrives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of Team Drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"TeamDrive\"\n     }\n    }\n   }\n  },\n  \"User\": {\n   \"id\": \"User\",\n   \"type\": \"object\",\n   \"description\": \"Information about a Drive user.\",\n   \"properties\": {\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A plain text displayable name for this user.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#user\\\".\",\n     \"default\": \"drive#user\"\n    },\n    \"me\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this user is the requesting user.\"\n    },\n    \"permissionId\": {\n     \"type\": \"string\",\n     \"description\": \"The user's ID as visible in Permission resources.\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    }\n   }\n  }\n },\n \"resources\": {\n  \"about\": {\n   \"methods\": {\n    \"get\": {\n     \"id\": \"drive.about.get\",\n     \"path\": \"about\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets information about the user, the user's Drive, and system capabilities.\",\n     \"response\": {\n      \"$ref\": \"About\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"changes\": {\n   \"methods\": {\n    \"getStartPageToken\": {\n     \"id\": \"drive.changes.getStartPageToken\",\n     \"path\": \"changes/startPageToken\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets the starting pageToken for listing future changes.\",\n     \"parameters\": {\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive for which the starting pageToken for listing future changes from that Team Drive will be returned.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"StartPageToken\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.changes.list\",\n     \"path\": \"changes\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the changes for a user or Team Drive.\",\n     \"parameters\": {\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether Team Drive files or changes should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The Team Drive from which changes will be returned. If specified the change IDs will be reflective of the Team Drive; use the combined Team Drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"response\": {\n      \"$ref\": \"ChangeList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    },\n    \"watch\": {\n     \"id\": \"drive.changes.watch\",\n     \"path\": \"changes/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes for a user.\",\n     \"parameters\": {\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether Team Drive files or changes should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The Team Drive from which changes will be returned. If specified the change IDs will be reflective of the Team Drive; use the combined Team Drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"channels\": {\n   \"methods\": {\n    \"stop\": {\n     \"id\": \"drive.channels.stop\",\n     \"path\": \"channels/stop\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Stop watching resources through this channel\",\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"comments\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.comments.create\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new comment on a file.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.comments.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.comments.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a comment by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.comments.list\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's comments.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of comments to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"startModifiedTime\": {\n       \"type\": \"string\",\n       \"description\": \"The minimum value of 'modifiedTime' for the result comments (RFC 3339 date-time).\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"CommentList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.comments.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a comment with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"files\": {\n   \"methods\": {\n    \"copy\": {\n     \"id\": \"drive.files.copy\",\n     \"path\": \"files/{fileId}/copy\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a copy of a file and applies any requested updates with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\"\n     ]\n    },\n    \"create\": {\n     \"id\": \"drive.files.create\",\n     \"path\": \"files\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new file.\",\n     \"parameters\": {\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files\"\n       }\n      }\n     },\n     \"supportsSubscription\": true\n    },\n    \"delete\": {\n     \"id\": \"drive.files.delete\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a Team Drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"emptyTrash\": {\n     \"id\": \"drive.files.emptyTrash\",\n     \"path\": \"files/trash\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes all of the user's trashed files.\",\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"export\": {\n     \"id\": \"drive.files.export\",\n     \"path\": \"files/{fileId}/export\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the format requested for this export.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"mimeType\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true\n    },\n    \"generateIds\": {\n     \"id\": \"drive.files.generateIds\",\n     \"path\": \"files/generateIds\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Generates a set of file IDs which can be provided in create requests.\",\n     \"parameters\": {\n      \"count\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of IDs to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"space\": {\n       \"type\": \"string\",\n       \"description\": \"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"GeneratedIds\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.files.get\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a file's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    },\n    \"list\": {\n     \"id\": \"drive.files.list\",\n     \"path\": \"files\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists or searches files.\",\n     \"parameters\": {\n      \"corpora\": {\n       \"type\": \"string\",\n       \"description\": \"Comma-separated list of bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'teamDrive' and 'allTeamDrives'. 'allTeamDrives' must be combined with 'user'; all other values must be used in isolation. Prefer 'user' or 'teamDrive' to 'allTeamDrives' for efficiency.\",\n       \"location\": \"query\"\n      },\n      \"corpus\": {\n       \"type\": \"string\",\n       \"description\": \"The source of files to list. Deprecated: use 'corpora' instead.\",\n       \"enum\": [\n        \"domain\",\n        \"user\"\n       ],\n       \"enumDescriptions\": [\n        \"Files shared to the user's domain.\",\n        \"Files owned by or shared to the user.\"\n       ],\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether Team Drive items should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"orderBy\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"ID of Team Drive to search.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"FileList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.files.update\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a file's metadata and/or content with patch semantics.\",\n     \"parameters\": {\n      \"addParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to add.\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"removeParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to remove.\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.scripts\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files/{fileId}\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files/{fileId}\"\n       }\n      }\n     }\n    },\n    \"watch\": {\n     \"id\": \"drive.files.watch\",\n     \"path\": \"files/{fileId}/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes to a file\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"permissions\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.permissions.create\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a permission for a file or Team Drive.\",\n     \"parameters\": {\n      \"emailMessage\": {\n       \"type\": \"string\",\n       \"description\": \"A plain text custom message to include in the notification email.\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"sendNotificationEmail\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.permissions.delete\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a permission.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.permissions.get\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a permission by ID.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.permissions.list\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's or Team Drive's permissions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of permissions to return per page. When not set for files in a Team Drive, at most 100 results will be returned. When not set for files that are not in a Team Drive, the entire list will be returned.\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"PermissionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.permissions.update\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a permission with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or Team Drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"removeExpiration\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to remove the expiration date.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports Team Drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the item belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"replies\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.replies.create\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new reply to a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.replies.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a reply.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.replies.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a reply by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.replies.list\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a comment's replies.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of replies to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"ReplyList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.replies.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a reply with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"revisions\": {\n   \"methods\": {\n    \"delete\": {\n     \"id\": \"drive.revisions.delete\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a revision. This method is only applicable to files with binary content in Drive.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.revisions.get\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a revision's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true\n    },\n    \"list\": {\n     \"id\": \"drive.revisions.list\",\n     \"path\": \"files/{fileId}/revisions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's revisions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of revisions to return per page.\",\n       \"default\": \"200\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"RevisionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.revisions.update\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a revision with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Revision\"\n     },\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"teamdrives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.teamdrives.create\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new Team Drive.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.teamdrives.delete\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a Team Drive for which the user is an organizer. The Team Drive cannot contain any untrashed items.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.teamdrives.get\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a Team Drive's metadata by ID.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.teamdrives.list\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the user's Team Drives.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of Team Drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then all Team Drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"TeamDriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.teamdrives.update\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a Team Drive's metadata\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  }\n }\n}\n\n"
  },
  {
    "path": "data-raw/old/drive-v3_2019-07-08.json",
    "content": "{\n \"kind\": \"discovery#restDescription\",\n \"etag\": \"\\\"9eZ1uxVRThTDhLJCZHhqs3eQWz4/NhaDzk7bBdjuLhkxPwx-7nNLC6I\\\"\",\n \"discoveryVersion\": \"v1\",\n \"id\": \"drive:v3\",\n \"name\": \"drive\",\n \"version\": \"v3\",\n \"revision\": \"20190708\",\n \"title\": \"Drive API\",\n \"description\": \"Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.\",\n \"ownerDomain\": \"google.com\",\n \"ownerName\": \"Google\",\n \"icons\": {\n  \"x16\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png\",\n  \"x32\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png\"\n },\n \"documentationLink\": \"https://developers.google.com/drive/\",\n \"protocol\": \"rest\",\n \"baseUrl\": \"https://www.googleapis.com/drive/v3/\",\n \"basePath\": \"/drive/v3/\",\n \"rootUrl\": \"https://www.googleapis.com/\",\n \"servicePath\": \"drive/v3/\",\n \"batchPath\": \"batch/drive/v3\",\n \"parameters\": {\n  \"alt\": {\n   \"type\": \"string\",\n   \"description\": \"Data format for the response.\",\n   \"default\": \"json\",\n   \"enum\": [\n    \"json\"\n   ],\n   \"enumDescriptions\": [\n    \"Responses with Content-Type of application/json\"\n   ],\n   \"location\": \"query\"\n  },\n  \"fields\": {\n   \"type\": \"string\",\n   \"description\": \"Selector specifying which fields to include in a partial response.\",\n   \"location\": \"query\"\n  },\n  \"key\": {\n   \"type\": \"string\",\n   \"description\": \"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\",\n   \"location\": \"query\"\n  },\n  \"oauth_token\": {\n   \"type\": \"string\",\n   \"description\": \"OAuth 2.0 token for the current user.\",\n   \"location\": \"query\"\n  },\n  \"prettyPrint\": {\n   \"type\": \"boolean\",\n   \"description\": \"Returns response with indentations and line breaks.\",\n   \"default\": \"true\",\n   \"location\": \"query\"\n  },\n  \"quotaUser\": {\n   \"type\": \"string\",\n   \"description\": \"An opaque string that represents a user for quota purposes. Must not exceed 40 characters.\",\n   \"location\": \"query\"\n  },\n  \"userIp\": {\n   \"type\": \"string\",\n   \"description\": \"Deprecated. Please use quotaUser instead.\",\n   \"location\": \"query\"\n  }\n },\n \"auth\": {\n  \"oauth2\": {\n   \"scopes\": {\n    \"https://www.googleapis.com/auth/drive\": {\n     \"description\": \"See, edit, create, and delete all of your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.appdata\": {\n     \"description\": \"View and manage its own configuration data in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.file\": {\n     \"description\": \"View and manage Google Drive files and folders that you have opened or created with this app\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata\": {\n     \"description\": \"View and manage metadata of files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata.readonly\": {\n     \"description\": \"View metadata for files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.photos.readonly\": {\n     \"description\": \"View the photos, videos and albums in your Google Photos\"\n    },\n    \"https://www.googleapis.com/auth/drive.readonly\": {\n     \"description\": \"See and download all your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.scripts\": {\n     \"description\": \"Modify your Google Apps Script scripts' behavior\"\n    }\n   }\n  }\n },\n \"schemas\": {\n  \"About\": {\n   \"id\": \"About\",\n   \"type\": \"object\",\n   \"description\": \"Information about the user, the user's Drive, and system capabilities.\",\n   \"properties\": {\n    \"appInstalled\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has installed the requesting app.\"\n    },\n    \"canCreateDrives\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user can create shared drives.\"\n    },\n    \"canCreateTeamDrives\": {\n     \"type\": \"boolean\",\n     \"description\": \"Deprecated - use canCreateDrives instead.\"\n    },\n    \"driveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"A list of themes that are supported for shared drives.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"A link to this theme's background image.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"The color of this theme as an RGB hex string.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the theme.\"\n       }\n      }\n     }\n    },\n    \"exportFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported exports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"folderColorPalette\": {\n     \"type\": \"array\",\n     \"description\": \"The currently supported folder colors as RGB hex strings.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"importFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported imports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#about\\\".\",\n     \"default\": \"drive#about\"\n    },\n    \"maxImportSizes\": {\n     \"type\": \"object\",\n     \"description\": \"A map of maximum import sizes by MIME type, in bytes.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"format\": \"int64\"\n     }\n    },\n    \"maxUploadSize\": {\n     \"type\": \"string\",\n     \"description\": \"The maximum upload size in bytes.\",\n     \"format\": \"int64\"\n    },\n    \"storageQuota\": {\n     \"type\": \"object\",\n     \"description\": \"The user's storage quota limits and usage. All fields are measured in bytes.\",\n     \"properties\": {\n      \"limit\": {\n       \"type\": \"string\",\n       \"description\": \"The usage limit, if applicable. This will not be present if the user has unlimited storage.\",\n       \"format\": \"int64\"\n      },\n      \"usage\": {\n       \"type\": \"string\",\n       \"description\": \"The total usage across all services.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDrive\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by all files in Google Drive.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDriveTrash\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by trashed files in Google Drive.\",\n       \"format\": \"int64\"\n      }\n     }\n    },\n    \"teamDriveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"Deprecated - use driveThemes instead.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/backgroundImageLink instead.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/colorRgb instead.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/id instead.\"\n       }\n      }\n     }\n    },\n    \"user\": {\n     \"$ref\": \"User\",\n     \"description\": \"The authenticated user.\"\n    }\n   }\n  },\n  \"Change\": {\n   \"id\": \"Change\",\n   \"type\": \"object\",\n   \"description\": \"A change to a file or shared drive.\",\n   \"properties\": {\n    \"changeType\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the change. Possible values are file and drive.\"\n    },\n    \"drive\": {\n     \"$ref\": \"Drive\",\n     \"description\": \"The updated state of the shared drive. Present if the changeType is drive, the user is still a member of the shared drive, and the shared drive has not been deleted.\"\n    },\n    \"driveId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the shared drive associated with this change.\"\n    },\n    \"file\": {\n     \"$ref\": \"File\",\n     \"description\": \"The updated state of the file. Present if the type is file and the file has not been removed from this list of changes.\"\n    },\n    \"fileId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file which has changed.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#change\\\".\",\n     \"default\": \"drive#change\"\n    },\n    \"removed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file or shared drive has been removed from this list of changes, for example by deletion or loss of access.\"\n    },\n    \"teamDrive\": {\n     \"$ref\": \"TeamDrive\",\n     \"description\": \"Deprecated - use drive instead.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use driveId instead.\"\n    },\n    \"time\": {\n     \"type\": \"string\",\n     \"description\": \"The time of this change (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use changeType instead.\"\n    }\n   }\n  },\n  \"ChangeList\": {\n   \"id\": \"ChangeList\",\n   \"type\": \"object\",\n   \"description\": \"A list of changes for a user.\",\n   \"properties\": {\n    \"changes\": {\n     \"type\": \"array\",\n     \"description\": \"The list of changes. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Change\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#changeList\\\".\",\n     \"default\": \"drive#changeList\"\n    },\n    \"newStartPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for future changes. This will be present only if the end of the current changes list has been reached.\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of changes. This will be absent if the end of the changes list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"Channel\": {\n   \"id\": \"Channel\",\n   \"type\": \"object\",\n   \"description\": \"An notification channel used to watch for resource changes.\",\n   \"properties\": {\n    \"address\": {\n     \"type\": \"string\",\n     \"description\": \"The address where notifications are delivered for this channel.\"\n    },\n    \"expiration\": {\n     \"type\": \"string\",\n     \"description\": \"Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.\",\n     \"format\": \"int64\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"A UUID or similar unique string that identifies this channel.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies this as a notification channel used to watch for changes to a resource, which is \\\"api#channel\\\".\",\n     \"default\": \"api#channel\"\n    },\n    \"params\": {\n     \"type\": \"object\",\n     \"description\": \"Additional parameters controlling delivery channel behavior. Optional.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"Declares a new parameter by name.\"\n     }\n    },\n    \"payload\": {\n     \"type\": \"boolean\",\n     \"description\": \"A Boolean value to indicate whether payload is wanted. Optional.\"\n    },\n    \"resourceId\": {\n     \"type\": \"string\",\n     \"description\": \"An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.\"\n    },\n    \"resourceUri\": {\n     \"type\": \"string\",\n     \"description\": \"A version-specific identifier for the watched resource.\"\n    },\n    \"token\": {\n     \"type\": \"string\",\n     \"description\": \"An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of delivery mechanism used for this channel.\"\n    }\n   }\n  },\n  \"Comment\": {\n   \"id\": \"Comment\",\n   \"type\": \"object\",\n   \"description\": \"A comment on a file.\",\n   \"properties\": {\n    \"anchor\": {\n     \"type\": \"string\",\n     \"description\": \"A region of the document represented as a JSON string. See anchor documentation for details on how to define and interpret anchor properties.\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who created the comment.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the comment. This field is used for setting the content, while htmlContent should be displayed.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.comments.create\",\n       \"drive.comments.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the comment was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been deleted. A deleted comment has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the comment with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the comment.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#comment\\\".\",\n     \"default\": \"drive#comment\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the comment or any of its replies was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"quotedFileContent\": {\n     \"type\": \"object\",\n     \"description\": \"The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.\",\n     \"properties\": {\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the quoted content.\"\n      },\n      \"value\": {\n       \"type\": \"string\",\n       \"description\": \"The quoted content itself. This is interpreted as plain text if set through the API.\"\n      }\n     }\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of replies to the comment in chronological order.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    },\n    \"resolved\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been resolved by one of its replies.\"\n    }\n   }\n  },\n  \"CommentList\": {\n   \"id\": \"CommentList\",\n   \"type\": \"object\",\n   \"description\": \"A list of comments on a file.\",\n   \"properties\": {\n    \"comments\": {\n     \"type\": \"array\",\n     \"description\": \"The list of comments. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Comment\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#commentList\\\".\",\n     \"default\": \"drive#commentList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of comments. This will be absent if the end of the comments list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"Drive\": {\n   \"id\": \"Drive\",\n   \"type\": \"object\",\n   \"description\": \"Representation of a shared drive.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this shared drive is set. This is a write only field; it can only be set on drive.drives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Google Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this shared drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this shared drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this shared drive.\"\n      },\n      \"canChangeCopyRequiresWriterPermissionRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this shared drive.\"\n      },\n      \"canChangeDomainUsersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the domainUsersOnly restriction of this shared drive.\"\n      },\n      \"canChangeDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this shared drive.\"\n      },\n      \"canChangeDriveMembersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the driveMembersOnly restriction of this shared drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this shared drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this shared drive.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children from folders in this shared drive.\"\n      },\n      \"canDeleteDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this shared drive. Attempting to delete the shared drive may still fail if there are untrashed items inside the shared drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this shared drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this shared drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this shared drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this shared drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this shared drive.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this shared drive.\"\n      },\n      \"canRenameDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this shared drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this shared drive.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children from folders in this shared drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this shared drive as an RGB hex string. It can only be set on a drive.drives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the shared drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"hidden\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the shared drive is hidden from default view.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this shared drive which is also the ID of the top level folder of this shared drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#drive\\\".\",\n     \"default\": \"drive#drive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this shared drive.\"\n    },\n    \"restrictions\": {\n     \"type\": \"object\",\n     \"description\": \"A set of restrictions that apply to this shared drive or items inside this shared drive.\",\n     \"properties\": {\n      \"adminManagedRestrictions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether administrative privileges on this shared drive are required to modify restrictions.\"\n      },\n      \"copyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the options to copy, print, or download files inside this shared drive, should be disabled for readers and commenters. When this restriction is set to true, it will override the similarly named field to true for any file inside this shared drive.\"\n      },\n      \"domainUsersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to this shared drive and items inside this shared drive is restricted to users of the domain to which this shared drive belongs. This restriction may be overridden by other sharing policies controlled outside of this shared drive.\"\n      },\n      \"driveMembersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to items inside this shared drive is restricted to its members.\"\n      }\n     }\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible driveThemes can be retrieved from a drive.about.get response. When not specified on a drive.drives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"DriveList\": {\n   \"id\": \"DriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of shared drives.\",\n   \"properties\": {\n    \"drives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of shared drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Drive\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#driveList\\\".\",\n     \"default\": \"drive#driveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of shared drives. This will be absent if the end of the list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"File\": {\n   \"id\": \"File\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a file.\",\n   \"properties\": {\n    \"appProperties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to this folder. This is always false when the item is not a folder.\"\n      },\n      \"canChangeCopyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this file.\"\n      },\n      \"canChangeViewersCanCopyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on this file.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy this file. For an item in a shared drive, whether the current user can copy non-folder descendants of this item, or this item itself if it is not a folder.\"\n      },\n      \"canDelete\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this file.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children of this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download this file.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit this file.\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of this folder. This is always false when the item is not a folder.\"\n      },\n      \"canMoveChildrenOutOfDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder outside of the shared drive. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canMoveChildrenOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveChildrenOutOfDrive instead.\"\n      },\n      \"canMoveChildrenWithinDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder within the shared drive. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canMoveChildrenWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveChildrenWithinDrive instead.\"\n      },\n      \"canMoveItemIntoTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemOutOfDrive instead.\"\n      },\n      \"canMoveItemOutOfDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item outside of this drive by changing its parent. Note that a request to change the parent of the item may still fail depending on the new parent that is being added.\"\n      },\n      \"canMoveItemOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemOutOfDrive instead.\"\n      },\n      \"canMoveItemWithinDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item within this shared drive. Note that a request to change the parent of the item may still fail depending on the new parent that is being added. Only populated for items in shared drives.\"\n      },\n      \"canMoveItemWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemWithinDrive instead.\"\n      },\n      \"canMoveTeamDriveItem\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemWithinDrive or canMoveItemOutOfDrive instead.\"\n      },\n      \"canReadDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the shared drive to which this file belongs. Only populated for items in shared drives.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of this file. For a shared drive item, whether revisions of non-folder descendants of this item, or this item itself if it is not a folder, can be read.\"\n      },\n      \"canReadTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canReadDrive instead.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove children from this folder. This is always false when the item is not a folder. For a folder in a shared drive, use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this file.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the sharing settings for this file.\"\n      },\n      \"canTrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this file to trash.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children of this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canUntrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can restore this file from trash.\"\n      }\n     }\n    },\n    \"contentHints\": {\n     \"type\": \"object\",\n     \"description\": \"Additional information about the content of the file. These fields are never populated in responses.\",\n     \"properties\": {\n      \"indexableText\": {\n       \"type\": \"string\",\n       \"description\": \"Text to be indexed for the file to improve fullText queries. This is limited to 128KB in length and may contain HTML elements.\"\n      },\n      \"thumbnail\": {\n       \"type\": \"object\",\n       \"description\": \"A thumbnail for the file. This will only be used if Google Drive cannot generate a standard thumbnail.\",\n       \"properties\": {\n        \"image\": {\n         \"type\": \"string\",\n         \"description\": \"The thumbnail data encoded with URL-safe Base64 (RFC 4648 section 5).\",\n         \"format\": \"byte\"\n        },\n        \"mimeType\": {\n         \"type\": \"string\",\n         \"description\": \"The MIME type of the thumbnail.\"\n        }\n       }\n      }\n     }\n    },\n    \"copyRequiresWriterPermission\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the options to copy, print, or download this file, should be disabled for readers and commenters.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"description\": {\n     \"type\": \"string\",\n     \"description\": \"A short description of the file.\"\n    },\n    \"driveId\": {\n     \"type\": \"string\",\n     \"description\": \"ID of the shared drive the file resides in. Only populated for items in shared drives.\"\n    },\n    \"explicitlyTrashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"\n    },\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Google Docs to specific formats.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"fileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The final component of fullFileExtension. This is only available for files with binary content in Google Drive.\"\n    },\n    \"folderColorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"\n    },\n    \"fullFileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Google Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"\n    },\n    \"hasAugmentedPermissions\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether any users are granted file access directly on this file. This field is only populated for shared drive files.\"\n    },\n    \"hasThumbnail\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"\n    },\n    \"headRevisionId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file's head revision. This is currently only available for files with binary content in Google Drive.\"\n    },\n    \"iconLink\": {\n     \"type\": \"string\",\n     \"description\": \"A static, unauthenticated link to the file's icon.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file.\"\n    },\n    \"imageMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about image media, if available.\",\n     \"properties\": {\n      \"aperture\": {\n       \"type\": \"number\",\n       \"description\": \"The aperture used to create the photo (f-number).\",\n       \"format\": \"float\"\n      },\n      \"cameraMake\": {\n       \"type\": \"string\",\n       \"description\": \"The make of the camera used to create the photo.\"\n      },\n      \"cameraModel\": {\n       \"type\": \"string\",\n       \"description\": \"The model of the camera used to create the photo.\"\n      },\n      \"colorSpace\": {\n       \"type\": \"string\",\n       \"description\": \"The color space of the photo.\"\n      },\n      \"exposureBias\": {\n       \"type\": \"number\",\n       \"description\": \"The exposure bias of the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"exposureMode\": {\n       \"type\": \"string\",\n       \"description\": \"The exposure mode used to create the photo.\"\n      },\n      \"exposureTime\": {\n       \"type\": \"number\",\n       \"description\": \"The length of the exposure, in seconds.\",\n       \"format\": \"float\"\n      },\n      \"flashUsed\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether a flash was used to create the photo.\"\n      },\n      \"focalLength\": {\n       \"type\": \"number\",\n       \"description\": \"The focal length used to create the photo, in millimeters.\",\n       \"format\": \"float\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the image in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"isoSpeed\": {\n       \"type\": \"integer\",\n       \"description\": \"The ISO speed used to create the photo.\",\n       \"format\": \"int32\"\n      },\n      \"lens\": {\n       \"type\": \"string\",\n       \"description\": \"The lens used to create the photo.\"\n      },\n      \"location\": {\n       \"type\": \"object\",\n       \"description\": \"Geographic location information stored in the image.\",\n       \"properties\": {\n        \"altitude\": {\n         \"type\": \"number\",\n         \"description\": \"The altitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"latitude\": {\n         \"type\": \"number\",\n         \"description\": \"The latitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"longitude\": {\n         \"type\": \"number\",\n         \"description\": \"The longitude stored in the image.\",\n         \"format\": \"double\"\n        }\n       }\n      },\n      \"maxApertureValue\": {\n       \"type\": \"number\",\n       \"description\": \"The smallest f-number of the lens at the focal length used to create the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"meteringMode\": {\n       \"type\": \"string\",\n       \"description\": \"The metering mode used to create the photo.\"\n      },\n      \"rotation\": {\n       \"type\": \"integer\",\n       \"description\": \"The rotation in clockwise degrees from the image's original orientation.\",\n       \"format\": \"int32\"\n      },\n      \"sensor\": {\n       \"type\": \"string\",\n       \"description\": \"The type of sensor used to create the photo.\"\n      },\n      \"subjectDistance\": {\n       \"type\": \"integer\",\n       \"description\": \"The distance to the subject of the photo, in meters.\",\n       \"format\": \"int32\"\n      },\n      \"time\": {\n       \"type\": \"string\",\n       \"description\": \"The date and time the photo was taken (EXIF DateTime).\"\n      },\n      \"whiteBalance\": {\n       \"type\": \"string\",\n       \"description\": \"The white balance mode used to create the photo.\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the image in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"isAppAuthorized\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file was created or opened by the requesting app.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\",\n     \"default\": \"drive#file\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify the file.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Google Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the file.\\nGoogle Drive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"\n    },\n    \"modifiedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been modified by this user.\"\n    },\n    \"modifiedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\",\n     \"format\": \"date-time\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of shared drives, My Drive root folder, and Application Data folder the name is constant.\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Google Drive.\"\n    },\n    \"ownedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user owns the file. Not populated for items in shared drives.\"\n    },\n    \"owners\": {\n     \"type\": \"array\",\n     \"description\": \"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for items in shared drives.\",\n     \"items\": {\n      \"$ref\": \"User\"\n     }\n    },\n    \"parents\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the user's My Drive folder. If not specified as part of a copy request, the file will inherit any discoverable parents of the source file. Update requests must use the addParents and removeParents parameters to modify the parents list.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissionIds\": {\n     \"type\": \"array\",\n     \"description\": \"List of permission IDs for users with access to this file.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for items in shared drives.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    },\n    \"properties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"quotaBytesUsed\": {\n     \"type\": \"string\",\n     \"description\": \"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\",\n     \"format\": \"int64\"\n    },\n    \"shared\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been shared. Not populated for items in shared drives.\"\n    },\n    \"sharedWithMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"sharingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who shared the file with the requesting user, if applicable.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the file's content in bytes. This is only applicable to files with binary content in Google Drive.\",\n     \"format\": \"int64\"\n    },\n    \"spaces\": {\n     \"type\": \"array\",\n     \"description\": \"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"starred\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has starred the file.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use driveId instead.\"\n    },\n    \"thumbnailLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"\n    },\n    \"thumbnailVersion\": {\n     \"type\": \"string\",\n     \"description\": \"The thumbnail version for use in thumbnail cache invalidation.\",\n     \"format\": \"int64\"\n    },\n    \"trashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"\n    },\n    \"trashedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time that the item was trashed (RFC 3339 date-time). Only populated for items in shared drives.\",\n     \"format\": \"date-time\"\n    },\n    \"trashingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"If the file has been explicitly trashed, the user who trashed it. Only populated for items in shared drives.\"\n    },\n    \"version\": {\n     \"type\": \"string\",\n     \"description\": \"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\",\n     \"format\": \"int64\"\n    },\n    \"videoMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about video media. This may not be available immediately upon upload.\",\n     \"properties\": {\n      \"durationMillis\": {\n       \"type\": \"string\",\n       \"description\": \"The duration of the video in milliseconds.\",\n       \"format\": \"int64\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the video in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the video in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"viewedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been viewed by this user.\"\n    },\n    \"viewedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was viewed by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"viewersCanCopyContent\": {\n     \"type\": \"boolean\",\n     \"description\": \"Deprecated - use copyRequiresWriterPermission instead.\"\n    },\n    \"webContentLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for downloading the content of the file in a browser. This is only available for files with binary content in Google Drive.\"\n    },\n    \"webViewLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for opening the file in a relevant Google editor or viewer in a browser.\"\n    },\n    \"writersCanShare\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether users with only writer permission can modify the file's permissions. Not populated for items in shared drives.\"\n    }\n   }\n  },\n  \"FileList\": {\n   \"id\": \"FileList\",\n   \"type\": \"object\",\n   \"description\": \"A list of files.\",\n   \"properties\": {\n    \"files\": {\n     \"type\": \"array\",\n     \"description\": \"The list of files. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"File\"\n     }\n    },\n    \"incompleteSearch\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the search process was incomplete. If true, then some search results may be missing, since all documents were not searched. This may occur when searching multiple drives with the \\\"allDrives\\\" corpora, but all corpora could not be searched. When this happens, it is suggested that clients narrow their query by choosing a different corpus such as \\\"user\\\" or \\\"drive\\\".\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#fileList\\\".\",\n     \"default\": \"drive#fileList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of files. This will be absent if the end of the files list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"GeneratedIds\": {\n   \"id\": \"GeneratedIds\",\n   \"type\": \"object\",\n   \"description\": \"A list of generated file IDs which can be provided in create requests.\",\n   \"properties\": {\n    \"ids\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs generated for the requesting user in the specified space.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#generatedIds\\\".\",\n     \"default\": \"drive#generatedIds\"\n    },\n    \"space\": {\n     \"type\": \"string\",\n     \"description\": \"The type of file that can be created with these IDs.\"\n    }\n   }\n  },\n  \"Permission\": {\n   \"id\": \"Permission\",\n   \"type\": \"object\",\n   \"description\": \"A permission for a file. A permission grants a user, group, domain or the world access to a file or a folder hierarchy.\",\n   \"properties\": {\n    \"allowFileDiscovery\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"\n    },\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A displayable name for users, groups or domains.\"\n    },\n    \"domain\": {\n     \"type\": \"string\",\n     \"description\": \"The domain to which this permission refers.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user or group to which this permission refers.\"\n    },\n    \"expirationTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\",\n     \"default\": \"drive#permission\"\n    },\n    \"permissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Details of whether the permissions on this shared drive item are inherited or directly on this item. This is an output-only field which is present only for shared drive items.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Whether this permission is inherited. This field is always populated. This is an output-only field.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the item from which this permission is inherited. This is an output-only field and is only populated for members of the shared drive.\"\n       },\n       \"permissionType\": {\n        \"type\": \"string\",\n        \"description\": \"The permission type for this user. While new values may be added in future, the following are currently possible:  \\n- file \\n- member\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"The primary role for this user. While new values may be added in the future, the following are currently possible:  \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\"\n       }\n      }\n     }\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    },\n    \"role\": {\n     \"type\": \"string\",\n     \"description\": \"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- owner \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    },\n    \"teamDrivePermissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Deprecated - use permissionDetails instead.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Deprecated - use permissionDetails/inherited instead.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/inheritedFrom instead.\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/role instead.\"\n       },\n       \"teamDrivePermissionType\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/permissionType instead.\"\n       }\n      }\n     }\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    }\n   }\n  },\n  \"PermissionList\": {\n   \"id\": \"PermissionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of permissions for a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permissionList\\\".\",\n     \"default\": \"drive#permissionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of permissions. This field will be absent if the end of the permissions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of permissions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    }\n   }\n  },\n  \"Reply\": {\n   \"id\": \"Reply\",\n   \"type\": \"object\",\n   \"description\": \"A reply to a comment on a file.\",\n   \"properties\": {\n    \"action\": {\n     \"type\": \"string\",\n     \"description\": \"The action the reply performed to the parent comment. Valid values are:  \\n- resolve \\n- reopen\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who created the reply.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the reply. This field is used for setting the content, while htmlContent should be displayed. This is required on creates if no action is specified.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.replies.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the reply was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the reply has been deleted. A deleted reply has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the reply with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the reply.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#reply\\\".\",\n     \"default\": \"drive#reply\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the reply was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    }\n   }\n  },\n  \"ReplyList\": {\n   \"id\": \"ReplyList\",\n   \"type\": \"object\",\n   \"description\": \"A list of replies to a comment on a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#replyList\\\".\",\n     \"default\": \"drive#replyList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of replies. This will be absent if the end of the replies list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The list of replies. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    }\n   }\n  },\n  \"Revision\": {\n   \"id\": \"Revision\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a revision to a file.\",\n   \"properties\": {\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Google Docs to specific formats.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the revision.\"\n    },\n    \"keepForever\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\",\n     \"default\": \"drive#revision\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify this revision.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the revision.\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the revision was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"\n    },\n    \"publishAuto\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.\"\n    },\n    \"published\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published. This is only applicable to Google Docs.\"\n    },\n    \"publishedOutsideDomain\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published outside the domain. This is only applicable to Google Docs.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    }\n   }\n  },\n  \"RevisionList\": {\n   \"id\": \"RevisionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of revisions of a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revisionList\\\".\",\n     \"default\": \"drive#revisionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of revisions. This will be absent if the end of the revisions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"revisions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of revisions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Revision\"\n     }\n    }\n   }\n  },\n  \"StartPageToken\": {\n   \"id\": \"StartPageToken\",\n   \"type\": \"object\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#startPageToken\\\".\",\n     \"default\": \"drive#startPageToken\"\n    },\n    \"startPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for listing changes.\"\n    }\n   }\n  },\n  \"TeamDrive\": {\n   \"id\": \"TeamDrive\",\n   \"type\": \"object\",\n   \"description\": \"Deprecated: use the drive collection instead.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this Team Drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this Team Drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this Team Drive.\"\n      },\n      \"canChangeCopyRequiresWriterPermissionRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this Team Drive.\"\n      },\n      \"canChangeDomainUsersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the domainUsersOnly restriction of this Team Drive.\"\n      },\n      \"canChangeTeamDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this Team Drive.\"\n      },\n      \"canChangeTeamMembersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the teamMembersOnly restriction of this Team Drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this Team Drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this Team Drive.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children from folders in this Team Drive.\"\n      },\n      \"canDeleteTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this Team Drive. Attempting to delete the Team Drive may still fail if there are untrashed items inside the Team Drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this Team Drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this Team Drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this Team Drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this Team Drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this Team Drive.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this Team Drive.\"\n      },\n      \"canRenameTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this Team Drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this Team Drive.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children from folders in this Team Drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the Team Drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this Team Drive which is also the ID of the top level folder of this Team Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\",\n     \"default\": \"drive#teamDrive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this Team Drive.\"\n    },\n    \"restrictions\": {\n     \"type\": \"object\",\n     \"description\": \"A set of restrictions that apply to this Team Drive or items inside this Team Drive.\",\n     \"properties\": {\n      \"adminManagedRestrictions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether administrative privileges on this Team Drive are required to modify restrictions.\"\n      },\n      \"copyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the options to copy, print, or download files inside this Team Drive, should be disabled for readers and commenters. When this restriction is set to true, it will override the similarly named field to true for any file inside this Team Drive.\"\n      },\n      \"domainUsersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to this Team Drive and items inside this Team Drive is restricted to users of the domain to which this Team Drive belongs. This restriction may be overridden by other sharing policies controlled outside of this Team Drive.\"\n      },\n      \"teamMembersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to items inside this Team Drive is restricted to members of this Team Drive.\"\n      }\n     }\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"TeamDriveList\": {\n   \"id\": \"TeamDriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of Team Drives.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDriveList\\\".\",\n     \"default\": \"drive#teamDriveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of Team Drives. This will be absent if the end of the Team Drives list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"teamDrives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of Team Drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"TeamDrive\"\n     }\n    }\n   }\n  },\n  \"User\": {\n   \"id\": \"User\",\n   \"type\": \"object\",\n   \"description\": \"Information about a Drive user.\",\n   \"properties\": {\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A plain text displayable name for this user.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#user\\\".\",\n     \"default\": \"drive#user\"\n    },\n    \"me\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this user is the requesting user.\"\n    },\n    \"permissionId\": {\n     \"type\": \"string\",\n     \"description\": \"The user's ID as visible in Permission resources.\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    }\n   }\n  }\n },\n \"resources\": {\n  \"about\": {\n   \"methods\": {\n    \"get\": {\n     \"id\": \"drive.about.get\",\n     \"path\": \"about\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets information about the user, the user's Drive, and system capabilities.\",\n     \"response\": {\n      \"$ref\": \"About\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"changes\": {\n   \"methods\": {\n    \"getStartPageToken\": {\n     \"id\": \"drive.changes.getStartPageToken\",\n     \"path\": \"changes/startPageToken\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets the starting pageToken for listing future changes.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive for which the starting pageToken for listing future changes from that shared drive will be returned.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"StartPageToken\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.changes.list\",\n     \"path\": \"changes\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the changes for a user or shared drive.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The shared drive from which changes will be returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      },\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether both My Drive and shared drive items should be included in results. This parameter will only be effective until June 1, 2020. Afterwards shared drive items will be included in the results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"response\": {\n      \"$ref\": \"ChangeList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    },\n    \"watch\": {\n     \"id\": \"drive.changes.watch\",\n     \"path\": \"changes/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes for a user.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The shared drive from which changes will be returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      },\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether both My Drive and shared drive items should be included in results. This parameter will only be effective until June 1, 2020. Afterwards shared drive items will be included in the results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"channels\": {\n   \"methods\": {\n    \"stop\": {\n     \"id\": \"drive.channels.stop\",\n     \"path\": \"channels/stop\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Stop watching resources through this channel\",\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"comments\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.comments.create\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new comment on a file.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.comments.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.comments.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a comment by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.comments.list\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's comments.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of comments to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"startModifiedTime\": {\n       \"type\": \"string\",\n       \"description\": \"The minimum value of 'modifiedTime' for the result comments (RFC 3339 date-time).\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"CommentList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.comments.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a comment with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"drives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.drives.create\",\n     \"path\": \"drives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new shared drive.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a shared drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same shared drive. If the shared drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Drive\"\n     },\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.drives.delete\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a shared drive for which the user is an organizer. The shared drive cannot contain any untrashed items.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.drives.get\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a shared drive's metadata by ID.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"hide\": {\n     \"id\": \"drive.drives.hide\",\n     \"path\": \"drives/{driveId}/hide\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Hides a shared drive from the default view.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.drives.list\",\n     \"path\": \"drives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the user's shared drives.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of shared drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for shared drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching shared drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then all shared drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"DriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"unhide\": {\n     \"id\": \"drive.drives.unhide\",\n     \"path\": \"drives/{driveId}/unhide\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Restores a shared drive to the default view.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.drives.update\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates the metadate for a shared drive.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Drive\"\n     },\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  },\n  \"files\": {\n   \"methods\": {\n    \"copy\": {\n     \"id\": \"drive.files.copy\",\n     \"path\": \"files/{fileId}/copy\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a copy of a file and applies any requested updates with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\"\n     ]\n    },\n    \"create\": {\n     \"id\": \"drive.files.create\",\n     \"path\": \"files\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new file.\",\n     \"parameters\": {\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files\"\n       }\n      }\n     },\n     \"supportsSubscription\": true\n    },\n    \"delete\": {\n     \"id\": \"drive.files.delete\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a shared drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"emptyTrash\": {\n     \"id\": \"drive.files.emptyTrash\",\n     \"path\": \"files/trash\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes all of the user's trashed files.\",\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"export\": {\n     \"id\": \"drive.files.export\",\n     \"path\": \"files/{fileId}/export\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the format requested for this export.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"mimeType\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true\n    },\n    \"generateIds\": {\n     \"id\": \"drive.files.generateIds\",\n     \"path\": \"files/generateIds\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Generates a set of file IDs which can be provided in create or copy requests.\",\n     \"parameters\": {\n      \"count\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of IDs to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"space\": {\n       \"type\": \"string\",\n       \"description\": \"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"GeneratedIds\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.files.get\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a file's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    },\n    \"list\": {\n     \"id\": \"drive.files.list\",\n     \"path\": \"files\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists or searches files.\",\n     \"parameters\": {\n      \"corpora\": {\n       \"type\": \"string\",\n       \"description\": \"Bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'drive' and 'allDrives'. Prefer 'user' or 'drive' to 'allDrives' for efficiency.\",\n       \"location\": \"query\"\n      },\n      \"corpus\": {\n       \"type\": \"string\",\n       \"description\": \"The source of files to list. Deprecated: use 'corpora' instead.\",\n       \"enum\": [\n        \"domain\",\n        \"user\"\n       ],\n       \"enumDescriptions\": [\n        \"Files shared to the user's domain.\",\n        \"Files owned by or shared to the user.\"\n       ],\n       \"location\": \"query\"\n      },\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"ID of the shared drive to search.\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether both My Drive and shared drive items should be included in results. This parameter will only be effective until June 1, 2020. Afterwards shared drive items will be included in the results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"orderBy\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"FileList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.files.update\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a file's metadata and/or content with patch semantics.\",\n     \"parameters\": {\n      \"addParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to add.\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"removeParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to remove.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.scripts\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files/{fileId}\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files/{fileId}\"\n       }\n      }\n     }\n    },\n    \"watch\": {\n     \"id\": \"drive.files.watch\",\n     \"path\": \"files/{fileId}/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes to a file\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"permissions\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.permissions.create\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a permission for a file or shared drive.\",\n     \"parameters\": {\n      \"emailMessage\": {\n       \"type\": \"string\",\n       \"description\": \"A plain text custom message to include in the notification email.\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"sendNotificationEmail\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.permissions.delete\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a permission.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.permissions.get\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a permission by ID.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.permissions.list\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's or shared drive's permissions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of permissions to return per page. When not set for files in a shared drive, at most 100 results will be returned. When not set for files that are not in a shared drive, the entire list will be returned.\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"PermissionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.permissions.update\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a permission with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"removeExpiration\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to remove the expiration date.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"replies\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.replies.create\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new reply to a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.replies.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a reply.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.replies.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a reply by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.replies.list\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a comment's replies.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of replies to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"ReplyList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.replies.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a reply with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"revisions\": {\n   \"methods\": {\n    \"delete\": {\n     \"id\": \"drive.revisions.delete\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file version. You can only delete revisions for files with binary content in Google Drive, like images or videos. Revisions for other files, like Google Docs or Sheets, and the last remaining file version can't be deleted.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.revisions.get\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a revision's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true\n    },\n    \"list\": {\n     \"id\": \"drive.revisions.list\",\n     \"path\": \"files/{fileId}/revisions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's revisions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of revisions to return per page.\",\n       \"default\": \"200\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"RevisionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.revisions.update\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a revision with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Revision\"\n     },\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"teamdrives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.teamdrives.create\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Deprecated use drives.create instead.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.teamdrives.delete\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deprecated use drives.delete instead.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.teamdrives.get\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Deprecated use drives.get instead.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.teamdrives.list\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Deprecated use drives.list instead.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of Team Drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then all Team Drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"TeamDriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.teamdrives.update\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Deprecated use drives.update instead\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  }\n }\n}\n\n"
  },
  {
    "path": "data-raw/old/drive-v3_2020-04-17.json",
    "content": "{\n \"kind\": \"discovery#restDescription\",\n \"etag\": \"\\\"u9GIe6H63LSGq-9_t39K2Zx_EAc/FdQR2PuSNWtGMMUKoNdRc27FezA\\\"\",\n \"discoveryVersion\": \"v1\",\n \"id\": \"drive:v3\",\n \"name\": \"drive\",\n \"version\": \"v3\",\n \"revision\": \"20200417\",\n \"title\": \"Drive API\",\n \"description\": \"Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.\",\n \"ownerDomain\": \"google.com\",\n \"ownerName\": \"Google\",\n \"icons\": {\n  \"x16\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png\",\n  \"x32\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png\"\n },\n \"documentationLink\": \"https://developers.google.com/drive/\",\n \"protocol\": \"rest\",\n \"baseUrl\": \"https://www.googleapis.com/drive/v3/\",\n \"basePath\": \"/drive/v3/\",\n \"rootUrl\": \"https://www.googleapis.com/\",\n \"servicePath\": \"drive/v3/\",\n \"batchPath\": \"batch/drive/v3\",\n \"parameters\": {\n  \"alt\": {\n   \"type\": \"string\",\n   \"description\": \"Data format for the response.\",\n   \"default\": \"json\",\n   \"enum\": [\n    \"json\"\n   ],\n   \"enumDescriptions\": [\n    \"Responses with Content-Type of application/json\"\n   ],\n   \"location\": \"query\"\n  },\n  \"fields\": {\n   \"type\": \"string\",\n   \"description\": \"Selector specifying which fields to include in a partial response.\",\n   \"location\": \"query\"\n  },\n  \"key\": {\n   \"type\": \"string\",\n   \"description\": \"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\",\n   \"location\": \"query\"\n  },\n  \"oauth_token\": {\n   \"type\": \"string\",\n   \"description\": \"OAuth 2.0 token for the current user.\",\n   \"location\": \"query\"\n  },\n  \"prettyPrint\": {\n   \"type\": \"boolean\",\n   \"description\": \"Returns response with indentations and line breaks.\",\n   \"default\": \"true\",\n   \"location\": \"query\"\n  },\n  \"quotaUser\": {\n   \"type\": \"string\",\n   \"description\": \"An opaque string that represents a user for quota purposes. Must not exceed 40 characters.\",\n   \"location\": \"query\"\n  },\n  \"userIp\": {\n   \"type\": \"string\",\n   \"description\": \"Deprecated. Please use quotaUser instead.\",\n   \"location\": \"query\"\n  }\n },\n \"auth\": {\n  \"oauth2\": {\n   \"scopes\": {\n    \"https://www.googleapis.com/auth/drive\": {\n     \"description\": \"See, edit, create, and delete all of your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.appdata\": {\n     \"description\": \"View and manage its own configuration data in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.file\": {\n     \"description\": \"View and manage Google Drive files and folders that you have opened or created with this app\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata\": {\n     \"description\": \"View and manage metadata of files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata.readonly\": {\n     \"description\": \"View metadata for files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.photos.readonly\": {\n     \"description\": \"View the photos, videos and albums in your Google Photos\"\n    },\n    \"https://www.googleapis.com/auth/drive.readonly\": {\n     \"description\": \"See and download all your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.scripts\": {\n     \"description\": \"Modify your Google Apps Script scripts' behavior\"\n    }\n   }\n  }\n },\n \"schemas\": {\n  \"About\": {\n   \"id\": \"About\",\n   \"type\": \"object\",\n   \"description\": \"Information about the user, the user's Drive, and system capabilities.\",\n   \"properties\": {\n    \"appInstalled\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has installed the requesting app.\"\n    },\n    \"canCreateDrives\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user can create shared drives.\"\n    },\n    \"canCreateTeamDrives\": {\n     \"type\": \"boolean\",\n     \"description\": \"Deprecated - use canCreateDrives instead.\"\n    },\n    \"driveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"A list of themes that are supported for shared drives.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"A link to this theme's background image.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"The color of this theme as an RGB hex string.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the theme.\"\n       }\n      }\n     }\n    },\n    \"exportFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported exports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"folderColorPalette\": {\n     \"type\": \"array\",\n     \"description\": \"The currently supported folder colors as RGB hex strings.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"importFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported imports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#about\\\".\",\n     \"default\": \"drive#about\"\n    },\n    \"maxImportSizes\": {\n     \"type\": \"object\",\n     \"description\": \"A map of maximum import sizes by MIME type, in bytes.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"format\": \"int64\"\n     }\n    },\n    \"maxUploadSize\": {\n     \"type\": \"string\",\n     \"description\": \"The maximum upload size in bytes.\",\n     \"format\": \"int64\"\n    },\n    \"storageQuota\": {\n     \"type\": \"object\",\n     \"description\": \"The user's storage quota limits and usage. All fields are measured in bytes.\",\n     \"properties\": {\n      \"limit\": {\n       \"type\": \"string\",\n       \"description\": \"The usage limit, if applicable. This will not be present if the user has unlimited storage.\",\n       \"format\": \"int64\"\n      },\n      \"usage\": {\n       \"type\": \"string\",\n       \"description\": \"The total usage across all services.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDrive\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by all files in Google Drive.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDriveTrash\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by trashed files in Google Drive.\",\n       \"format\": \"int64\"\n      }\n     }\n    },\n    \"teamDriveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"Deprecated - use driveThemes instead.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/backgroundImageLink instead.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/colorRgb instead.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/id instead.\"\n       }\n      }\n     }\n    },\n    \"user\": {\n     \"$ref\": \"User\",\n     \"description\": \"The authenticated user.\"\n    }\n   }\n  },\n  \"Change\": {\n   \"id\": \"Change\",\n   \"type\": \"object\",\n   \"description\": \"A change to a file or shared drive.\",\n   \"properties\": {\n    \"changeType\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the change. Possible values are file and drive.\"\n    },\n    \"drive\": {\n     \"$ref\": \"Drive\",\n     \"description\": \"The updated state of the shared drive. Present if the changeType is drive, the user is still a member of the shared drive, and the shared drive has not been deleted.\"\n    },\n    \"driveId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the shared drive associated with this change.\"\n    },\n    \"file\": {\n     \"$ref\": \"File\",\n     \"description\": \"The updated state of the file. Present if the type is file and the file has not been removed from this list of changes.\"\n    },\n    \"fileId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file which has changed.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#change\\\".\",\n     \"default\": \"drive#change\"\n    },\n    \"removed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file or shared drive has been removed from this list of changes, for example by deletion or loss of access.\"\n    },\n    \"teamDrive\": {\n     \"$ref\": \"TeamDrive\",\n     \"description\": \"Deprecated - use drive instead.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use driveId instead.\"\n    },\n    \"time\": {\n     \"type\": \"string\",\n     \"description\": \"The time of this change (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use changeType instead.\"\n    }\n   }\n  },\n  \"ChangeList\": {\n   \"id\": \"ChangeList\",\n   \"type\": \"object\",\n   \"description\": \"A list of changes for a user.\",\n   \"properties\": {\n    \"changes\": {\n     \"type\": \"array\",\n     \"description\": \"The list of changes. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Change\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#changeList\\\".\",\n     \"default\": \"drive#changeList\"\n    },\n    \"newStartPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for future changes. This will be present only if the end of the current changes list has been reached.\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of changes. This will be absent if the end of the changes list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"Channel\": {\n   \"id\": \"Channel\",\n   \"type\": \"object\",\n   \"description\": \"An notification channel used to watch for resource changes.\",\n   \"properties\": {\n    \"address\": {\n     \"type\": \"string\",\n     \"description\": \"The address where notifications are delivered for this channel.\"\n    },\n    \"expiration\": {\n     \"type\": \"string\",\n     \"description\": \"Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.\",\n     \"format\": \"int64\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"A UUID or similar unique string that identifies this channel.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies this as a notification channel used to watch for changes to a resource, which is \\\"api#channel\\\".\",\n     \"default\": \"api#channel\"\n    },\n    \"params\": {\n     \"type\": \"object\",\n     \"description\": \"Additional parameters controlling delivery channel behavior. Optional.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"Declares a new parameter by name.\"\n     }\n    },\n    \"payload\": {\n     \"type\": \"boolean\",\n     \"description\": \"A Boolean value to indicate whether payload is wanted. Optional.\"\n    },\n    \"resourceId\": {\n     \"type\": \"string\",\n     \"description\": \"An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.\"\n    },\n    \"resourceUri\": {\n     \"type\": \"string\",\n     \"description\": \"A version-specific identifier for the watched resource.\"\n    },\n    \"token\": {\n     \"type\": \"string\",\n     \"description\": \"An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of delivery mechanism used for this channel.\"\n    }\n   }\n  },\n  \"Comment\": {\n   \"id\": \"Comment\",\n   \"type\": \"object\",\n   \"description\": \"A comment on a file.\",\n   \"properties\": {\n    \"anchor\": {\n     \"type\": \"string\",\n     \"description\": \"A region of the document represented as a JSON string. See anchor documentation for details on how to define and interpret anchor properties.\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The author of the comment. The author's email address and permission ID will not be populated.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the comment. This field is used for setting the content, while htmlContent should be displayed.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.comments.create\",\n       \"drive.comments.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the comment was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been deleted. A deleted comment has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the comment with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the comment.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#comment\\\".\",\n     \"default\": \"drive#comment\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the comment or any of its replies was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"quotedFileContent\": {\n     \"type\": \"object\",\n     \"description\": \"The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.\",\n     \"properties\": {\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the quoted content.\"\n      },\n      \"value\": {\n       \"type\": \"string\",\n       \"description\": \"The quoted content itself. This is interpreted as plain text if set through the API.\"\n      }\n     }\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of replies to the comment in chronological order.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    },\n    \"resolved\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been resolved by one of its replies.\"\n    }\n   }\n  },\n  \"CommentList\": {\n   \"id\": \"CommentList\",\n   \"type\": \"object\",\n   \"description\": \"A list of comments on a file.\",\n   \"properties\": {\n    \"comments\": {\n     \"type\": \"array\",\n     \"description\": \"The list of comments. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Comment\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#commentList\\\".\",\n     \"default\": \"drive#commentList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of comments. This will be absent if the end of the comments list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"Drive\": {\n   \"id\": \"Drive\",\n   \"type\": \"object\",\n   \"description\": \"Representation of a shared drive.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this shared drive is set. This is a write only field; it can only be set on drive.drives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Google Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this shared drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this shared drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this shared drive.\"\n      },\n      \"canChangeCopyRequiresWriterPermissionRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this shared drive.\"\n      },\n      \"canChangeDomainUsersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the domainUsersOnly restriction of this shared drive.\"\n      },\n      \"canChangeDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this shared drive.\"\n      },\n      \"canChangeDriveMembersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the driveMembersOnly restriction of this shared drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this shared drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this shared drive.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children from folders in this shared drive.\"\n      },\n      \"canDeleteDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this shared drive. Attempting to delete the shared drive may still fail if there are untrashed items inside the shared drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this shared drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this shared drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this shared drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this shared drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this shared drive.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this shared drive.\"\n      },\n      \"canRenameDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this shared drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this shared drive.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children from folders in this shared drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this shared drive as an RGB hex string. It can only be set on a drive.drives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the shared drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"hidden\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the shared drive is hidden from default view.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this shared drive which is also the ID of the top level folder of this shared drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#drive\\\".\",\n     \"default\": \"drive#drive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this shared drive.\"\n    },\n    \"restrictions\": {\n     \"type\": \"object\",\n     \"description\": \"A set of restrictions that apply to this shared drive or items inside this shared drive.\",\n     \"properties\": {\n      \"adminManagedRestrictions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether administrative privileges on this shared drive are required to modify restrictions.\"\n      },\n      \"copyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the options to copy, print, or download files inside this shared drive, should be disabled for readers and commenters. When this restriction is set to true, it will override the similarly named field to true for any file inside this shared drive.\"\n      },\n      \"domainUsersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to this shared drive and items inside this shared drive is restricted to users of the domain to which this shared drive belongs. This restriction may be overridden by other sharing policies controlled outside of this shared drive.\"\n      },\n      \"driveMembersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to items inside this shared drive is restricted to its members.\"\n      }\n     }\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible driveThemes can be retrieved from a drive.about.get response. When not specified on a drive.drives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"DriveList\": {\n   \"id\": \"DriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of shared drives.\",\n   \"properties\": {\n    \"drives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of shared drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Drive\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#driveList\\\".\",\n     \"default\": \"drive#driveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of shared drives. This will be absent if the end of the list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"File\": {\n   \"id\": \"File\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a file.\",\n   \"properties\": {\n    \"appProperties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to this folder. This is always false when the item is not a folder.\"\n      },\n      \"canAddMyDriveParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add a parent for the item without removing an existing parent in the same request. Not populated for shared drive files.\"\n      },\n      \"canChangeCopyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this file.\"\n      },\n      \"canChangeViewersCanCopyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on this file.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy this file. For an item in a shared drive, whether the current user can copy non-folder descendants of this item, or this item itself if it is not a folder.\"\n      },\n      \"canDelete\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this file.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children of this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download this file.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit this file. Other factors may limit the type of changes a user can make to a file. For example, see canChangeCopyRequiresWriterPermission or canModifyContent.\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of this folder. This is always false when the item is not a folder.\"\n      },\n      \"canModifyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the content of this file.\"\n      },\n      \"canMoveChildrenOutOfDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder outside of the shared drive. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canMoveChildrenOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveChildrenOutOfDrive instead.\"\n      },\n      \"canMoveChildrenWithinDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder within the shared drive. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canMoveChildrenWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveChildrenWithinDrive instead.\"\n      },\n      \"canMoveItemIntoTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemOutOfDrive instead.\"\n      },\n      \"canMoveItemOutOfDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item outside of this drive by changing its parent. Note that a request to change the parent of the item may still fail depending on the new parent that is being added.\"\n      },\n      \"canMoveItemOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemOutOfDrive instead.\"\n      },\n      \"canMoveItemWithinDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item within this shared drive. Note that a request to change the parent of the item may still fail depending on the new parent that is being added. Only populated for items in shared drives.\"\n      },\n      \"canMoveItemWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemWithinDrive instead.\"\n      },\n      \"canMoveTeamDriveItem\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemWithinDrive or canMoveItemOutOfDrive instead.\"\n      },\n      \"canReadDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the shared drive to which this file belongs. Only populated for items in shared drives.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of this file. For a shared drive item, whether revisions of non-folder descendants of this item, or this item itself if it is not a folder, can be read.\"\n      },\n      \"canReadTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canReadDrive instead.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove children from this folder. This is always false when the item is not a folder. For a folder in a shared drive, use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRemoveMyDriveParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove a parent from the item without adding another parent in the same request. Not populated for shared drive files.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this file.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the sharing settings for this file.\"\n      },\n      \"canTrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this file to trash.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children of this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canUntrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can restore this file from trash.\"\n      }\n     }\n    },\n    \"contentHints\": {\n     \"type\": \"object\",\n     \"description\": \"Additional information about the content of the file. These fields are never populated in responses.\",\n     \"properties\": {\n      \"indexableText\": {\n       \"type\": \"string\",\n       \"description\": \"Text to be indexed for the file to improve fullText queries. This is limited to 128KB in length and may contain HTML elements.\"\n      },\n      \"thumbnail\": {\n       \"type\": \"object\",\n       \"description\": \"A thumbnail for the file. This will only be used if Google Drive cannot generate a standard thumbnail.\",\n       \"properties\": {\n        \"image\": {\n         \"type\": \"string\",\n         \"description\": \"The thumbnail data encoded with URL-safe Base64 (RFC 4648 section 5).\",\n         \"format\": \"byte\"\n        },\n        \"mimeType\": {\n         \"type\": \"string\",\n         \"description\": \"The MIME type of the thumbnail.\"\n        }\n       }\n      }\n     }\n    },\n    \"copyRequiresWriterPermission\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the options to copy, print, or download this file, should be disabled for readers and commenters.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"description\": {\n     \"type\": \"string\",\n     \"description\": \"A short description of the file.\"\n    },\n    \"driveId\": {\n     \"type\": \"string\",\n     \"description\": \"ID of the shared drive the file resides in. Only populated for items in shared drives.\"\n    },\n    \"explicitlyTrashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"\n    },\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Google Docs to specific formats.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"fileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The final component of fullFileExtension. This is only available for files with binary content in Google Drive.\"\n    },\n    \"folderColorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"\n    },\n    \"fullFileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Google Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"\n    },\n    \"hasAugmentedPermissions\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether there are permissions directly on this file. This field is only populated for items in shared drives.\"\n    },\n    \"hasThumbnail\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"\n    },\n    \"headRevisionId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file's head revision. This is currently only available for files with binary content in Google Drive.\"\n    },\n    \"iconLink\": {\n     \"type\": \"string\",\n     \"description\": \"A static, unauthenticated link to the file's icon.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file.\"\n    },\n    \"imageMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about image media, if available.\",\n     \"properties\": {\n      \"aperture\": {\n       \"type\": \"number\",\n       \"description\": \"The aperture used to create the photo (f-number).\",\n       \"format\": \"float\"\n      },\n      \"cameraMake\": {\n       \"type\": \"string\",\n       \"description\": \"The make of the camera used to create the photo.\"\n      },\n      \"cameraModel\": {\n       \"type\": \"string\",\n       \"description\": \"The model of the camera used to create the photo.\"\n      },\n      \"colorSpace\": {\n       \"type\": \"string\",\n       \"description\": \"The color space of the photo.\"\n      },\n      \"exposureBias\": {\n       \"type\": \"number\",\n       \"description\": \"The exposure bias of the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"exposureMode\": {\n       \"type\": \"string\",\n       \"description\": \"The exposure mode used to create the photo.\"\n      },\n      \"exposureTime\": {\n       \"type\": \"number\",\n       \"description\": \"The length of the exposure, in seconds.\",\n       \"format\": \"float\"\n      },\n      \"flashUsed\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether a flash was used to create the photo.\"\n      },\n      \"focalLength\": {\n       \"type\": \"number\",\n       \"description\": \"The focal length used to create the photo, in millimeters.\",\n       \"format\": \"float\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the image in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"isoSpeed\": {\n       \"type\": \"integer\",\n       \"description\": \"The ISO speed used to create the photo.\",\n       \"format\": \"int32\"\n      },\n      \"lens\": {\n       \"type\": \"string\",\n       \"description\": \"The lens used to create the photo.\"\n      },\n      \"location\": {\n       \"type\": \"object\",\n       \"description\": \"Geographic location information stored in the image.\",\n       \"properties\": {\n        \"altitude\": {\n         \"type\": \"number\",\n         \"description\": \"The altitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"latitude\": {\n         \"type\": \"number\",\n         \"description\": \"The latitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"longitude\": {\n         \"type\": \"number\",\n         \"description\": \"The longitude stored in the image.\",\n         \"format\": \"double\"\n        }\n       }\n      },\n      \"maxApertureValue\": {\n       \"type\": \"number\",\n       \"description\": \"The smallest f-number of the lens at the focal length used to create the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"meteringMode\": {\n       \"type\": \"string\",\n       \"description\": \"The metering mode used to create the photo.\"\n      },\n      \"rotation\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of clockwise 90 degree rotations applied from the image's original orientation.\",\n       \"format\": \"int32\"\n      },\n      \"sensor\": {\n       \"type\": \"string\",\n       \"description\": \"The type of sensor used to create the photo.\"\n      },\n      \"subjectDistance\": {\n       \"type\": \"integer\",\n       \"description\": \"The distance to the subject of the photo, in meters.\",\n       \"format\": \"int32\"\n      },\n      \"time\": {\n       \"type\": \"string\",\n       \"description\": \"The date and time the photo was taken (EXIF DateTime).\"\n      },\n      \"whiteBalance\": {\n       \"type\": \"string\",\n       \"description\": \"The white balance mode used to create the photo.\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the image in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"isAppAuthorized\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file was created or opened by the requesting app.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\",\n     \"default\": \"drive#file\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify the file.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Google Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the file.\\nGoogle Drive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"\n    },\n    \"modifiedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been modified by this user.\"\n    },\n    \"modifiedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\",\n     \"format\": \"date-time\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of shared drives, My Drive root folder, and Application Data folder the name is constant.\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Google Drive.\"\n    },\n    \"ownedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user owns the file. Not populated for items in shared drives.\"\n    },\n    \"owners\": {\n     \"type\": \"array\",\n     \"description\": \"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for items in shared drives.\",\n     \"items\": {\n      \"$ref\": \"User\"\n     }\n    },\n    \"parents\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the user's My Drive folder. If not specified as part of a copy request, the file will inherit any discoverable parents of the source file. Update requests must use the addParents and removeParents parameters to modify the parents list.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissionIds\": {\n     \"type\": \"array\",\n     \"description\": \"List of permission IDs for users with access to this file.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for items in shared drives.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    },\n    \"properties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"quotaBytesUsed\": {\n     \"type\": \"string\",\n     \"description\": \"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\",\n     \"format\": \"int64\"\n    },\n    \"shared\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been shared. Not populated for items in shared drives.\"\n    },\n    \"sharedWithMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"sharingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who shared the file with the requesting user, if applicable.\"\n    },\n    \"shortcutDetails\": {\n     \"type\": \"object\",\n     \"description\": \"Shortcut file details. Only populated for shortcut files, which have the mimeType field set to application/vnd.google-apps.shortcut.\",\n     \"properties\": {\n      \"targetId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file that this shortcut points to.\"\n      },\n      \"targetMimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the file that this shortcut points to. The value of this field is a snapshot of the target's MIME type, captured when the shortcut is created.\"\n      }\n     }\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the file's content in bytes. This is only applicable to files with binary content in Google Drive.\",\n     \"format\": \"int64\"\n    },\n    \"spaces\": {\n     \"type\": \"array\",\n     \"description\": \"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"starred\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has starred the file.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use driveId instead.\"\n    },\n    \"thumbnailLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content.\"\n    },\n    \"thumbnailVersion\": {\n     \"type\": \"string\",\n     \"description\": \"The thumbnail version for use in thumbnail cache invalidation.\",\n     \"format\": \"int64\"\n    },\n    \"trashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"\n    },\n    \"trashedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time that the item was trashed (RFC 3339 date-time). Only populated for items in shared drives.\",\n     \"format\": \"date-time\"\n    },\n    \"trashingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"If the file has been explicitly trashed, the user who trashed it. Only populated for items in shared drives.\"\n    },\n    \"version\": {\n     \"type\": \"string\",\n     \"description\": \"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\",\n     \"format\": \"int64\"\n    },\n    \"videoMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about video media. This may not be available immediately upon upload.\",\n     \"properties\": {\n      \"durationMillis\": {\n       \"type\": \"string\",\n       \"description\": \"The duration of the video in milliseconds.\",\n       \"format\": \"int64\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the video in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the video in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"viewedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been viewed by this user.\"\n    },\n    \"viewedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was viewed by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"viewersCanCopyContent\": {\n     \"type\": \"boolean\",\n     \"description\": \"Deprecated - use copyRequiresWriterPermission instead.\"\n    },\n    \"webContentLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for downloading the content of the file in a browser. This is only available for files with binary content in Google Drive.\"\n    },\n    \"webViewLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for opening the file in a relevant Google editor or viewer in a browser.\"\n    },\n    \"writersCanShare\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether users with only writer permission can modify the file's permissions. Not populated for items in shared drives.\"\n    }\n   }\n  },\n  \"FileList\": {\n   \"id\": \"FileList\",\n   \"type\": \"object\",\n   \"description\": \"A list of files.\",\n   \"properties\": {\n    \"files\": {\n     \"type\": \"array\",\n     \"description\": \"The list of files. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"File\"\n     }\n    },\n    \"incompleteSearch\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the search process was incomplete. If true, then some search results may be missing, since all documents were not searched. This may occur when searching multiple drives with the \\\"allDrives\\\" corpora, but all corpora could not be searched. When this happens, it is suggested that clients narrow their query by choosing a different corpus such as \\\"user\\\" or \\\"drive\\\".\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#fileList\\\".\",\n     \"default\": \"drive#fileList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of files. This will be absent if the end of the files list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"GeneratedIds\": {\n   \"id\": \"GeneratedIds\",\n   \"type\": \"object\",\n   \"description\": \"A list of generated file IDs which can be provided in create requests.\",\n   \"properties\": {\n    \"ids\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs generated for the requesting user in the specified space.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#generatedIds\\\".\",\n     \"default\": \"drive#generatedIds\"\n    },\n    \"space\": {\n     \"type\": \"string\",\n     \"description\": \"The type of file that can be created with these IDs.\"\n    }\n   }\n  },\n  \"Permission\": {\n   \"id\": \"Permission\",\n   \"type\": \"object\",\n   \"description\": \"A permission for a file. A permission grants a user, group, domain or the world access to a file or a folder hierarchy.\",\n   \"properties\": {\n    \"allowFileDiscovery\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"\n    },\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"The \\\"pretty\\\" name of the value of the permission. The following is a list of examples for each type of permission:  \\n- user - User's full name, as defined for their Google account, such as \\\"Joe Smith.\\\" \\n- group - Name of the Google Group, such as \\\"The Company Administrators.\\\" \\n- domain - String domain name, such as \\\"thecompany.com.\\\" \\n- anyone - No displayName is present.\"\n    },\n    \"domain\": {\n     \"type\": \"string\",\n     \"description\": \"The domain to which this permission refers.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user or group to which this permission refers.\"\n    },\n    \"expirationTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId. IDs should be treated as opaque values.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\",\n     \"default\": \"drive#permission\"\n    },\n    \"permissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Details of whether the permissions on this shared drive item are inherited or directly on this item. This is an output-only field which is present only for shared drive items.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Whether this permission is inherited. This field is always populated. This is an output-only field.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the item from which this permission is inherited. This is an output-only field.\"\n       },\n       \"permissionType\": {\n        \"type\": \"string\",\n        \"description\": \"The permission type for this user. While new values may be added in future, the following are currently possible:  \\n- file \\n- member\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"The primary role for this user. While new values may be added in the future, the following are currently possible:  \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\"\n       }\n      }\n     }\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    },\n    \"role\": {\n     \"type\": \"string\",\n     \"description\": \"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- owner \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    },\n    \"teamDrivePermissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Deprecated - use permissionDetails instead.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Deprecated - use permissionDetails/inherited instead.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/inheritedFrom instead.\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/role instead.\"\n       },\n       \"teamDrivePermissionType\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/permissionType instead.\"\n       }\n      }\n     }\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone  When creating a permission, if type is user or group, you must provide an emailAddress for the user or group. When type is domain, you must provide a domain. There isn't extra information required for a anyone type.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    }\n   }\n  },\n  \"PermissionList\": {\n   \"id\": \"PermissionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of permissions for a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permissionList\\\".\",\n     \"default\": \"drive#permissionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of permissions. This field will be absent if the end of the permissions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of permissions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    }\n   }\n  },\n  \"Reply\": {\n   \"id\": \"Reply\",\n   \"type\": \"object\",\n   \"description\": \"A reply to a comment on a file.\",\n   \"properties\": {\n    \"action\": {\n     \"type\": \"string\",\n     \"description\": \"The action the reply performed to the parent comment. Valid values are:  \\n- resolve \\n- reopen\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The author of the reply. The author's email address and permission ID will not be populated.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the reply. This field is used for setting the content, while htmlContent should be displayed. This is required on creates if no action is specified.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.replies.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the reply was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the reply has been deleted. A deleted reply has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the reply with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the reply.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#reply\\\".\",\n     \"default\": \"drive#reply\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the reply was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    }\n   }\n  },\n  \"ReplyList\": {\n   \"id\": \"ReplyList\",\n   \"type\": \"object\",\n   \"description\": \"A list of replies to a comment on a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#replyList\\\".\",\n     \"default\": \"drive#replyList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of replies. This will be absent if the end of the replies list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The list of replies. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    }\n   }\n  },\n  \"Revision\": {\n   \"id\": \"Revision\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a revision to a file.\",\n   \"properties\": {\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Google Docs to specific formats.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the revision.\"\n    },\n    \"keepForever\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\",\n     \"default\": \"drive#revision\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify this revision.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the revision.\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the revision was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"\n    },\n    \"publishAuto\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether subsequent revisions will be automatically republished. This is only applicable to Google Docs.\"\n    },\n    \"published\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published. This is only applicable to Google Docs.\"\n    },\n    \"publishedOutsideDomain\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published outside the domain. This is only applicable to Google Docs.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    }\n   }\n  },\n  \"RevisionList\": {\n   \"id\": \"RevisionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of revisions of a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revisionList\\\".\",\n     \"default\": \"drive#revisionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of revisions. This will be absent if the end of the revisions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"revisions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of revisions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Revision\"\n     }\n    }\n   }\n  },\n  \"StartPageToken\": {\n   \"id\": \"StartPageToken\",\n   \"type\": \"object\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#startPageToken\\\".\",\n     \"default\": \"drive#startPageToken\"\n    },\n    \"startPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for listing changes.\"\n    }\n   }\n  },\n  \"TeamDrive\": {\n   \"id\": \"TeamDrive\",\n   \"type\": \"object\",\n   \"description\": \"Deprecated: use the drive collection instead.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this Team Drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this Team Drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this Team Drive.\"\n      },\n      \"canChangeCopyRequiresWriterPermissionRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this Team Drive.\"\n      },\n      \"canChangeDomainUsersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the domainUsersOnly restriction of this Team Drive.\"\n      },\n      \"canChangeTeamDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this Team Drive.\"\n      },\n      \"canChangeTeamMembersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the teamMembersOnly restriction of this Team Drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this Team Drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this Team Drive.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children from folders in this Team Drive.\"\n      },\n      \"canDeleteTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this Team Drive. Attempting to delete the Team Drive may still fail if there are untrashed items inside the Team Drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this Team Drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this Team Drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this Team Drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this Team Drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this Team Drive.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this Team Drive.\"\n      },\n      \"canRenameTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this Team Drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this Team Drive.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children from folders in this Team Drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the Team Drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this Team Drive which is also the ID of the top level folder of this Team Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\",\n     \"default\": \"drive#teamDrive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this Team Drive.\"\n    },\n    \"restrictions\": {\n     \"type\": \"object\",\n     \"description\": \"A set of restrictions that apply to this Team Drive or items inside this Team Drive.\",\n     \"properties\": {\n      \"adminManagedRestrictions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether administrative privileges on this Team Drive are required to modify restrictions.\"\n      },\n      \"copyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the options to copy, print, or download files inside this Team Drive, should be disabled for readers and commenters. When this restriction is set to true, it will override the similarly named field to true for any file inside this Team Drive.\"\n      },\n      \"domainUsersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to this Team Drive and items inside this Team Drive is restricted to users of the domain to which this Team Drive belongs. This restriction may be overridden by other sharing policies controlled outside of this Team Drive.\"\n      },\n      \"teamMembersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to items inside this Team Drive is restricted to members of this Team Drive.\"\n      }\n     }\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"TeamDriveList\": {\n   \"id\": \"TeamDriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of Team Drives.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDriveList\\\".\",\n     \"default\": \"drive#teamDriveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of Team Drives. This will be absent if the end of the Team Drives list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"teamDrives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of Team Drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"TeamDrive\"\n     }\n    }\n   }\n  },\n  \"User\": {\n   \"id\": \"User\",\n   \"type\": \"object\",\n   \"description\": \"Information about a Drive user.\",\n   \"properties\": {\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A plain text displayable name for this user.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#user\\\".\",\n     \"default\": \"drive#user\"\n    },\n    \"me\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this user is the requesting user.\"\n    },\n    \"permissionId\": {\n     \"type\": \"string\",\n     \"description\": \"The user's ID as visible in Permission resources.\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    }\n   }\n  }\n },\n \"resources\": {\n  \"about\": {\n   \"methods\": {\n    \"get\": {\n     \"id\": \"drive.about.get\",\n     \"path\": \"about\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets information about the user, the user's Drive, and system capabilities.\",\n     \"response\": {\n      \"$ref\": \"About\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"changes\": {\n   \"methods\": {\n    \"getStartPageToken\": {\n     \"id\": \"drive.changes.getStartPageToken\",\n     \"path\": \"changes/startPageToken\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets the starting pageToken for listing future changes.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive for which the starting pageToken for listing future changes from that shared drive is returned.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"StartPageToken\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.changes.list\",\n     \"path\": \"changes\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the changes for a user or shared drive.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The shared drive from which changes are returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      },\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether both My Drive and shared drive items should be included in results. This parameter will only be effective until June 1, 2020. Afterwards shared drive items are included in the results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"response\": {\n      \"$ref\": \"ChangeList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    },\n    \"watch\": {\n     \"id\": \"drive.changes.watch\",\n     \"path\": \"changes/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes for a user.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The shared drive from which changes are returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      },\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether both My Drive and shared drive items should be included in results. This parameter will only be effective until June 1, 2020. Afterwards shared drive items are included in the results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"channels\": {\n   \"methods\": {\n    \"stop\": {\n     \"id\": \"drive.channels.stop\",\n     \"path\": \"channels/stop\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Stop watching resources through this channel\",\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"comments\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.comments.create\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new comment on a file.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.comments.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.comments.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a comment by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.comments.list\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's comments.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of comments to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"startModifiedTime\": {\n       \"type\": \"string\",\n       \"description\": \"The minimum value of 'modifiedTime' for the result comments (RFC 3339 date-time).\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"CommentList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.comments.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a comment with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"drives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.drives.create\",\n     \"path\": \"drives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new shared drive.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a shared drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same shared drive. If the shared drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Drive\"\n     },\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.drives.delete\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a shared drive for which the user is an organizer. The shared drive cannot contain any untrashed items.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.drives.get\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a shared drive's metadata by ID.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"hide\": {\n     \"id\": \"drive.drives.hide\",\n     \"path\": \"drives/{driveId}/hide\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Hides a shared drive from the default view.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.drives.list\",\n     \"path\": \"drives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the user's shared drives.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of shared drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for shared drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching shared drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then all shared drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"DriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"unhide\": {\n     \"id\": \"drive.drives.unhide\",\n     \"path\": \"drives/{driveId}/unhide\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Restores a shared drive to the default view.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.drives.update\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates the metadate for a shared drive.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Drive\"\n     },\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  },\n  \"files\": {\n   \"methods\": {\n    \"copy\": {\n     \"id\": \"drive.files.copy\",\n     \"path\": \"files/{fileId}/copy\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a copy of a file and applies any requested updates with patch semantics.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter only takes effect if the item is not in a shared drive. Requests that specify more than one parent fail.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\"\n     ]\n    },\n    \"create\": {\n     \"id\": \"drive.files.create\",\n     \"path\": \"files\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new file.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter only takes effect if the item is not in a shared drive. Requests that specify more than one parent fail.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files\"\n       }\n      }\n     },\n     \"supportsSubscription\": true\n    },\n    \"delete\": {\n     \"id\": \"drive.files.delete\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a shared drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"emptyTrash\": {\n     \"id\": \"drive.files.emptyTrash\",\n     \"path\": \"files/trash\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes all of the user's trashed files.\",\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"export\": {\n     \"id\": \"drive.files.export\",\n     \"path\": \"files/{fileId}/export\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the format requested for this export.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"mimeType\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true\n    },\n    \"generateIds\": {\n     \"id\": \"drive.files.generateIds\",\n     \"path\": \"files/generateIds\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Generates a set of file IDs which can be provided in create or copy requests.\",\n     \"parameters\": {\n      \"count\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of IDs to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"space\": {\n       \"type\": \"string\",\n       \"description\": \"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"GeneratedIds\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.files.get\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a file's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    },\n    \"list\": {\n     \"id\": \"drive.files.list\",\n     \"path\": \"files\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists or searches files.\",\n     \"parameters\": {\n      \"corpora\": {\n       \"type\": \"string\",\n       \"description\": \"Bodies of items (files/documents) to which the query applies. Supported bodies are 'user', 'domain', 'drive' and 'allDrives'. Prefer 'user' or 'drive' to 'allDrives' for efficiency.\",\n       \"location\": \"query\"\n      },\n      \"corpus\": {\n       \"type\": \"string\",\n       \"description\": \"The source of files to list. Deprecated: use 'corpora' instead.\",\n       \"enum\": [\n        \"domain\",\n        \"user\"\n       ],\n       \"enumDescriptions\": [\n        \"Files shared to the user's domain.\",\n        \"Files owned by or shared to the user.\"\n       ],\n       \"location\": \"query\"\n      },\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"ID of the shared drive to search.\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether both My Drive and shared drive items should be included in results. This parameter will only be effective until June 1, 2020. Afterwards shared drive items are included in the results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"orderBy\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"FileList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.files.update\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a file's metadata and/or content with patch semantics.\",\n     \"parameters\": {\n      \"addParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to add.\",\n       \"location\": \"query\"\n      },\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter only takes effect if the item is not in a shared drive. If the item's owner makes a request to add a single parent, the item is removed from all current folders and placed in the requested folder. Other requests that increase the number of parents fail, except when the canAddMyDriveParent file capability is true and a single parent is being added.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"removeParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to remove.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.scripts\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files/{fileId}\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files/{fileId}\"\n       }\n      }\n     }\n    },\n    \"watch\": {\n     \"id\": \"drive.files.watch\",\n     \"path\": \"files/{fileId}/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes to a file\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"permissions\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.permissions.create\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a permission for a file or shared drive.\",\n     \"parameters\": {\n      \"emailMessage\": {\n       \"type\": \"string\",\n       \"description\": \"A plain text custom message to include in the notification email.\",\n       \"location\": \"query\"\n      },\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Set to true to opt in to API behavior that aims for all items to have exactly one parent. This parameter only takes effect if the item is not in a shared drive. See moveToNewOwnersRoot for details.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"moveToNewOwnersRoot\": {\n       \"type\": \"boolean\",\n       \"description\": \"This parameter only takes effect if the item is not in a shared drive and the request is attempting to transfer the ownership of the item. When set to true, the item is moved to the new owner's My Drive root folder and all prior parents removed. If set to false, when enforceSingleParent=true, parents are not changed. If set to false, when enforceSingleParent=false, existing parents are not changed; however, the file will be added to the new owner's My Drive root folder, unless it is already in the new owner's My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"sendNotificationEmail\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.permissions.delete\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a permission.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.permissions.get\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a permission by ID.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.permissions.list\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's or shared drive's permissions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of permissions to return per page. When not set for files in a shared drive, at most 100 results will be returned. When not set for files that are not in a shared drive, the entire list will be returned.\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"PermissionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.permissions.update\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a permission with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"removeExpiration\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to remove the expiration date.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - Whether the requesting application supports both My Drives and shared drives. This parameter will only be effective until June 1, 2020. Afterwards all applications are assumed to support shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"replies\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.replies.create\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new reply to a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.replies.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a reply.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.replies.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a reply by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.replies.list\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a comment's replies.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of replies to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"ReplyList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.replies.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a reply with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"revisions\": {\n   \"methods\": {\n    \"delete\": {\n     \"id\": \"drive.revisions.delete\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file version. You can only delete revisions for files with binary content in Google Drive, like images or videos. Revisions for other files, like Google Docs or Sheets, and the last remaining file version can't be deleted.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.revisions.get\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a revision's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true\n    },\n    \"list\": {\n     \"id\": \"drive.revisions.list\",\n     \"path\": \"files/{fileId}/revisions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's revisions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of revisions to return per page.\",\n       \"default\": \"200\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"RevisionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.revisions.update\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a revision with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Revision\"\n     },\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"teamdrives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.teamdrives.create\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Deprecated use drives.create instead.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.teamdrives.delete\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deprecated use drives.delete instead.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.teamdrives.get\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Deprecated use drives.get instead.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.teamdrives.list\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Deprecated use drives.list instead.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of Team Drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then all Team Drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"TeamDriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.teamdrives.update\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Deprecated use drives.update instead\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  }\n }\n}\n\n"
  },
  {
    "path": "data-raw/old/drive-v3_2021-03-22.json",
    "content": "{\n \"kind\": \"discovery#restDescription\",\n \"etag\": \"\\\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/Nyk9QooT1-WBB03Ilrr_sA6IsJk\\\"\",\n \"discoveryVersion\": \"v1\",\n \"id\": \"drive:v3\",\n \"name\": \"drive\",\n \"version\": \"v3\",\n \"revision\": \"20210322\",\n \"title\": \"Drive API\",\n \"description\": \"Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.\",\n \"ownerDomain\": \"google.com\",\n \"ownerName\": \"Google\",\n \"icons\": {\n  \"x16\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png\",\n  \"x32\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png\"\n },\n \"documentationLink\": \"https://developers.google.com/drive/\",\n \"protocol\": \"rest\",\n \"baseUrl\": \"https://www.googleapis.com/drive/v3/\",\n \"basePath\": \"/drive/v3/\",\n \"rootUrl\": \"https://www.googleapis.com/\",\n \"servicePath\": \"drive/v3/\",\n \"batchPath\": \"batch/drive/v3\",\n \"parameters\": {\n  \"alt\": {\n   \"type\": \"string\",\n   \"description\": \"Data format for the response.\",\n   \"default\": \"json\",\n   \"enum\": [\n    \"json\"\n   ],\n   \"enumDescriptions\": [\n    \"Responses with Content-Type of application/json\"\n   ],\n   \"location\": \"query\"\n  },\n  \"fields\": {\n   \"type\": \"string\",\n   \"description\": \"Selector specifying which fields to include in a partial response.\",\n   \"location\": \"query\"\n  },\n  \"key\": {\n   \"type\": \"string\",\n   \"description\": \"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\",\n   \"location\": \"query\"\n  },\n  \"oauth_token\": {\n   \"type\": \"string\",\n   \"description\": \"OAuth 2.0 token for the current user.\",\n   \"location\": \"query\"\n  },\n  \"prettyPrint\": {\n   \"type\": \"boolean\",\n   \"description\": \"Returns response with indentations and line breaks.\",\n   \"default\": \"true\",\n   \"location\": \"query\"\n  },\n  \"quotaUser\": {\n   \"type\": \"string\",\n   \"description\": \"An opaque string that represents a user for quota purposes. Must not exceed 40 characters.\",\n   \"location\": \"query\"\n  },\n  \"userIp\": {\n   \"type\": \"string\",\n   \"description\": \"Deprecated. Please use quotaUser instead.\",\n   \"location\": \"query\"\n  }\n },\n \"auth\": {\n  \"oauth2\": {\n   \"scopes\": {\n    \"https://www.googleapis.com/auth/drive\": {\n     \"description\": \"See, edit, create, and delete all of your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.appdata\": {\n     \"description\": \"See, create, and delete its own configuration data in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.file\": {\n     \"description\": \"See, edit, create, and delete only the specific Google Drive files you use with this app\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata\": {\n     \"description\": \"View and manage metadata of files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata.readonly\": {\n     \"description\": \"See information about your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.photos.readonly\": {\n     \"description\": \"View the photos, videos and albums in your Google Photos\"\n    },\n    \"https://www.googleapis.com/auth/drive.readonly\": {\n     \"description\": \"See and download all your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.scripts\": {\n     \"description\": \"Modify your Google Apps Script scripts' behavior\"\n    }\n   }\n  }\n },\n \"schemas\": {\n  \"About\": {\n   \"id\": \"About\",\n   \"type\": \"object\",\n   \"description\": \"Information about the user, the user's Drive, and system capabilities.\",\n   \"properties\": {\n    \"appInstalled\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has installed the requesting app.\"\n    },\n    \"canCreateDrives\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user can create shared drives.\"\n    },\n    \"canCreateTeamDrives\": {\n     \"type\": \"boolean\",\n     \"description\": \"Deprecated - use canCreateDrives instead.\"\n    },\n    \"driveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"A list of themes that are supported for shared drives.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"A link to this theme's background image.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"The color of this theme as an RGB hex string.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the theme.\"\n       }\n      }\n     }\n    },\n    \"exportFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported exports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"folderColorPalette\": {\n     \"type\": \"array\",\n     \"description\": \"The currently supported folder colors as RGB hex strings.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"importFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported imports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#about\\\".\",\n     \"default\": \"drive#about\"\n    },\n    \"maxImportSizes\": {\n     \"type\": \"object\",\n     \"description\": \"A map of maximum import sizes by MIME type, in bytes.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"format\": \"int64\"\n     }\n    },\n    \"maxUploadSize\": {\n     \"type\": \"string\",\n     \"description\": \"The maximum upload size in bytes.\",\n     \"format\": \"int64\"\n    },\n    \"storageQuota\": {\n     \"type\": \"object\",\n     \"description\": \"The user's storage quota limits and usage. All fields are measured in bytes.\",\n     \"properties\": {\n      \"limit\": {\n       \"type\": \"string\",\n       \"description\": \"The usage limit, if applicable. This will not be present if the user has unlimited storage.\",\n       \"format\": \"int64\"\n      },\n      \"usage\": {\n       \"type\": \"string\",\n       \"description\": \"The total usage across all services.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDrive\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by all files in Google Drive.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDriveTrash\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by trashed files in Google Drive.\",\n       \"format\": \"int64\"\n      }\n     }\n    },\n    \"teamDriveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"Deprecated - use driveThemes instead.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/backgroundImageLink instead.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/colorRgb instead.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/id instead.\"\n       }\n      }\n     }\n    },\n    \"user\": {\n     \"$ref\": \"User\",\n     \"description\": \"The authenticated user.\"\n    }\n   }\n  },\n  \"Change\": {\n   \"id\": \"Change\",\n   \"type\": \"object\",\n   \"description\": \"A change to a file or shared drive.\",\n   \"properties\": {\n    \"changeType\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the change. Possible values are file and drive.\"\n    },\n    \"drive\": {\n     \"$ref\": \"Drive\",\n     \"description\": \"The updated state of the shared drive. Present if the changeType is drive, the user is still a member of the shared drive, and the shared drive has not been deleted.\"\n    },\n    \"driveId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the shared drive associated with this change.\"\n    },\n    \"file\": {\n     \"$ref\": \"File\",\n     \"description\": \"The updated state of the file. Present if the type is file and the file has not been removed from this list of changes.\"\n    },\n    \"fileId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file which has changed.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#change\\\".\",\n     \"default\": \"drive#change\"\n    },\n    \"removed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file or shared drive has been removed from this list of changes, for example by deletion or loss of access.\"\n    },\n    \"teamDrive\": {\n     \"$ref\": \"TeamDrive\",\n     \"description\": \"Deprecated - use drive instead.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use driveId instead.\"\n    },\n    \"time\": {\n     \"type\": \"string\",\n     \"description\": \"The time of this change (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use changeType instead.\"\n    }\n   }\n  },\n  \"ChangeList\": {\n   \"id\": \"ChangeList\",\n   \"type\": \"object\",\n   \"description\": \"A list of changes for a user.\",\n   \"properties\": {\n    \"changes\": {\n     \"type\": \"array\",\n     \"description\": \"The list of changes. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Change\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#changeList\\\".\",\n     \"default\": \"drive#changeList\"\n    },\n    \"newStartPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for future changes. This will be present only if the end of the current changes list has been reached.\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of changes. This will be absent if the end of the changes list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"Channel\": {\n   \"id\": \"Channel\",\n   \"type\": \"object\",\n   \"description\": \"An notification channel used to watch for resource changes.\",\n   \"properties\": {\n    \"address\": {\n     \"type\": \"string\",\n     \"description\": \"The address where notifications are delivered for this channel.\"\n    },\n    \"expiration\": {\n     \"type\": \"string\",\n     \"description\": \"Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.\",\n     \"format\": \"int64\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"A UUID or similar unique string that identifies this channel.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies this as a notification channel used to watch for changes to a resource, which is \\\"api#channel\\\".\",\n     \"default\": \"api#channel\"\n    },\n    \"params\": {\n     \"type\": \"object\",\n     \"description\": \"Additional parameters controlling delivery channel behavior. Optional.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"Declares a new parameter by name.\"\n     }\n    },\n    \"payload\": {\n     \"type\": \"boolean\",\n     \"description\": \"A Boolean value to indicate whether payload is wanted. Optional.\"\n    },\n    \"resourceId\": {\n     \"type\": \"string\",\n     \"description\": \"An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.\"\n    },\n    \"resourceUri\": {\n     \"type\": \"string\",\n     \"description\": \"A version-specific identifier for the watched resource.\"\n    },\n    \"token\": {\n     \"type\": \"string\",\n     \"description\": \"An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of delivery mechanism used for this channel. Valid values are \\\"web_hook\\\" (or \\\"webhook\\\"). Both values refer to a channel where Http requests are used to deliver messages.\"\n    }\n   }\n  },\n  \"Comment\": {\n   \"id\": \"Comment\",\n   \"type\": \"object\",\n   \"description\": \"A comment on a file.\",\n   \"properties\": {\n    \"anchor\": {\n     \"type\": \"string\",\n     \"description\": \"A region of the document represented as a JSON string. See anchor documentation for details on how to define and interpret anchor properties.\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The author of the comment. The author's email address and permission ID will not be populated.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the comment. This field is used for setting the content, while htmlContent should be displayed.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.comments.create\",\n       \"drive.comments.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the comment was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been deleted. A deleted comment has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the comment with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the comment.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#comment\\\".\",\n     \"default\": \"drive#comment\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the comment or any of its replies was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"quotedFileContent\": {\n     \"type\": \"object\",\n     \"description\": \"The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.\",\n     \"properties\": {\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the quoted content.\"\n      },\n      \"value\": {\n       \"type\": \"string\",\n       \"description\": \"The quoted content itself. This is interpreted as plain text if set through the API.\"\n      }\n     }\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of replies to the comment in chronological order.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    },\n    \"resolved\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been resolved by one of its replies.\"\n    }\n   }\n  },\n  \"CommentList\": {\n   \"id\": \"CommentList\",\n   \"type\": \"object\",\n   \"description\": \"A list of comments on a file.\",\n   \"properties\": {\n    \"comments\": {\n     \"type\": \"array\",\n     \"description\": \"The list of comments. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Comment\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#commentList\\\".\",\n     \"default\": \"drive#commentList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of comments. This will be absent if the end of the comments list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"ContentRestriction\": {\n   \"id\": \"ContentRestriction\",\n   \"type\": \"object\",\n   \"description\": \"A restriction for accessing the content of the file.\",\n   \"properties\": {\n    \"readOnly\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the content of the file is read-only. If a file is read-only, a new revision of the file may not be added, comments may not be added or modified, and the title of the file may not be modified.\"\n    },\n    \"reason\": {\n     \"type\": \"string\",\n     \"description\": \"Reason for why the content of the file is restricted. This is only mutable on requests that also set readOnly=true.\"\n    },\n    \"restrictingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who set the content restriction. Only populated if readOnly is true.\"\n    },\n    \"restrictionTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the content restriction was set (formatted RFC 3339 timestamp). Only populated if readOnly is true.\",\n     \"format\": \"date-time\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the content restriction. Currently the only possible value is globalContentRestriction.\"\n    }\n   }\n  },\n  \"Drive\": {\n   \"id\": \"Drive\",\n   \"type\": \"object\",\n   \"description\": \"Representation of a shared drive.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this shared drive is set. This is a write only field; it can only be set on drive.drives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Google Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this shared drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this shared drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this shared drive.\"\n      },\n      \"canChangeCopyRequiresWriterPermissionRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this shared drive.\"\n      },\n      \"canChangeDomainUsersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the domainUsersOnly restriction of this shared drive.\"\n      },\n      \"canChangeDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this shared drive.\"\n      },\n      \"canChangeDriveMembersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the driveMembersOnly restriction of this shared drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this shared drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this shared drive.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children from folders in this shared drive.\"\n      },\n      \"canDeleteDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this shared drive. Attempting to delete the shared drive may still fail if there are untrashed items inside the shared drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this shared drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this shared drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this shared drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this shared drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this shared drive.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this shared drive.\"\n      },\n      \"canRenameDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this shared drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this shared drive.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children from folders in this shared drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this shared drive as an RGB hex string. It can only be set on a drive.drives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the shared drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"hidden\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the shared drive is hidden from default view.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this shared drive which is also the ID of the top level folder of this shared drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#drive\\\".\",\n     \"default\": \"drive#drive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this shared drive.\"\n    },\n    \"restrictions\": {\n     \"type\": \"object\",\n     \"description\": \"A set of restrictions that apply to this shared drive or items inside this shared drive.\",\n     \"properties\": {\n      \"adminManagedRestrictions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether administrative privileges on this shared drive are required to modify restrictions.\"\n      },\n      \"copyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the options to copy, print, or download files inside this shared drive, should be disabled for readers and commenters. When this restriction is set to true, it will override the similarly named field to true for any file inside this shared drive.\"\n      },\n      \"domainUsersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to this shared drive and items inside this shared drive is restricted to users of the domain to which this shared drive belongs. This restriction may be overridden by other sharing policies controlled outside of this shared drive.\"\n      },\n      \"driveMembersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to items inside this shared drive is restricted to its members.\"\n      }\n     }\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible driveThemes can be retrieved from a drive.about.get response. When not specified on a drive.drives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"DriveList\": {\n   \"id\": \"DriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of shared drives.\",\n   \"properties\": {\n    \"drives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of shared drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Drive\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#driveList\\\".\",\n     \"default\": \"drive#driveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of shared drives. This will be absent if the end of the list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"File\": {\n   \"id\": \"File\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a file.\",\n   \"properties\": {\n    \"appProperties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests. These properties can only be retrieved using an authenticated request. An authenticated request uses an access token obtained with a OAuth 2 client ID. You cannot use an API key to retrieve private properties.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to this folder. This is always false when the item is not a folder.\"\n      },\n      \"canAddFolderFromAnotherDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add a folder from another drive (different shared drive or My Drive) to this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canAddMyDriveParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add a parent for the item without removing an existing parent in the same request. Not populated for shared drive files.\"\n      },\n      \"canChangeCopyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this file.\"\n      },\n      \"canChangeViewersCanCopyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on this file.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy this file. For an item in a shared drive, whether the current user can copy non-folder descendants of this item, or this item itself if it is not a folder.\"\n      },\n      \"canDelete\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this file.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children of this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download this file.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit this file. Other factors may limit the type of changes a user can make to a file. For example, see canChangeCopyRequiresWriterPermission or canModifyContent.\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of this folder. This is always false when the item is not a folder.\"\n      },\n      \"canModifyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the content of this file.\"\n      },\n      \"canModifyContentRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify restrictions on content of this file.\"\n      },\n      \"canMoveChildrenOutOfDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder outside of the shared drive. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canMoveChildrenOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveChildrenOutOfDrive instead.\"\n      },\n      \"canMoveChildrenWithinDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder within this drive. This is false when the item is not a folder. Note that a request to move the child may still fail depending on the current user's access to the child and to the destination folder.\"\n      },\n      \"canMoveChildrenWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveChildrenWithinDrive instead.\"\n      },\n      \"canMoveItemIntoTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemOutOfDrive instead.\"\n      },\n      \"canMoveItemOutOfDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item outside of this drive by changing its parent. Note that a request to change the parent of the item may still fail depending on the new parent that is being added.\"\n      },\n      \"canMoveItemOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemOutOfDrive instead.\"\n      },\n      \"canMoveItemWithinDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item within this drive. Note that a request to change the parent of the item may still fail depending on the new parent that is being added and the parent that is being removed.\"\n      },\n      \"canMoveItemWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemWithinDrive instead.\"\n      },\n      \"canMoveTeamDriveItem\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemWithinDrive or canMoveItemOutOfDrive instead.\"\n      },\n      \"canReadDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the shared drive to which this file belongs. Only populated for items in shared drives.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of this file. For a shared drive item, whether revisions of non-folder descendants of this item, or this item itself if it is not a folder, can be read.\"\n      },\n      \"canReadTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canReadDrive instead.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove children from this folder. This is always false when the item is not a folder. For a folder in a shared drive, use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRemoveMyDriveParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove a parent from the item without adding another parent in the same request. Not populated for shared drive files.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this file.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the sharing settings for this file.\"\n      },\n      \"canTrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this file to trash.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children of this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canUntrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can restore this file from trash.\"\n      }\n     }\n    },\n    \"contentHints\": {\n     \"type\": \"object\",\n     \"description\": \"Additional information about the content of the file. These fields are never populated in responses.\",\n     \"properties\": {\n      \"indexableText\": {\n       \"type\": \"string\",\n       \"description\": \"Text to be indexed for the file to improve fullText queries. This is limited to 128KB in length and may contain HTML elements.\"\n      },\n      \"thumbnail\": {\n       \"type\": \"object\",\n       \"description\": \"A thumbnail for the file. This will only be used if Google Drive cannot generate a standard thumbnail.\",\n       \"properties\": {\n        \"image\": {\n         \"type\": \"string\",\n         \"description\": \"The thumbnail data encoded with URL-safe Base64 (RFC 4648 section 5).\",\n         \"format\": \"byte\"\n        },\n        \"mimeType\": {\n         \"type\": \"string\",\n         \"description\": \"The MIME type of the thumbnail.\"\n        }\n       }\n      }\n     }\n    },\n    \"contentRestrictions\": {\n     \"type\": \"array\",\n     \"description\": \"Restrictions for accessing the content of the file. Only populated if such a restriction exists.\",\n     \"items\": {\n      \"$ref\": \"ContentRestriction\"\n     }\n    },\n    \"copyRequiresWriterPermission\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the options to copy, print, or download this file, should be disabled for readers and commenters.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"description\": {\n     \"type\": \"string\",\n     \"description\": \"A short description of the file.\"\n    },\n    \"driveId\": {\n     \"type\": \"string\",\n     \"description\": \"ID of the shared drive the file resides in. Only populated for items in shared drives.\"\n    },\n    \"explicitlyTrashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"\n    },\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Docs Editors files to specific formats.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"fileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The final component of fullFileExtension. This is only available for files with binary content in Google Drive.\"\n    },\n    \"folderColorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"\n    },\n    \"fullFileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Google Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"\n    },\n    \"hasAugmentedPermissions\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether there are permissions directly on this file. This field is only populated for items in shared drives.\"\n    },\n    \"hasThumbnail\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"\n    },\n    \"headRevisionId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file's head revision. This is currently only available for files with binary content in Google Drive.\"\n    },\n    \"iconLink\": {\n     \"type\": \"string\",\n     \"description\": \"A static, unauthenticated link to the file's icon.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file.\"\n    },\n    \"imageMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about image media, if available.\",\n     \"properties\": {\n      \"aperture\": {\n       \"type\": \"number\",\n       \"description\": \"The aperture used to create the photo (f-number).\",\n       \"format\": \"float\"\n      },\n      \"cameraMake\": {\n       \"type\": \"string\",\n       \"description\": \"The make of the camera used to create the photo.\"\n      },\n      \"cameraModel\": {\n       \"type\": \"string\",\n       \"description\": \"The model of the camera used to create the photo.\"\n      },\n      \"colorSpace\": {\n       \"type\": \"string\",\n       \"description\": \"The color space of the photo.\"\n      },\n      \"exposureBias\": {\n       \"type\": \"number\",\n       \"description\": \"The exposure bias of the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"exposureMode\": {\n       \"type\": \"string\",\n       \"description\": \"The exposure mode used to create the photo.\"\n      },\n      \"exposureTime\": {\n       \"type\": \"number\",\n       \"description\": \"The length of the exposure, in seconds.\",\n       \"format\": \"float\"\n      },\n      \"flashUsed\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether a flash was used to create the photo.\"\n      },\n      \"focalLength\": {\n       \"type\": \"number\",\n       \"description\": \"The focal length used to create the photo, in millimeters.\",\n       \"format\": \"float\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the image in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"isoSpeed\": {\n       \"type\": \"integer\",\n       \"description\": \"The ISO speed used to create the photo.\",\n       \"format\": \"int32\"\n      },\n      \"lens\": {\n       \"type\": \"string\",\n       \"description\": \"The lens used to create the photo.\"\n      },\n      \"location\": {\n       \"type\": \"object\",\n       \"description\": \"Geographic location information stored in the image.\",\n       \"properties\": {\n        \"altitude\": {\n         \"type\": \"number\",\n         \"description\": \"The altitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"latitude\": {\n         \"type\": \"number\",\n         \"description\": \"The latitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"longitude\": {\n         \"type\": \"number\",\n         \"description\": \"The longitude stored in the image.\",\n         \"format\": \"double\"\n        }\n       }\n      },\n      \"maxApertureValue\": {\n       \"type\": \"number\",\n       \"description\": \"The smallest f-number of the lens at the focal length used to create the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"meteringMode\": {\n       \"type\": \"string\",\n       \"description\": \"The metering mode used to create the photo.\"\n      },\n      \"rotation\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of clockwise 90 degree rotations applied from the image's original orientation.\",\n       \"format\": \"int32\"\n      },\n      \"sensor\": {\n       \"type\": \"string\",\n       \"description\": \"The type of sensor used to create the photo.\"\n      },\n      \"subjectDistance\": {\n       \"type\": \"integer\",\n       \"description\": \"The distance to the subject of the photo, in meters.\",\n       \"format\": \"int32\"\n      },\n      \"time\": {\n       \"type\": \"string\",\n       \"description\": \"The date and time the photo was taken (EXIF DateTime).\"\n      },\n      \"whiteBalance\": {\n       \"type\": \"string\",\n       \"description\": \"The white balance mode used to create the photo.\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the image in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"isAppAuthorized\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file was created or opened by the requesting app.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\",\n     \"default\": \"drive#file\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify the file.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Google Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the file.\\nGoogle Drive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"\n    },\n    \"modifiedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been modified by this user.\"\n    },\n    \"modifiedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\",\n     \"format\": \"date-time\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of shared drives, My Drive root folder, and Application Data folder the name is constant.\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Google Drive.\"\n    },\n    \"ownedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user owns the file. Not populated for items in shared drives.\"\n    },\n    \"owners\": {\n     \"type\": \"array\",\n     \"description\": \"The owners of the file. Currently, only certain legacy files may have more than one owner. Not populated for items in shared drives.\",\n     \"items\": {\n      \"$ref\": \"User\"\n     }\n    },\n    \"parents\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the user's My Drive folder. If not specified as part of a copy request, the file will inherit any discoverable parents of the source file. Update requests must use the addParents and removeParents parameters to modify the parents list.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissionIds\": {\n     \"type\": \"array\",\n     \"description\": \"List of permission IDs for users with access to this file.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for items in shared drives.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    },\n    \"properties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"quotaBytesUsed\": {\n     \"type\": \"string\",\n     \"description\": \"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\",\n     \"format\": \"int64\"\n    },\n    \"shared\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been shared. Not populated for items in shared drives.\"\n    },\n    \"sharedWithMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"sharingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who shared the file with the requesting user, if applicable.\"\n    },\n    \"shortcutDetails\": {\n     \"type\": \"object\",\n     \"description\": \"Shortcut file details. Only populated for shortcut files, which have the mimeType field set to application/vnd.google-apps.shortcut.\",\n     \"properties\": {\n      \"targetId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file that this shortcut points to.\"\n      },\n      \"targetMimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the file that this shortcut points to. The value of this field is a snapshot of the target's MIME type, captured when the shortcut is created.\"\n      }\n     }\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the file's content in bytes. This is applicable to binary files in Google Drive and Google Docs files.\",\n     \"format\": \"int64\"\n    },\n    \"spaces\": {\n     \"type\": \"array\",\n     \"description\": \"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"starred\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has starred the file.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use driveId instead.\"\n    },\n    \"thumbnailLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content. If the file isn't shared publicly, the URL returned in Files.thumbnailLink must be fetched using a credentialed request.\"\n    },\n    \"thumbnailVersion\": {\n     \"type\": \"string\",\n     \"description\": \"The thumbnail version for use in thumbnail cache invalidation.\",\n     \"format\": \"int64\"\n    },\n    \"trashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file. The trashed item is excluded from all files.list responses returned for any user who does not own the file. However, all users with access to the file can see the trashed item metadata in an API response. All users with access can copy, download, export, and share the file.\"\n    },\n    \"trashedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time that the item was trashed (RFC 3339 date-time). Only populated for items in shared drives.\",\n     \"format\": \"date-time\"\n    },\n    \"trashingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"If the file has been explicitly trashed, the user who trashed it. Only populated for items in shared drives.\"\n    },\n    \"version\": {\n     \"type\": \"string\",\n     \"description\": \"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\",\n     \"format\": \"int64\"\n    },\n    \"videoMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about video media. This may not be available immediately upon upload.\",\n     \"properties\": {\n      \"durationMillis\": {\n       \"type\": \"string\",\n       \"description\": \"The duration of the video in milliseconds.\",\n       \"format\": \"int64\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the video in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the video in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"viewedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been viewed by this user.\"\n    },\n    \"viewedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was viewed by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"viewersCanCopyContent\": {\n     \"type\": \"boolean\",\n     \"description\": \"Deprecated - use copyRequiresWriterPermission instead.\"\n    },\n    \"webContentLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for downloading the content of the file in a browser. This is only available for files with binary content in Google Drive.\"\n    },\n    \"webViewLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for opening the file in a relevant Google editor or viewer in a browser.\"\n    },\n    \"writersCanShare\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether users with only writer permission can modify the file's permissions. Not populated for items in shared drives.\"\n    }\n   }\n  },\n  \"FileList\": {\n   \"id\": \"FileList\",\n   \"type\": \"object\",\n   \"description\": \"A list of files.\",\n   \"properties\": {\n    \"files\": {\n     \"type\": \"array\",\n     \"description\": \"The list of files. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"File\"\n     }\n    },\n    \"incompleteSearch\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the search process was incomplete. If true, then some search results may be missing, since all documents were not searched. This may occur when searching multiple drives with the \\\"allDrives\\\" corpora, but all corpora could not be searched. When this happens, it is suggested that clients narrow their query by choosing a different corpus such as \\\"user\\\" or \\\"drive\\\".\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#fileList\\\".\",\n     \"default\": \"drive#fileList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of files. This will be absent if the end of the files list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"GeneratedIds\": {\n   \"id\": \"GeneratedIds\",\n   \"type\": \"object\",\n   \"description\": \"A list of generated file IDs which can be provided in create requests.\",\n   \"properties\": {\n    \"ids\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs generated for the requesting user in the specified space.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#generatedIds\\\".\",\n     \"default\": \"drive#generatedIds\"\n    },\n    \"space\": {\n     \"type\": \"string\",\n     \"description\": \"The type of file that can be created with these IDs.\"\n    }\n   }\n  },\n  \"Permission\": {\n   \"id\": \"Permission\",\n   \"type\": \"object\",\n   \"description\": \"A permission for a file. A permission grants a user, group, domain or the world access to a file or a folder hierarchy.\",\n   \"properties\": {\n    \"allowFileDiscovery\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"\n    },\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"The \\\"pretty\\\" name of the value of the permission. The following is a list of examples for each type of permission:  \\n- user - User's full name, as defined for their Google account, such as \\\"Joe Smith.\\\" \\n- group - Name of the Google Group, such as \\\"The Company Administrators.\\\" \\n- domain - String domain name, such as \\\"thecompany.com.\\\" \\n- anyone - No displayName is present.\"\n    },\n    \"domain\": {\n     \"type\": \"string\",\n     \"description\": \"The domain to which this permission refers.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user or group to which this permission refers.\"\n    },\n    \"expirationTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId. IDs should be treated as opaque values.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\",\n     \"default\": \"drive#permission\"\n    },\n    \"permissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Details of whether the permissions on this shared drive item are inherited or directly on this item. This is an output-only field which is present only for shared drive items.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Whether this permission is inherited. This field is always populated. This is an output-only field.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the item from which this permission is inherited. This is an output-only field.\"\n       },\n       \"permissionType\": {\n        \"type\": \"string\",\n        \"description\": \"The permission type for this user. While new values may be added in future, the following are currently possible:  \\n- file \\n- member\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"The primary role for this user. While new values may be added in the future, the following are currently possible:  \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\"\n       }\n      }\n     }\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    },\n    \"role\": {\n     \"type\": \"string\",\n     \"description\": \"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- owner \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    },\n    \"teamDrivePermissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Deprecated - use permissionDetails instead.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Deprecated - use permissionDetails/inherited instead.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/inheritedFrom instead.\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/role instead.\"\n       },\n       \"teamDrivePermissionType\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/permissionType instead.\"\n       }\n      }\n     }\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone  When creating a permission, if type is user or group, you must provide an emailAddress for the user or group. When type is domain, you must provide a domain. There isn't extra information required for a anyone type.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    },\n    \"view\": {\n     \"type\": \"string\",\n     \"description\": \"Indicates the view for this permission. Only populated for permissions that belong to a view. published is the only supported value.\"\n    }\n   }\n  },\n  \"PermissionList\": {\n   \"id\": \"PermissionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of permissions for a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permissionList\\\".\",\n     \"default\": \"drive#permissionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of permissions. This field will be absent if the end of the permissions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of permissions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    }\n   }\n  },\n  \"Reply\": {\n   \"id\": \"Reply\",\n   \"type\": \"object\",\n   \"description\": \"A reply to a comment on a file.\",\n   \"properties\": {\n    \"action\": {\n     \"type\": \"string\",\n     \"description\": \"The action the reply performed to the parent comment. Valid values are:  \\n- resolve \\n- reopen\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The author of the reply. The author's email address and permission ID will not be populated.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the reply. This field is used for setting the content, while htmlContent should be displayed. This is required on creates if no action is specified.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.replies.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the reply was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the reply has been deleted. A deleted reply has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the reply with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the reply.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#reply\\\".\",\n     \"default\": \"drive#reply\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the reply was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    }\n   }\n  },\n  \"ReplyList\": {\n   \"id\": \"ReplyList\",\n   \"type\": \"object\",\n   \"description\": \"A list of replies to a comment on a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#replyList\\\".\",\n     \"default\": \"drive#replyList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of replies. This will be absent if the end of the replies list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The list of replies. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    }\n   }\n  },\n  \"Revision\": {\n   \"id\": \"Revision\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a revision to a file.\",\n   \"properties\": {\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Docs Editors files to specific formats.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the revision.\"\n    },\n    \"keepForever\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\",\n     \"default\": \"drive#revision\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify this revision.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the revision.\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the revision was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"\n    },\n    \"publishAuto\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether subsequent revisions will be automatically republished. This is only applicable to Docs Editors files.\"\n    },\n    \"published\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published. This is only applicable to Docs Editors files.\"\n    },\n    \"publishedLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the published revision. This is only populated for Google Sites files.\"\n    },\n    \"publishedOutsideDomain\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published outside the domain. This is only applicable to Docs Editors files.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    }\n   }\n  },\n  \"RevisionList\": {\n   \"id\": \"RevisionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of revisions of a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revisionList\\\".\",\n     \"default\": \"drive#revisionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of revisions. This will be absent if the end of the revisions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"revisions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of revisions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Revision\"\n     }\n    }\n   }\n  },\n  \"StartPageToken\": {\n   \"id\": \"StartPageToken\",\n   \"type\": \"object\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#startPageToken\\\".\",\n     \"default\": \"drive#startPageToken\"\n    },\n    \"startPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for listing changes.\"\n    }\n   }\n  },\n  \"TeamDrive\": {\n   \"id\": \"TeamDrive\",\n   \"type\": \"object\",\n   \"description\": \"Deprecated: use the drive collection instead.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this Team Drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this Team Drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this Team Drive.\"\n      },\n      \"canChangeCopyRequiresWriterPermissionRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this Team Drive.\"\n      },\n      \"canChangeDomainUsersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the domainUsersOnly restriction of this Team Drive.\"\n      },\n      \"canChangeTeamDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this Team Drive.\"\n      },\n      \"canChangeTeamMembersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the teamMembersOnly restriction of this Team Drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this Team Drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this Team Drive.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children from folders in this Team Drive.\"\n      },\n      \"canDeleteTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this Team Drive. Attempting to delete the Team Drive may still fail if there are untrashed items inside the Team Drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this Team Drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this Team Drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this Team Drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this Team Drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this Team Drive.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this Team Drive.\"\n      },\n      \"canRenameTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this Team Drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this Team Drive.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children from folders in this Team Drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the Team Drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this Team Drive which is also the ID of the top level folder of this Team Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\",\n     \"default\": \"drive#teamDrive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this Team Drive.\"\n    },\n    \"restrictions\": {\n     \"type\": \"object\",\n     \"description\": \"A set of restrictions that apply to this Team Drive or items inside this Team Drive.\",\n     \"properties\": {\n      \"adminManagedRestrictions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether administrative privileges on this Team Drive are required to modify restrictions.\"\n      },\n      \"copyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the options to copy, print, or download files inside this Team Drive, should be disabled for readers and commenters. When this restriction is set to true, it will override the similarly named field to true for any file inside this Team Drive.\"\n      },\n      \"domainUsersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to this Team Drive and items inside this Team Drive is restricted to users of the domain to which this Team Drive belongs. This restriction may be overridden by other sharing policies controlled outside of this Team Drive.\"\n      },\n      \"teamMembersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to items inside this Team Drive is restricted to members of this Team Drive.\"\n      }\n     }\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"TeamDriveList\": {\n   \"id\": \"TeamDriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of Team Drives.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDriveList\\\".\",\n     \"default\": \"drive#teamDriveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of Team Drives. This will be absent if the end of the Team Drives list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"teamDrives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of Team Drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"TeamDrive\"\n     }\n    }\n   }\n  },\n  \"User\": {\n   \"id\": \"User\",\n   \"type\": \"object\",\n   \"description\": \"Information about a Drive user.\",\n   \"properties\": {\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A plain text displayable name for this user.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#user\\\".\",\n     \"default\": \"drive#user\"\n    },\n    \"me\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this user is the requesting user.\"\n    },\n    \"permissionId\": {\n     \"type\": \"string\",\n     \"description\": \"The user's ID as visible in Permission resources.\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    }\n   }\n  }\n },\n \"resources\": {\n  \"about\": {\n   \"methods\": {\n    \"get\": {\n     \"id\": \"drive.about.get\",\n     \"path\": \"about\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets information about the user, the user's Drive, and system capabilities.\",\n     \"response\": {\n      \"$ref\": \"About\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"changes\": {\n   \"methods\": {\n    \"getStartPageToken\": {\n     \"id\": \"drive.changes.getStartPageToken\",\n     \"path\": \"changes/startPageToken\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets the starting pageToken for listing future changes.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive for which the starting pageToken for listing future changes from that shared drive is returned.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"StartPageToken\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.changes.list\",\n     \"path\": \"changes\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the changes for a user or shared drive.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The shared drive from which changes are returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      },\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether both My Drive and shared drive items should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"response\": {\n      \"$ref\": \"ChangeList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    },\n    \"watch\": {\n     \"id\": \"drive.changes.watch\",\n     \"path\": \"changes/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes for a user.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The shared drive from which changes are returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      },\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether both My Drive and shared drive items should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"channels\": {\n   \"methods\": {\n    \"stop\": {\n     \"id\": \"drive.channels.stop\",\n     \"path\": \"channels/stop\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Stop watching resources through this channel\",\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"comments\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.comments.create\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new comment on a file.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.comments.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.comments.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a comment by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.comments.list\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's comments.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of comments to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"startModifiedTime\": {\n       \"type\": \"string\",\n       \"description\": \"The minimum value of 'modifiedTime' for the result comments (RFC 3339 date-time).\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"CommentList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.comments.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a comment with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"drives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.drives.create\",\n     \"path\": \"drives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new shared drive.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a shared drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same shared drive. If the shared drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Drive\"\n     },\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.drives.delete\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a shared drive for which the user is an organizer. The shared drive cannot contain any untrashed items.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.drives.get\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a shared drive's metadata by ID.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"hide\": {\n     \"id\": \"drive.drives.hide\",\n     \"path\": \"drives/{driveId}/hide\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Hides a shared drive from the default view.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.drives.list\",\n     \"path\": \"drives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the user's shared drives.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of shared drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for shared drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching shared drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then all shared drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"DriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"unhide\": {\n     \"id\": \"drive.drives.unhide\",\n     \"path\": \"drives/{driveId}/unhide\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Restores a shared drive to the default view.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.drives.update\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates the metadate for a shared drive.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Drive\"\n     },\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  },\n  \"files\": {\n   \"methods\": {\n    \"copy\": {\n     \"id\": \"drive.files.copy\",\n     \"path\": \"files/{fileId}/copy\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a copy of a file and applies any requested updates with patch semantics. Folders cannot be copied.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. Copying files into multiple folders is no longer supported. Use shortcuts instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\"\n     ]\n    },\n    \"create\": {\n     \"id\": \"drive.files.create\",\n     \"path\": \"files\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new file.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. Creating files in multiple folders is no longer supported.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files\"\n       }\n      }\n     },\n     \"supportsSubscription\": true\n    },\n    \"delete\": {\n     \"id\": \"drive.files.delete\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a shared drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. If an item is not in a shared drive and its last parent is deleted but the item itself is not, the item will be placed under its owner's root.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"emptyTrash\": {\n     \"id\": \"drive.files.emptyTrash\",\n     \"path\": \"files/trash\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes all of the user's trashed files.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. If an item is not in a shared drive and its last parent is deleted but the item itself is not, the item will be placed under its owner's root.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"export\": {\n     \"id\": \"drive.files.export\",\n     \"path\": \"files/{fileId}/export\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the format requested for this export.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"mimeType\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true\n    },\n    \"generateIds\": {\n     \"id\": \"drive.files.generateIds\",\n     \"path\": \"files/generateIds\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Generates a set of file IDs which can be provided in create or copy requests.\",\n     \"parameters\": {\n      \"count\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of IDs to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"space\": {\n       \"type\": \"string\",\n       \"description\": \"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"GeneratedIds\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.files.get\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a file's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    },\n    \"list\": {\n     \"id\": \"drive.files.list\",\n     \"path\": \"files\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists or searches files.\",\n     \"parameters\": {\n      \"corpora\": {\n       \"type\": \"string\",\n       \"description\": \"Groupings of files to which the query applies. Supported groupings are: 'user' (files created by, opened by, or shared directly with the user), 'drive' (files in the specified shared drive as indicated by the 'driveId'), 'domain' (files shared to the user's domain), and 'allDrives' (A combination of 'user' and 'drive' for all drives where the user is a member). When able, use 'user' or 'drive', instead of 'allDrives', for efficiency.\",\n       \"location\": \"query\"\n      },\n      \"corpus\": {\n       \"type\": \"string\",\n       \"description\": \"The source of files to list. Deprecated: use 'corpora' instead.\",\n       \"enum\": [\n        \"domain\",\n        \"user\"\n       ],\n       \"enumDescriptions\": [\n        \"Files shared to the user's domain.\",\n        \"Files owned by or shared to the user. If a user has permissions on a Shared Drive, the files inside it won't be retrieved unless the user has created, opened, or shared the file.\"\n       ],\n       \"location\": \"query\"\n      },\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"ID of the shared drive to search.\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether both My Drive and shared drive items should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"orderBy\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"FileList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.files.update\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a file's metadata and/or content. This method supports patch semantics.\",\n     \"parameters\": {\n      \"addParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to add.\",\n       \"location\": \"query\"\n      },\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. Adding files to multiple folders is no longer supported. Use shortcuts instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"removeParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to remove.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.scripts\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files/{fileId}\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files/{fileId}\"\n       }\n      }\n     }\n    },\n    \"watch\": {\n     \"id\": \"drive.files.watch\",\n     \"path\": \"files/{fileId}/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes to a file\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"permissions\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.permissions.create\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a permission for a file or shared drive.\",\n     \"parameters\": {\n      \"emailMessage\": {\n       \"type\": \"string\",\n       \"description\": \"A plain text custom message to include in the notification email.\",\n       \"location\": \"query\"\n      },\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. See moveToNewOwnersRoot for details.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"moveToNewOwnersRoot\": {\n       \"type\": \"boolean\",\n       \"description\": \"This parameter will only take effect if the item is not in a shared drive and the request is attempting to transfer the ownership of the item. If set to true, the item will be moved to the new owner's My Drive root folder and all prior parents removed. If set to false, parents are not changed.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"sendNotificationEmail\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.permissions.delete\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a permission.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.permissions.get\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a permission by ID.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.permissions.list\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's or shared drive's permissions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of permissions to return per page. When not set for files in a shared drive, at most 100 results will be returned. When not set for files that are not in a shared drive, the entire list will be returned.\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"PermissionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.permissions.update\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a permission with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"removeExpiration\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to remove the expiration date.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"replies\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.replies.create\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new reply to a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.replies.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a reply.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.replies.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a reply by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.replies.list\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a comment's replies.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of replies to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"ReplyList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.replies.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a reply with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"revisions\": {\n   \"methods\": {\n    \"delete\": {\n     \"id\": \"drive.revisions.delete\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file version. You can only delete revisions for files with binary content in Google Drive, like images or videos. Revisions for other files, like Google Docs or Sheets, and the last remaining file version can't be deleted.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.revisions.get\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a revision's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true\n    },\n    \"list\": {\n     \"id\": \"drive.revisions.list\",\n     \"path\": \"files/{fileId}/revisions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's revisions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of revisions to return per page.\",\n       \"default\": \"200\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"RevisionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.revisions.update\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a revision with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Revision\"\n     },\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"teamdrives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.teamdrives.create\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Deprecated use drives.create instead.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.teamdrives.delete\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deprecated use drives.delete instead.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.teamdrives.get\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Deprecated use drives.get instead.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.teamdrives.list\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Deprecated use drives.list instead.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of Team Drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then all Team Drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"TeamDriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.teamdrives.update\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Deprecated use drives.update instead\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  }\n }\n}\n\n"
  },
  {
    "path": "data-raw/old/drive-v3_2021-06-21.json",
    "content": "{\n \"kind\": \"discovery#restDescription\",\n \"etag\": \"\\\"uWj2hSb4GVjzdDlAnRd2gbM1ZQ8/RDW9kL-wYxpc9TU9SMLoLWEfo9w\\\"\",\n \"discoveryVersion\": \"v1\",\n \"id\": \"drive:v3\",\n \"name\": \"drive\",\n \"version\": \"v3\",\n \"revision\": \"20210621\",\n \"title\": \"Drive API\",\n \"description\": \"Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.\",\n \"ownerDomain\": \"google.com\",\n \"ownerName\": \"Google\",\n \"icons\": {\n  \"x16\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png\",\n  \"x32\": \"https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png\"\n },\n \"documentationLink\": \"https://developers.google.com/drive/\",\n \"protocol\": \"rest\",\n \"baseUrl\": \"https://www.googleapis.com/drive/v3/\",\n \"basePath\": \"/drive/v3/\",\n \"rootUrl\": \"https://www.googleapis.com/\",\n \"servicePath\": \"drive/v3/\",\n \"batchPath\": \"batch/drive/v3\",\n \"parameters\": {\n  \"alt\": {\n   \"type\": \"string\",\n   \"description\": \"Data format for the response.\",\n   \"default\": \"json\",\n   \"enum\": [\n    \"json\"\n   ],\n   \"enumDescriptions\": [\n    \"Responses with Content-Type of application/json\"\n   ],\n   \"location\": \"query\"\n  },\n  \"fields\": {\n   \"type\": \"string\",\n   \"description\": \"Selector specifying which fields to include in a partial response.\",\n   \"location\": \"query\"\n  },\n  \"key\": {\n   \"type\": \"string\",\n   \"description\": \"API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.\",\n   \"location\": \"query\"\n  },\n  \"oauth_token\": {\n   \"type\": \"string\",\n   \"description\": \"OAuth 2.0 token for the current user.\",\n   \"location\": \"query\"\n  },\n  \"prettyPrint\": {\n   \"type\": \"boolean\",\n   \"description\": \"Returns response with indentations and line breaks.\",\n   \"default\": \"true\",\n   \"location\": \"query\"\n  },\n  \"quotaUser\": {\n   \"type\": \"string\",\n   \"description\": \"An opaque string that represents a user for quota purposes. Must not exceed 40 characters.\",\n   \"location\": \"query\"\n  },\n  \"userIp\": {\n   \"type\": \"string\",\n   \"description\": \"Deprecated. Please use quotaUser instead.\",\n   \"location\": \"query\"\n  }\n },\n \"auth\": {\n  \"oauth2\": {\n   \"scopes\": {\n    \"https://www.googleapis.com/auth/drive\": {\n     \"description\": \"See, edit, create, and delete all of your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.appdata\": {\n     \"description\": \"See, create, and delete its own configuration data in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.file\": {\n     \"description\": \"See, edit, create, and delete only the specific Google Drive files you use with this app\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata\": {\n     \"description\": \"View and manage metadata of files in your Google Drive\"\n    },\n    \"https://www.googleapis.com/auth/drive.metadata.readonly\": {\n     \"description\": \"See information about your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.photos.readonly\": {\n     \"description\": \"View the photos, videos and albums in your Google Photos\"\n    },\n    \"https://www.googleapis.com/auth/drive.readonly\": {\n     \"description\": \"See and download all your Google Drive files\"\n    },\n    \"https://www.googleapis.com/auth/drive.scripts\": {\n     \"description\": \"Modify your Google Apps Script scripts' behavior\"\n    }\n   }\n  }\n },\n \"schemas\": {\n  \"About\": {\n   \"id\": \"About\",\n   \"type\": \"object\",\n   \"description\": \"Information about the user, the user's Drive, and system capabilities.\",\n   \"properties\": {\n    \"appInstalled\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has installed the requesting app.\"\n    },\n    \"canCreateDrives\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user can create shared drives.\"\n    },\n    \"canCreateTeamDrives\": {\n     \"type\": \"boolean\",\n     \"description\": \"Deprecated - use canCreateDrives instead.\"\n    },\n    \"driveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"A list of themes that are supported for shared drives.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"A link to this theme's background image.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"The color of this theme as an RGB hex string.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the theme.\"\n       }\n      }\n     }\n    },\n    \"exportFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported exports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"folderColorPalette\": {\n     \"type\": \"array\",\n     \"description\": \"The currently supported folder colors as RGB hex strings.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"importFormats\": {\n     \"type\": \"object\",\n     \"description\": \"A map of source MIME type to possible targets for all supported imports.\",\n     \"additionalProperties\": {\n      \"type\": \"array\",\n      \"items\": {\n       \"type\": \"string\"\n      }\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#about\\\".\",\n     \"default\": \"drive#about\"\n    },\n    \"maxImportSizes\": {\n     \"type\": \"object\",\n     \"description\": \"A map of maximum import sizes by MIME type, in bytes.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"format\": \"int64\"\n     }\n    },\n    \"maxUploadSize\": {\n     \"type\": \"string\",\n     \"description\": \"The maximum upload size in bytes.\",\n     \"format\": \"int64\"\n    },\n    \"storageQuota\": {\n     \"type\": \"object\",\n     \"description\": \"The user's storage quota limits and usage. All fields are measured in bytes.\",\n     \"properties\": {\n      \"limit\": {\n       \"type\": \"string\",\n       \"description\": \"The usage limit, if applicable. This will not be present if the user has unlimited storage.\",\n       \"format\": \"int64\"\n      },\n      \"usage\": {\n       \"type\": \"string\",\n       \"description\": \"The total usage across all services.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDrive\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by all files in Google Drive.\",\n       \"format\": \"int64\"\n      },\n      \"usageInDriveTrash\": {\n       \"type\": \"string\",\n       \"description\": \"The usage by trashed files in Google Drive.\",\n       \"format\": \"int64\"\n      }\n     }\n    },\n    \"teamDriveThemes\": {\n     \"type\": \"array\",\n     \"description\": \"Deprecated - use driveThemes instead.\",\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"backgroundImageLink\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/backgroundImageLink instead.\"\n       },\n       \"colorRgb\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/colorRgb instead.\"\n       },\n       \"id\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use driveThemes/id instead.\"\n       }\n      }\n     }\n    },\n    \"user\": {\n     \"$ref\": \"User\",\n     \"description\": \"The authenticated user.\"\n    }\n   }\n  },\n  \"Change\": {\n   \"id\": \"Change\",\n   \"type\": \"object\",\n   \"description\": \"A change to a file or shared drive.\",\n   \"properties\": {\n    \"changeType\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the change. Possible values are file and drive.\"\n    },\n    \"drive\": {\n     \"$ref\": \"Drive\",\n     \"description\": \"The updated state of the shared drive. Present if the changeType is drive, the user is still a member of the shared drive, and the shared drive has not been deleted.\"\n    },\n    \"driveId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the shared drive associated with this change.\"\n    },\n    \"file\": {\n     \"$ref\": \"File\",\n     \"description\": \"The updated state of the file. Present if the type is file and the file has not been removed from this list of changes.\"\n    },\n    \"fileId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file which has changed.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#change\\\".\",\n     \"default\": \"drive#change\"\n    },\n    \"removed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file or shared drive has been removed from this list of changes, for example by deletion or loss of access.\"\n    },\n    \"teamDrive\": {\n     \"$ref\": \"TeamDrive\",\n     \"description\": \"Deprecated - use drive instead.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use driveId instead.\"\n    },\n    \"time\": {\n     \"type\": \"string\",\n     \"description\": \"The time of this change (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use changeType instead.\"\n    }\n   }\n  },\n  \"ChangeList\": {\n   \"id\": \"ChangeList\",\n   \"type\": \"object\",\n   \"description\": \"A list of changes for a user.\",\n   \"properties\": {\n    \"changes\": {\n     \"type\": \"array\",\n     \"description\": \"The list of changes. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Change\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#changeList\\\".\",\n     \"default\": \"drive#changeList\"\n    },\n    \"newStartPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for future changes. This will be present only if the end of the current changes list has been reached.\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of changes. This will be absent if the end of the changes list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"Channel\": {\n   \"id\": \"Channel\",\n   \"type\": \"object\",\n   \"description\": \"An notification channel used to watch for resource changes.\",\n   \"properties\": {\n    \"address\": {\n     \"type\": \"string\",\n     \"description\": \"The address where notifications are delivered for this channel.\"\n    },\n    \"expiration\": {\n     \"type\": \"string\",\n     \"description\": \"Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.\",\n     \"format\": \"int64\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"A UUID or similar unique string that identifies this channel.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies this as a notification channel used to watch for changes to a resource, which is \\\"api#channel\\\".\",\n     \"default\": \"api#channel\"\n    },\n    \"params\": {\n     \"type\": \"object\",\n     \"description\": \"Additional parameters controlling delivery channel behavior. Optional.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"Declares a new parameter by name.\"\n     }\n    },\n    \"payload\": {\n     \"type\": \"boolean\",\n     \"description\": \"A Boolean value to indicate whether payload is wanted. Optional.\"\n    },\n    \"resourceId\": {\n     \"type\": \"string\",\n     \"description\": \"An opaque ID that identifies the resource being watched on this channel. Stable across different API versions.\"\n    },\n    \"resourceUri\": {\n     \"type\": \"string\",\n     \"description\": \"A version-specific identifier for the watched resource.\"\n    },\n    \"token\": {\n     \"type\": \"string\",\n     \"description\": \"An arbitrary string delivered to the target address with each notification delivered over this channel. Optional.\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of delivery mechanism used for this channel. Valid values are \\\"web_hook\\\" (or \\\"webhook\\\"). Both values refer to a channel where Http requests are used to deliver messages.\"\n    }\n   }\n  },\n  \"Comment\": {\n   \"id\": \"Comment\",\n   \"type\": \"object\",\n   \"description\": \"A comment on a file.\",\n   \"properties\": {\n    \"anchor\": {\n     \"type\": \"string\",\n     \"description\": \"A region of the document represented as a JSON string. For details on defining anchor properties, refer to  Add comments and replies.\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The author of the comment. The author's email address and permission ID will not be populated.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the comment. This field is used for setting the content, while htmlContent should be displayed.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.comments.create\",\n       \"drive.comments.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the comment was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been deleted. A deleted comment has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the comment with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the comment.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#comment\\\".\",\n     \"default\": \"drive#comment\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the comment or any of its replies was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"quotedFileContent\": {\n     \"type\": \"object\",\n     \"description\": \"The file content to which the comment refers, typically within the anchor region. For a text file, for example, this would be the text at the location of the comment.\",\n     \"properties\": {\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the quoted content.\"\n      },\n      \"value\": {\n       \"type\": \"string\",\n       \"description\": \"The quoted content itself. This is interpreted as plain text if set through the API.\"\n      }\n     }\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of replies to the comment in chronological order.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    },\n    \"resolved\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the comment has been resolved by one of its replies.\"\n    }\n   }\n  },\n  \"CommentList\": {\n   \"id\": \"CommentList\",\n   \"type\": \"object\",\n   \"description\": \"A list of comments on a file.\",\n   \"properties\": {\n    \"comments\": {\n     \"type\": \"array\",\n     \"description\": \"The list of comments. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Comment\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#commentList\\\".\",\n     \"default\": \"drive#commentList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of comments. This will be absent if the end of the comments list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"ContentRestriction\": {\n   \"id\": \"ContentRestriction\",\n   \"type\": \"object\",\n   \"description\": \"A restriction for accessing the content of the file.\",\n   \"properties\": {\n    \"readOnly\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the content of the file is read-only. If a file is read-only, a new revision of the file may not be added, comments may not be added or modified, and the title of the file may not be modified.\"\n    },\n    \"reason\": {\n     \"type\": \"string\",\n     \"description\": \"Reason for why the content of the file is restricted. This is only mutable on requests that also set readOnly=true.\"\n    },\n    \"restrictingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who set the content restriction. Only populated if readOnly is true.\"\n    },\n    \"restrictionTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the content restriction was set (formatted RFC 3339 timestamp). Only populated if readOnly is true.\",\n     \"format\": \"date-time\"\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the content restriction. Currently the only possible value is globalContentRestriction.\"\n    }\n   }\n  },\n  \"Drive\": {\n   \"id\": \"Drive\",\n   \"type\": \"object\",\n   \"description\": \"Representation of a shared drive.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this shared drive is set. This is a write only field; it can only be set on drive.drives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Google Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this shared drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this shared drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this shared drive.\"\n      },\n      \"canChangeCopyRequiresWriterPermissionRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this shared drive.\"\n      },\n      \"canChangeDomainUsersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the domainUsersOnly restriction of this shared drive.\"\n      },\n      \"canChangeDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this shared drive.\"\n      },\n      \"canChangeDriveMembersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the driveMembersOnly restriction of this shared drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this shared drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this shared drive.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children from folders in this shared drive.\"\n      },\n      \"canDeleteDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this shared drive. Attempting to delete the shared drive may still fail if there are untrashed items inside the shared drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this shared drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this shared drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this shared drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this shared drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this shared drive.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this shared drive.\"\n      },\n      \"canRenameDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this shared drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this shared drive.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children from folders in this shared drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this shared drive as an RGB hex string. It can only be set on a drive.drives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the shared drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"hidden\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the shared drive is hidden from default view.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this shared drive which is also the ID of the top level folder of this shared drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#drive\\\".\",\n     \"default\": \"drive#drive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this shared drive.\"\n    },\n    \"restrictions\": {\n     \"type\": \"object\",\n     \"description\": \"A set of restrictions that apply to this shared drive or items inside this shared drive.\",\n     \"properties\": {\n      \"adminManagedRestrictions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether administrative privileges on this shared drive are required to modify restrictions.\"\n      },\n      \"copyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the options to copy, print, or download files inside this shared drive, should be disabled for readers and commenters. When this restriction is set to true, it will override the similarly named field to true for any file inside this shared drive.\"\n      },\n      \"domainUsersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to this shared drive and items inside this shared drive is restricted to users of the domain to which this shared drive belongs. This restriction may be overridden by other sharing policies controlled outside of this shared drive.\"\n      },\n      \"driveMembersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to items inside this shared drive is restricted to its members.\"\n      }\n     }\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible driveThemes can be retrieved from a drive.about.get response. When not specified on a drive.drives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"DriveList\": {\n   \"id\": \"DriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of shared drives.\",\n   \"properties\": {\n    \"drives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of shared drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Drive\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#driveList\\\".\",\n     \"default\": \"drive#driveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of shared drives. This will be absent if the end of the list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"File\": {\n   \"id\": \"File\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a file.\",\n   \"properties\": {\n    \"appProperties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are private to the requesting app.\\nEntries with null values are cleared in update and copy requests. These properties can only be retrieved using an authenticated request. An authenticated request uses an access token obtained with a OAuth 2 client ID. You cannot use an API key to retrieve private properties.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to this folder. This is always false when the item is not a folder.\"\n      },\n      \"canAddFolderFromAnotherDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add a folder from another drive (different shared drive or My Drive) to this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canAddMyDriveParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add a parent for the item without removing an existing parent in the same request. Not populated for shared drive files.\"\n      },\n      \"canChangeCopyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this file.\"\n      },\n      \"canChangeSecurityUpdateEnabled\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the securityUpdateEnabled field on link share metadata.\"\n      },\n      \"canChangeViewersCanCopyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on this file.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy this file. For an item in a shared drive, whether the current user can copy non-folder descendants of this item, or this item itself if it is not a folder.\"\n      },\n      \"canDelete\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this file.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children of this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download this file.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit this file. Other factors may limit the type of changes a user can make to a file. For example, see canChangeCopyRequiresWriterPermission or canModifyContent.\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of this folder. This is always false when the item is not a folder.\"\n      },\n      \"canModifyContent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the content of this file.\"\n      },\n      \"canModifyContentRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify restrictions on content of this file.\"\n      },\n      \"canMoveChildrenOutOfDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder outside of the shared drive. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canMoveChildrenOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveChildrenOutOfDrive instead.\"\n      },\n      \"canMoveChildrenWithinDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move children of this folder within this drive. This is false when the item is not a folder. Note that a request to move the child may still fail depending on the current user's access to the child and to the destination folder.\"\n      },\n      \"canMoveChildrenWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveChildrenWithinDrive instead.\"\n      },\n      \"canMoveItemIntoTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemOutOfDrive instead.\"\n      },\n      \"canMoveItemOutOfDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item outside of this drive by changing its parent. Note that a request to change the parent of the item may still fail depending on the new parent that is being added.\"\n      },\n      \"canMoveItemOutOfTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemOutOfDrive instead.\"\n      },\n      \"canMoveItemWithinDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this item within this drive. Note that a request to change the parent of the item may still fail depending on the new parent that is being added and the parent that is being removed.\"\n      },\n      \"canMoveItemWithinTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemWithinDrive instead.\"\n      },\n      \"canMoveTeamDriveItem\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canMoveItemWithinDrive or canMoveItemOutOfDrive instead.\"\n      },\n      \"canReadDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the shared drive to which this file belongs. Only populated for items in shared drives.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of this file. For a shared drive item, whether revisions of non-folder descendants of this item, or this item itself if it is not a folder, can be read.\"\n      },\n      \"canReadTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canReadDrive instead.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove children from this folder. This is always false when the item is not a folder. For a folder in a shared drive, use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRemoveMyDriveParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can remove a parent from the item without adding another parent in the same request. Not populated for shared drive files.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this file.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can modify the sharing settings for this file.\"\n      },\n      \"canTrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can move this file to trash.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children of this folder. This is false when the item is not a folder. Only populated for items in shared drives.\"\n      },\n      \"canUntrash\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can restore this file from trash.\"\n      }\n     }\n    },\n    \"contentHints\": {\n     \"type\": \"object\",\n     \"description\": \"Additional information about the content of the file. These fields are never populated in responses.\",\n     \"properties\": {\n      \"indexableText\": {\n       \"type\": \"string\",\n       \"description\": \"Text to be indexed for the file to improve fullText queries. This is limited to 128KB in length and may contain HTML elements.\"\n      },\n      \"thumbnail\": {\n       \"type\": \"object\",\n       \"description\": \"A thumbnail for the file. This will only be used if Google Drive cannot generate a standard thumbnail.\",\n       \"properties\": {\n        \"image\": {\n         \"type\": \"string\",\n         \"description\": \"The thumbnail data encoded with URL-safe Base64 (RFC 4648 section 5).\",\n         \"format\": \"byte\"\n        },\n        \"mimeType\": {\n         \"type\": \"string\",\n         \"description\": \"The MIME type of the thumbnail.\"\n        }\n       }\n      }\n     }\n    },\n    \"contentRestrictions\": {\n     \"type\": \"array\",\n     \"description\": \"Restrictions for accessing the content of the file. Only populated if such a restriction exists.\",\n     \"items\": {\n      \"$ref\": \"ContentRestriction\"\n     }\n    },\n    \"copyRequiresWriterPermission\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the options to copy, print, or download this file, should be disabled for readers and commenters.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"description\": {\n     \"type\": \"string\",\n     \"description\": \"A short description of the file.\"\n    },\n    \"driveId\": {\n     \"type\": \"string\",\n     \"description\": \"ID of the shared drive the file resides in. Only populated for items in shared drives.\"\n    },\n    \"explicitlyTrashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"\n    },\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Docs Editors files to specific formats.\",\n     \"readOnly\": true,\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"fileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The final component of fullFileExtension. This is only available for files with binary content in Google Drive.\"\n    },\n    \"folderColorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color for a folder as an RGB hex string. The supported colors are published in the folderColorPalette field of the About resource.\\nIf an unsupported color is specified, the closest color in the palette will be used instead.\"\n    },\n    \"fullFileExtension\": {\n     \"type\": \"string\",\n     \"description\": \"The full file extension extracted from the name field. May contain multiple concatenated extensions, such as \\\"tar.gz\\\". This is only available for files with binary content in Google Drive.\\nThis is automatically updated when the name field changes, however it is not cleared if the new name does not contain a valid extension.\"\n    },\n    \"hasAugmentedPermissions\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether there are permissions directly on this file. This field is only populated for items in shared drives.\"\n    },\n    \"hasThumbnail\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this file has a thumbnail. This does not indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"\n    },\n    \"headRevisionId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file's head revision. This is currently only available for files with binary content in Google Drive.\"\n    },\n    \"iconLink\": {\n     \"type\": \"string\",\n     \"description\": \"A static, unauthenticated link to the file's icon.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the file.\"\n    },\n    \"imageMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about image media, if available.\",\n     \"properties\": {\n      \"aperture\": {\n       \"type\": \"number\",\n       \"description\": \"The aperture used to create the photo (f-number).\",\n       \"format\": \"float\"\n      },\n      \"cameraMake\": {\n       \"type\": \"string\",\n       \"description\": \"The make of the camera used to create the photo.\"\n      },\n      \"cameraModel\": {\n       \"type\": \"string\",\n       \"description\": \"The model of the camera used to create the photo.\"\n      },\n      \"colorSpace\": {\n       \"type\": \"string\",\n       \"description\": \"The color space of the photo.\"\n      },\n      \"exposureBias\": {\n       \"type\": \"number\",\n       \"description\": \"The exposure bias of the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"exposureMode\": {\n       \"type\": \"string\",\n       \"description\": \"The exposure mode used to create the photo.\"\n      },\n      \"exposureTime\": {\n       \"type\": \"number\",\n       \"description\": \"The length of the exposure, in seconds.\",\n       \"format\": \"float\"\n      },\n      \"flashUsed\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether a flash was used to create the photo.\"\n      },\n      \"focalLength\": {\n       \"type\": \"number\",\n       \"description\": \"The focal length used to create the photo, in millimeters.\",\n       \"format\": \"float\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the image in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"isoSpeed\": {\n       \"type\": \"integer\",\n       \"description\": \"The ISO speed used to create the photo.\",\n       \"format\": \"int32\"\n      },\n      \"lens\": {\n       \"type\": \"string\",\n       \"description\": \"The lens used to create the photo.\"\n      },\n      \"location\": {\n       \"type\": \"object\",\n       \"description\": \"Geographic location information stored in the image.\",\n       \"properties\": {\n        \"altitude\": {\n         \"type\": \"number\",\n         \"description\": \"The altitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"latitude\": {\n         \"type\": \"number\",\n         \"description\": \"The latitude stored in the image.\",\n         \"format\": \"double\"\n        },\n        \"longitude\": {\n         \"type\": \"number\",\n         \"description\": \"The longitude stored in the image.\",\n         \"format\": \"double\"\n        }\n       }\n      },\n      \"maxApertureValue\": {\n       \"type\": \"number\",\n       \"description\": \"The smallest f-number of the lens at the focal length used to create the photo (APEX value).\",\n       \"format\": \"float\"\n      },\n      \"meteringMode\": {\n       \"type\": \"string\",\n       \"description\": \"The metering mode used to create the photo.\"\n      },\n      \"rotation\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of clockwise 90 degree rotations applied from the image's original orientation.\",\n       \"format\": \"int32\"\n      },\n      \"sensor\": {\n       \"type\": \"string\",\n       \"description\": \"The type of sensor used to create the photo.\"\n      },\n      \"subjectDistance\": {\n       \"type\": \"integer\",\n       \"description\": \"The distance to the subject of the photo, in meters.\",\n       \"format\": \"int32\"\n      },\n      \"time\": {\n       \"type\": \"string\",\n       \"description\": \"The date and time the photo was taken (EXIF DateTime).\"\n      },\n      \"whiteBalance\": {\n       \"type\": \"string\",\n       \"description\": \"The white balance mode used to create the photo.\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the image in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"isAppAuthorized\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file was created or opened by the requesting app.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#file\\\".\",\n     \"default\": \"drive#file\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify the file.\"\n    },\n    \"linkShareMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Contains details about the link URLs that clients are using to refer to this item.\",\n     \"properties\": {\n      \"securityUpdateEligible\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the file is eligible for security update.\"\n      },\n      \"securityUpdateEnabled\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the security update is enabled for this file.\"\n      }\n     }\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum for the content of the file. This is only applicable to files with binary content in Google Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the file.\\nGoogle Drive will attempt to automatically detect an appropriate value from uploaded content if no value is provided. The value cannot be changed unless a new revision is uploaded.\\nIf a file is created with a Google Doc MIME type, the uploaded content will be imported if possible. The supported import formats are published in the About resource.\"\n    },\n    \"modifiedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been modified by this user.\"\n    },\n    \"modifiedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was modified by anyone (RFC 3339 date-time).\\nNote that setting modifiedTime will also update modifiedByMeTime for the user.\",\n     \"format\": \"date-time\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of the file. This is not necessarily unique within a folder. Note that for immutable items such as the top level folders of shared drives, My Drive root folder, and Application Data folder the name is constant.\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename of the uploaded content if available, or else the original value of the name field. This is only available for files with binary content in Google Drive.\"\n    },\n    \"ownedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user owns the file. Not populated for items in shared drives.\"\n    },\n    \"owners\": {\n     \"type\": \"array\",\n     \"description\": \"The owner of this file. Only certain legacy files may have more than one owner. This field isn't populated for items in shared drives.\",\n     \"items\": {\n      \"$ref\": \"User\"\n     }\n    },\n    \"parents\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs of the parent folders which contain the file.\\nIf not specified as part of a create request, the file will be placed directly in the user's My Drive folder. If not specified as part of a copy request, the file will inherit any discoverable parents of the source file. Update requests must use the addParents and removeParents parameters to modify the parents list.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissionIds\": {\n     \"type\": \"array\",\n     \"description\": \"List of permission IDs for users with access to this file.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for items in shared drives.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    },\n    \"properties\": {\n     \"type\": \"object\",\n     \"description\": \"A collection of arbitrary key-value pairs which are visible to all apps.\\nEntries with null values are cleared in update and copy requests.\",\n     \"additionalProperties\": {\n      \"type\": \"string\"\n     }\n    },\n    \"quotaBytesUsed\": {\n     \"type\": \"string\",\n     \"description\": \"The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with keepForever enabled.\",\n     \"format\": \"int64\"\n    },\n    \"resourceKey\": {\n     \"type\": \"string\",\n     \"description\": \"A key needed to access the item via a shared link.\"\n    },\n    \"shared\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been shared. Not populated for items in shared drives.\"\n    },\n    \"sharedWithMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"sharingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The user who shared the file with the requesting user, if applicable.\"\n    },\n    \"shortcutDetails\": {\n     \"type\": \"object\",\n     \"description\": \"Shortcut file details. Only populated for shortcut files, which have the mimeType field set to application/vnd.google-apps.shortcut.\",\n     \"properties\": {\n      \"targetId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file that this shortcut points to.\"\n      },\n      \"targetMimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the file that this shortcut points to. The value of this field is a snapshot of the target's MIME type, captured when the shortcut is created.\"\n      },\n      \"targetResourceKey\": {\n       \"type\": \"string\",\n       \"description\": \"The ResourceKey for the target file.\"\n      }\n     }\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the file's content in bytes. This is applicable to binary files in Google Drive and Google Docs files.\",\n     \"format\": \"int64\"\n    },\n    \"spaces\": {\n     \"type\": \"array\",\n     \"description\": \"The list of spaces which contain the file. The currently supported values are 'drive', 'appDataFolder' and 'photos'.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"starred\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the user has starred the file.\"\n    },\n    \"teamDriveId\": {\n     \"type\": \"string\",\n     \"description\": \"Deprecated - use driveId instead.\"\n    },\n    \"thumbnailLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Only populated when the requesting app can access the file's content. If the file isn't shared publicly, the URL returned in Files.thumbnailLink must be fetched using a credentialed request.\"\n    },\n    \"thumbnailVersion\": {\n     \"type\": \"string\",\n     \"description\": \"The thumbnail version for use in thumbnail cache invalidation.\",\n     \"format\": \"int64\"\n    },\n    \"trashed\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file. The trashed item is excluded from all files.list responses returned for any user who does not own the file. However, all users with access to the file can see the trashed item metadata in an API response. All users with access can copy, download, export, and share the file.\"\n    },\n    \"trashedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time that the item was trashed (RFC 3339 date-time). Only populated for items in shared drives.\",\n     \"format\": \"date-time\"\n    },\n    \"trashingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"If the file has been explicitly trashed, the user who trashed it. Only populated for items in shared drives.\"\n    },\n    \"version\": {\n     \"type\": \"string\",\n     \"description\": \"A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\",\n     \"format\": \"int64\"\n    },\n    \"videoMediaMetadata\": {\n     \"type\": \"object\",\n     \"description\": \"Additional metadata about video media. This may not be available immediately upon upload.\",\n     \"properties\": {\n      \"durationMillis\": {\n       \"type\": \"string\",\n       \"description\": \"The duration of the video in milliseconds.\",\n       \"format\": \"int64\"\n      },\n      \"height\": {\n       \"type\": \"integer\",\n       \"description\": \"The height of the video in pixels.\",\n       \"format\": \"int32\"\n      },\n      \"width\": {\n       \"type\": \"integer\",\n       \"description\": \"The width of the video in pixels.\",\n       \"format\": \"int32\"\n      }\n     }\n    },\n    \"viewedByMe\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the file has been viewed by this user.\"\n    },\n    \"viewedByMeTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the file was viewed by the user (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"viewersCanCopyContent\": {\n     \"type\": \"boolean\",\n     \"description\": \"Deprecated - use copyRequiresWriterPermission instead.\"\n    },\n    \"webContentLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for downloading the content of the file in a browser. This is only available for files with binary content in Google Drive.\"\n    },\n    \"webViewLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link for opening the file in a relevant Google editor or viewer in a browser.\"\n    },\n    \"writersCanShare\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether users with only writer permission can modify the file's permissions. Not populated for items in shared drives.\"\n    }\n   }\n  },\n  \"FileList\": {\n   \"id\": \"FileList\",\n   \"type\": \"object\",\n   \"description\": \"A list of files.\",\n   \"properties\": {\n    \"files\": {\n     \"type\": \"array\",\n     \"description\": \"The list of files. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"File\"\n     }\n    },\n    \"incompleteSearch\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the search process was incomplete. If true, then some search results may be missing, since all documents were not searched. This may occur when searching multiple drives with the \\\"allDrives\\\" corpora, but all corpora could not be searched. When this happens, it is suggested that clients narrow their query by choosing a different corpus such as \\\"user\\\" or \\\"drive\\\".\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#fileList\\\".\",\n     \"default\": \"drive#fileList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of files. This will be absent if the end of the files list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    }\n   }\n  },\n  \"GeneratedIds\": {\n   \"id\": \"GeneratedIds\",\n   \"type\": \"object\",\n   \"description\": \"A list of generated file IDs which can be provided in create requests.\",\n   \"properties\": {\n    \"ids\": {\n     \"type\": \"array\",\n     \"description\": \"The IDs generated for the requesting user in the specified space.\",\n     \"items\": {\n      \"type\": \"string\"\n     }\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#generatedIds\\\".\",\n     \"default\": \"drive#generatedIds\"\n    },\n    \"space\": {\n     \"type\": \"string\",\n     \"description\": \"The type of file that can be created with these IDs.\"\n    }\n   }\n  },\n  \"Permission\": {\n   \"id\": \"Permission\",\n   \"type\": \"object\",\n   \"description\": \"A permission for a file. A permission grants a user, group, domain or the world access to a file or a folder hierarchy.\",\n   \"properties\": {\n    \"allowFileDiscovery\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the permission allows the file to be discovered through search. This is only applicable for permissions of type domain or anyone.\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the account associated with this permission has been deleted. This field only pertains to user and group permissions.\"\n    },\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"The \\\"pretty\\\" name of the value of the permission. The following is a list of examples for each type of permission:  \\n- user - User's full name, as defined for their Google account, such as \\\"Joe Smith.\\\" \\n- group - Name of the Google Group, such as \\\"The Company Administrators.\\\" \\n- domain - String domain name, such as \\\"thecompany.com.\\\" \\n- anyone - No displayName is present.\"\n    },\n    \"domain\": {\n     \"type\": \"string\",\n     \"description\": \"The domain to which this permission refers.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user or group to which this permission refers.\"\n    },\n    \"expirationTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which this permission will expire (RFC 3339 date-time). Expiration times have the following restrictions:  \\n- They can only be set on user and group permissions \\n- The time must be in the future \\n- The time cannot be more than a year in the future\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this permission. This is a unique identifier for the grantee, and is published in User resources as permissionId. IDs should be treated as opaque values.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permission\\\".\",\n     \"default\": \"drive#permission\"\n    },\n    \"permissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Details of whether the permissions on this shared drive item are inherited or directly on this item. This is an output-only field which is present only for shared drive items.\",\n     \"readOnly\": true,\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Whether this permission is inherited. This field is always populated. This is an output-only field.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"The ID of the item from which this permission is inherited. This is an output-only field.\"\n       },\n       \"permissionType\": {\n        \"type\": \"string\",\n        \"description\": \"The permission type for this user. While new values may be added in future, the following are currently possible:  \\n- file \\n- member\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"The primary role for this user. While new values may be added in the future, the following are currently possible:  \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\"\n       }\n      }\n     }\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    },\n    \"role\": {\n     \"type\": \"string\",\n     \"description\": \"The role granted by this permission. While new values may be supported in the future, the following are currently allowed:  \\n- owner \\n- organizer \\n- fileOrganizer \\n- writer \\n- commenter \\n- reader\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    },\n    \"teamDrivePermissionDetails\": {\n     \"type\": \"array\",\n     \"description\": \"Deprecated - use permissionDetails instead.\",\n     \"readOnly\": true,\n     \"items\": {\n      \"type\": \"object\",\n      \"properties\": {\n       \"inherited\": {\n        \"type\": \"boolean\",\n        \"description\": \"Deprecated - use permissionDetails/inherited instead.\"\n       },\n       \"inheritedFrom\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/inheritedFrom instead.\"\n       },\n       \"role\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/role instead.\"\n       },\n       \"teamDrivePermissionType\": {\n        \"type\": \"string\",\n        \"description\": \"Deprecated - use permissionDetails/permissionType instead.\"\n       }\n      }\n     }\n    },\n    \"type\": {\n     \"type\": \"string\",\n     \"description\": \"The type of the grantee. Valid values are:  \\n- user \\n- group \\n- domain \\n- anyone  When creating a permission, if type is user or group, you must provide an emailAddress for the user or group. When type is domain, you must provide a domain. There isn't extra information required for a anyone type.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.permissions.create\"\n      ]\n     }\n    },\n    \"view\": {\n     \"type\": \"string\",\n     \"description\": \"Indicates the view for this permission. Only populated for permissions that belong to a view. published is the only supported value.\"\n    }\n   }\n  },\n  \"PermissionList\": {\n   \"id\": \"PermissionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of permissions for a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#permissionList\\\".\",\n     \"default\": \"drive#permissionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of permissions. This field will be absent if the end of the permissions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"permissions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of permissions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Permission\"\n     }\n    }\n   }\n  },\n  \"Reply\": {\n   \"id\": \"Reply\",\n   \"type\": \"object\",\n   \"description\": \"A reply to a comment on a file.\",\n   \"properties\": {\n    \"action\": {\n     \"type\": \"string\",\n     \"description\": \"The action the reply performed to the parent comment. Valid values are:  \\n- resolve \\n- reopen\"\n    },\n    \"author\": {\n     \"$ref\": \"User\",\n     \"description\": \"The author of the reply. The author's email address and permission ID will not be populated.\"\n    },\n    \"content\": {\n     \"type\": \"string\",\n     \"description\": \"The plain text content of the reply. This field is used for setting the content, while htmlContent should be displayed. This is required on creates if no action is specified.\",\n     \"annotations\": {\n      \"required\": [\n       \"drive.replies.update\"\n      ]\n     }\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the reply was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"deleted\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether the reply has been deleted. A deleted reply has no content.\"\n    },\n    \"htmlContent\": {\n     \"type\": \"string\",\n     \"description\": \"The content of the reply with HTML formatting.\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the reply.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#reply\\\".\",\n     \"default\": \"drive#reply\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the reply was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    }\n   }\n  },\n  \"ReplyList\": {\n   \"id\": \"ReplyList\",\n   \"type\": \"object\",\n   \"description\": \"A list of replies to a comment on a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#replyList\\\".\",\n     \"default\": \"drive#replyList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of replies. This will be absent if the end of the replies list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"replies\": {\n     \"type\": \"array\",\n     \"description\": \"The list of replies. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Reply\"\n     }\n    }\n   }\n  },\n  \"Revision\": {\n   \"id\": \"Revision\",\n   \"type\": \"object\",\n   \"description\": \"The metadata for a revision to a file.\",\n   \"properties\": {\n    \"exportLinks\": {\n     \"type\": \"object\",\n     \"description\": \"Links for exporting Docs Editors files to specific formats.\",\n     \"additionalProperties\": {\n      \"type\": \"string\",\n      \"description\": \"A mapping from export format to URL\"\n     }\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the revision.\"\n    },\n    \"keepForever\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether to keep this revision forever, even if it is no longer the head revision. If not set, the revision will be automatically purged 30 days after newer content is uploaded. This can be set on a maximum of 200 revisions for a file.\\nThis field is only applicable to files with binary content in Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revision\\\".\",\n     \"default\": \"drive#revision\"\n    },\n    \"lastModifyingUser\": {\n     \"$ref\": \"User\",\n     \"description\": \"The last user to modify this revision.\"\n    },\n    \"md5Checksum\": {\n     \"type\": \"string\",\n     \"description\": \"The MD5 checksum of the revision's content. This is only applicable to files with binary content in Drive.\"\n    },\n    \"mimeType\": {\n     \"type\": \"string\",\n     \"description\": \"The MIME type of the revision.\"\n    },\n    \"modifiedTime\": {\n     \"type\": \"string\",\n     \"description\": \"The last time the revision was modified (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"originalFilename\": {\n     \"type\": \"string\",\n     \"description\": \"The original filename used to create this revision. This is only applicable to files with binary content in Drive.\"\n    },\n    \"publishAuto\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether subsequent revisions will be automatically republished. This is only applicable to Docs Editors files.\"\n    },\n    \"published\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published. This is only applicable to Docs Editors files.\"\n    },\n    \"publishedLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the published revision. This is only populated for Google Sites files.\"\n    },\n    \"publishedOutsideDomain\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this revision is published outside the domain. This is only applicable to Docs Editors files.\"\n    },\n    \"size\": {\n     \"type\": \"string\",\n     \"description\": \"The size of the revision's content in bytes. This is only applicable to files with binary content in Drive.\",\n     \"format\": \"int64\"\n    }\n   }\n  },\n  \"RevisionList\": {\n   \"id\": \"RevisionList\",\n   \"type\": \"object\",\n   \"description\": \"A list of revisions of a file.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#revisionList\\\".\",\n     \"default\": \"drive#revisionList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of revisions. This will be absent if the end of the revisions list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"revisions\": {\n     \"type\": \"array\",\n     \"description\": \"The list of revisions. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"Revision\"\n     }\n    }\n   }\n  },\n  \"StartPageToken\": {\n   \"id\": \"StartPageToken\",\n   \"type\": \"object\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#startPageToken\\\".\",\n     \"default\": \"drive#startPageToken\"\n    },\n    \"startPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The starting page token for listing changes.\"\n    }\n   }\n  },\n  \"TeamDrive\": {\n   \"id\": \"TeamDrive\",\n   \"type\": \"object\",\n   \"description\": \"Deprecated: use the drive collection instead.\",\n   \"properties\": {\n    \"backgroundImageFile\": {\n     \"type\": \"object\",\n     \"description\": \"An image file and cropping parameters from which a background image for this Team Drive is set. This is a write only field; it can only be set on drive.teamdrives.update requests that don't set themeId. When specified, all fields of the backgroundImageFile must be set.\",\n     \"properties\": {\n      \"id\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of an image file in Drive to use for the background image.\"\n      },\n      \"width\": {\n       \"type\": \"number\",\n       \"description\": \"The width of the cropped image in the closed range of 0 to 1. This value represents the width of the cropped image divided by the width of the entire image. The height is computed by applying a width to height aspect ratio of 80 to 9. The resulting image must be at least 1280 pixels wide and 144 pixels high.\",\n       \"format\": \"float\"\n      },\n      \"xCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The X coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the horizontal distance from the left side of the entire image to the left side of the cropping area divided by the width of the entire image.\",\n       \"format\": \"float\"\n      },\n      \"yCoordinate\": {\n       \"type\": \"number\",\n       \"description\": \"The Y coordinate of the upper left corner of the cropping area in the background image. This is a value in the closed range of 0 to 1. This value represents the vertical distance from the top side of the entire image to the top side of the cropping area divided by the height of the entire image.\",\n       \"format\": \"float\"\n      }\n     }\n    },\n    \"backgroundImageLink\": {\n     \"type\": \"string\",\n     \"description\": \"A short-lived link to this Team Drive's background image.\"\n    },\n    \"capabilities\": {\n     \"type\": \"object\",\n     \"description\": \"Capabilities the current user has on this Team Drive.\",\n     \"properties\": {\n      \"canAddChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add children to folders in this Team Drive.\"\n      },\n      \"canChangeCopyRequiresWriterPermissionRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the copyRequiresWriterPermission restriction of this Team Drive.\"\n      },\n      \"canChangeDomainUsersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the domainUsersOnly restriction of this Team Drive.\"\n      },\n      \"canChangeTeamDriveBackground\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the background of this Team Drive.\"\n      },\n      \"canChangeTeamMembersOnlyRestriction\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can change the teamMembersOnly restriction of this Team Drive.\"\n      },\n      \"canComment\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can comment on files in this Team Drive.\"\n      },\n      \"canCopy\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can copy files in this Team Drive.\"\n      },\n      \"canDeleteChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete children from folders in this Team Drive.\"\n      },\n      \"canDeleteTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can delete this Team Drive. Attempting to delete the Team Drive may still fail if there are untrashed items inside the Team Drive.\"\n      },\n      \"canDownload\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can download files in this Team Drive.\"\n      },\n      \"canEdit\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can edit files in this Team Drive\"\n      },\n      \"canListChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can list the children of folders in this Team Drive.\"\n      },\n      \"canManageMembers\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can add members to this Team Drive or remove them or change their role.\"\n      },\n      \"canReadRevisions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can read the revisions resource of files in this Team Drive.\"\n      },\n      \"canRemoveChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated - use canDeleteChildren or canTrashChildren instead.\"\n      },\n      \"canRename\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename files or folders in this Team Drive.\"\n      },\n      \"canRenameTeamDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can rename this Team Drive.\"\n      },\n      \"canShare\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can share files or folders in this Team Drive.\"\n      },\n      \"canTrashChildren\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the current user can trash children from folders in this Team Drive.\"\n      }\n     }\n    },\n    \"colorRgb\": {\n     \"type\": \"string\",\n     \"description\": \"The color of this Team Drive as an RGB hex string. It can only be set on a drive.teamdrives.update request that does not set themeId.\"\n    },\n    \"createdTime\": {\n     \"type\": \"string\",\n     \"description\": \"The time at which the Team Drive was created (RFC 3339 date-time).\",\n     \"format\": \"date-time\"\n    },\n    \"id\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of this Team Drive which is also the ID of the top level folder of this Team Drive.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDrive\\\".\",\n     \"default\": \"drive#teamDrive\"\n    },\n    \"name\": {\n     \"type\": \"string\",\n     \"description\": \"The name of this Team Drive.\"\n    },\n    \"restrictions\": {\n     \"type\": \"object\",\n     \"description\": \"A set of restrictions that apply to this Team Drive or items inside this Team Drive.\",\n     \"properties\": {\n      \"adminManagedRestrictions\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether administrative privileges on this Team Drive are required to modify restrictions.\"\n      },\n      \"copyRequiresWriterPermission\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the options to copy, print, or download files inside this Team Drive, should be disabled for readers and commenters. When this restriction is set to true, it will override the similarly named field to true for any file inside this Team Drive.\"\n      },\n      \"domainUsersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to this Team Drive and items inside this Team Drive is restricted to users of the domain to which this Team Drive belongs. This restriction may be overridden by other sharing policies controlled outside of this Team Drive.\"\n      },\n      \"teamMembersOnly\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether access to items inside this Team Drive is restricted to members of this Team Drive.\"\n      }\n     }\n    },\n    \"themeId\": {\n     \"type\": \"string\",\n     \"description\": \"The ID of the theme from which the background image and color will be set. The set of possible teamDriveThemes can be retrieved from a drive.about.get response. When not specified on a drive.teamdrives.create request, a random theme is chosen from which the background image and color are set. This is a write-only field; it can only be set on requests that don't set colorRgb or backgroundImageFile.\"\n    }\n   }\n  },\n  \"TeamDriveList\": {\n   \"id\": \"TeamDriveList\",\n   \"type\": \"object\",\n   \"description\": \"A list of Team Drives.\",\n   \"properties\": {\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#teamDriveList\\\".\",\n     \"default\": \"drive#teamDriveList\"\n    },\n    \"nextPageToken\": {\n     \"type\": \"string\",\n     \"description\": \"The page token for the next page of Team Drives. This will be absent if the end of the Team Drives list has been reached. If the token is rejected for any reason, it should be discarded, and pagination should be restarted from the first page of results.\"\n    },\n    \"teamDrives\": {\n     \"type\": \"array\",\n     \"description\": \"The list of Team Drives. If nextPageToken is populated, then this list may be incomplete and an additional page of results should be fetched.\",\n     \"items\": {\n      \"$ref\": \"TeamDrive\"\n     }\n    }\n   }\n  },\n  \"User\": {\n   \"id\": \"User\",\n   \"type\": \"object\",\n   \"description\": \"Information about a Drive user.\",\n   \"properties\": {\n    \"displayName\": {\n     \"type\": \"string\",\n     \"description\": \"A plain text displayable name for this user.\"\n    },\n    \"emailAddress\": {\n     \"type\": \"string\",\n     \"description\": \"The email address of the user. This may not be present in certain contexts if the user has not made their email address visible to the requester.\"\n    },\n    \"kind\": {\n     \"type\": \"string\",\n     \"description\": \"Identifies what kind of resource this is. Value: the fixed string \\\"drive#user\\\".\",\n     \"default\": \"drive#user\"\n    },\n    \"me\": {\n     \"type\": \"boolean\",\n     \"description\": \"Whether this user is the requesting user.\"\n    },\n    \"permissionId\": {\n     \"type\": \"string\",\n     \"description\": \"The user's ID as visible in Permission resources.\"\n    },\n    \"photoLink\": {\n     \"type\": \"string\",\n     \"description\": \"A link to the user's profile photo, if available.\"\n    }\n   }\n  }\n },\n \"resources\": {\n  \"about\": {\n   \"methods\": {\n    \"get\": {\n     \"id\": \"drive.about.get\",\n     \"path\": \"about\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets information about the user, the user's Drive, and system capabilities.\",\n     \"response\": {\n      \"$ref\": \"About\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"changes\": {\n   \"methods\": {\n    \"getStartPageToken\": {\n     \"id\": \"drive.changes.getStartPageToken\",\n     \"path\": \"changes/startPageToken\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets the starting pageToken for listing future changes.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive for which the starting pageToken for listing future changes from that shared drive is returned.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"StartPageToken\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.changes.list\",\n     \"path\": \"changes\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the changes for a user or shared drive.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The shared drive from which changes are returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      },\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether both My Drive and shared drive items should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"response\": {\n      \"$ref\": \"ChangeList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    },\n    \"watch\": {\n     \"id\": \"drive.changes.watch\",\n     \"path\": \"changes/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes for a user.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The shared drive from which changes are returned. If specified the change IDs will be reflective of the shared drive; use the combined drive ID and change ID as an identifier.\",\n       \"location\": \"query\"\n      },\n      \"includeCorpusRemovals\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether changes should include the file resource if the file is still accessible by the user at the time of the request, even when a file was removed from the list of changes and there will be no further change entries for this file.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether both My Drive and shared drive items should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"includeRemoved\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include changes indicating that items have been removed from the list of changes, for example by deletion or loss of access.\",\n       \"default\": \"true\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of changes to return per page.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.\",\n       \"required\": true,\n       \"location\": \"query\"\n      },\n      \"restrictToMyDrive\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to restrict the results to changes inside the My Drive hierarchy. This omits changes to files such as those in the Application Data folder or shared files which have not been added to My Drive.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the user corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"pageToken\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"channels\": {\n   \"methods\": {\n    \"stop\": {\n     \"id\": \"drive.channels.stop\",\n     \"path\": \"channels/stop\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Stop watching resources through this channel\",\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    }\n   }\n  },\n  \"comments\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.comments.create\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new comment on a file.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.comments.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.comments.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a comment by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.comments.list\",\n     \"path\": \"files/{fileId}/comments\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's comments.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted comments. Deleted comments will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of comments to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"startModifiedTime\": {\n       \"type\": \"string\",\n       \"description\": \"The minimum value of 'modifiedTime' for the result comments (RFC 3339 date-time).\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"CommentList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.comments.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a comment with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Comment\"\n     },\n     \"response\": {\n      \"$ref\": \"Comment\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"drives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.drives.create\",\n     \"path\": \"drives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new shared drive.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a shared drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same shared drive. If the shared drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Drive\"\n     },\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.drives.delete\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a shared drive for which the user is an organizer. The shared drive cannot contain any untrashed items.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.drives.get\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a shared drive's metadata by ID.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"hide\": {\n     \"id\": \"drive.drives.hide\",\n     \"path\": \"drives/{driveId}/hide\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Hides a shared drive from the default view.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.drives.list\",\n     \"path\": \"drives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists the user's shared drives.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of shared drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for shared drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching shared drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then all shared drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"DriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"unhide\": {\n     \"id\": \"drive.drives.unhide\",\n     \"path\": \"drives/{driveId}/unhide\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Restores a shared drive to the default view.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.drives.update\",\n     \"path\": \"drives/{driveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates the metadate for a shared drive.\",\n     \"parameters\": {\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"driveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Drive\"\n     },\n     \"response\": {\n      \"$ref\": \"Drive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  },\n  \"files\": {\n   \"methods\": {\n    \"copy\": {\n     \"id\": \"drive.files.copy\",\n     \"path\": \"files/{fileId}/copy\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a copy of a file and applies any requested updates with patch semantics. Folders cannot be copied.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. Copying files into multiple folders is no longer supported. Use shortcuts instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\"\n     ]\n    },\n    \"create\": {\n     \"id\": \"drive.files.create\",\n     \"path\": \"files\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new file.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. Creating files in multiple folders is no longer supported.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ignoreDefaultVisibility\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files\"\n       }\n      }\n     },\n     \"supportsSubscription\": true\n    },\n    \"delete\": {\n     \"id\": \"drive.files.delete\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file owned by the user without moving it to the trash. If the file belongs to a shared drive the user must be an organizer on the parent. If the target is a folder, all descendants owned by the user are also deleted.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. If an item is not in a shared drive and its last parent is deleted but the item itself is not, the item will be placed under its owner's root.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"emptyTrash\": {\n     \"id\": \"drive.files.emptyTrash\",\n     \"path\": \"files/trash\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes all of the user's trashed files.\",\n     \"parameters\": {\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. If an item is not in a shared drive and its last parent is deleted but the item itself is not, the item will be placed under its owner's root.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"export\": {\n     \"id\": \"drive.files.export\",\n     \"path\": \"files/{fileId}/export\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Exports a Google Doc to the requested MIME type and returns the exported content. Please note that the exported content is limited to 10MB.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"mimeType\": {\n       \"type\": \"string\",\n       \"description\": \"The MIME type of the format requested for this export.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"mimeType\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true\n    },\n    \"generateIds\": {\n     \"id\": \"drive.files.generateIds\",\n     \"path\": \"files/generateIds\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Generates a set of file IDs which can be provided in create or copy requests.\",\n     \"parameters\": {\n      \"count\": {\n       \"type\": \"integer\",\n       \"description\": \"The number of IDs to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"space\": {\n       \"type\": \"string\",\n       \"description\": \"The space in which the IDs can be used to create new files. Supported values are 'drive' and 'appDataFolder'. (Default: 'drive')\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"type\": {\n       \"type\": \"string\",\n       \"description\": \"The type of items which the IDs can be used for. Supported values are 'files' and 'shortcuts'. Note that 'shortcuts' are only supported in the drive 'space'. (Default: 'files')\",\n       \"default\": \"files\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"GeneratedIds\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.files.get\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a file's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    },\n    \"list\": {\n     \"id\": \"drive.files.list\",\n     \"path\": \"files\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists or searches files.\",\n     \"parameters\": {\n      \"corpora\": {\n       \"type\": \"string\",\n       \"description\": \"Groupings of files to which the query applies. Supported groupings are: 'user' (files created by, opened by, or shared directly with the user), 'drive' (files in the specified shared drive as indicated by the 'driveId'), 'domain' (files shared to the user's domain), and 'allDrives' (A combination of 'user' and 'drive' for all drives where the user is a member). When able, use 'user' or 'drive', instead of 'allDrives', for efficiency.\",\n       \"location\": \"query\"\n      },\n      \"corpus\": {\n       \"type\": \"string\",\n       \"description\": \"The source of files to list. Deprecated: use 'corpora' instead.\",\n       \"enum\": [\n        \"domain\",\n        \"user\"\n       ],\n       \"enumDescriptions\": [\n        \"Files shared to the user's domain.\",\n        \"Files owned by or shared to the user. If a user has permissions on a Shared Drive, the files inside it won't be retrieved unless the user has created, opened, or shared the file.\"\n       ],\n       \"location\": \"query\"\n      },\n      \"driveId\": {\n       \"type\": \"string\",\n       \"description\": \"ID of the shared drive to search.\",\n       \"location\": \"query\"\n      },\n      \"includeItemsFromAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether both My Drive and shared drive items should be included in results.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"includeTeamDriveItems\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use includeItemsFromAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"orderBy\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of files to return per page. Partial or empty result pages are possible even before the end of the files list has been reached.\",\n       \"default\": \"100\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"A query for filtering the file results. See the \\\"Search for Files\\\" guide for supported syntax.\",\n       \"location\": \"query\"\n      },\n      \"spaces\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.\",\n       \"default\": \"drive\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"Deprecated use driveId instead.\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"FileList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.files.update\",\n     \"path\": \"files/{fileId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a file's metadata and/or content. This method supports patch semantics.\",\n     \"parameters\": {\n      \"addParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to add.\",\n       \"location\": \"query\"\n      },\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. Adding files to multiple folders is no longer supported. Use shortcuts instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"keepRevisionForever\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to set the 'keepForever' field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"ocrLanguage\": {\n       \"type\": \"string\",\n       \"description\": \"A language hint for OCR processing during image import (ISO 639-1 code).\",\n       \"location\": \"query\"\n      },\n      \"removeParents\": {\n       \"type\": \"string\",\n       \"description\": \"A comma-separated list of parent IDs to remove.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useContentAsIndexableText\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to use the uploaded content as indexable text.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"File\"\n     },\n     \"response\": {\n      \"$ref\": \"File\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.scripts\"\n     ],\n     \"supportsMediaUpload\": true,\n     \"mediaUpload\": {\n      \"accept\": [\n       \"*/*\"\n      ],\n      \"maxSize\": \"5120GB\",\n      \"protocols\": {\n       \"simple\": {\n        \"multipart\": true,\n        \"path\": \"/upload/drive/v3/files/{fileId}\"\n       },\n       \"resumable\": {\n        \"multipart\": true,\n        \"path\": \"/resumable/upload/drive/v3/files/{fileId}\"\n       }\n      }\n     }\n    },\n    \"watch\": {\n     \"id\": \"drive.files.watch\",\n     \"path\": \"files/{fileId}/watch\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Subscribes to changes to a file\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Channel\",\n      \"parameterName\": \"resource\"\n     },\n     \"response\": {\n      \"$ref\": \"Channel\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true,\n     \"supportsSubscription\": true\n    }\n   }\n  },\n  \"permissions\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.permissions.create\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a permission for a file or shared drive.\",\n     \"parameters\": {\n      \"emailMessage\": {\n       \"type\": \"string\",\n       \"description\": \"A plain text custom message to include in the notification email.\",\n       \"location\": \"query\"\n      },\n      \"enforceSingleParent\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated. See moveToNewOwnersRoot for details.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"moveToNewOwnersRoot\": {\n       \"type\": \"boolean\",\n       \"description\": \"This parameter will only take effect if the item is not in a shared drive and the request is attempting to transfer the ownership of the item. If set to true, the item will be moved to the new owner's My Drive root folder and all prior parents removed. If set to false, parents are not changed.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"sendNotificationEmail\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to send a notification email when sharing to users or groups. This defaults to true for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.permissions.delete\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a permission.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.permissions.get\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a permission by ID.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.permissions.list\",\n     \"path\": \"files/{fileId}/permissions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's or shared drive's permissions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includePermissionsForView\": {\n       \"type\": \"string\",\n       \"description\": \"Specifies which additional view's permissions to include in the response. Only 'published' is supported.\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of permissions to return per page. When not set for files in a shared drive, at most 100 results will be returned. When not set for files that are not in a shared drive, the entire list will be returned.\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"PermissionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.permissions.update\",\n     \"path\": \"files/{fileId}/permissions/{permissionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a permission with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file or shared drive.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"permissionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the permission.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"removeExpiration\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to remove the expiration date.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsAllDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the requesting application supports both My Drives and shared drives.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"supportsTeamDrives\": {\n       \"type\": \"boolean\",\n       \"description\": \"Deprecated use supportsAllDrives instead.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"transferOwnership\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if the file ID parameter refers to a shared drive and the requester is an administrator of the domain to which the shared drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"permissionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Permission\"\n     },\n     \"response\": {\n      \"$ref\": \"Permission\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"replies\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.replies.create\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Creates a new reply to a comment.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.replies.delete\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deletes a reply.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.replies.get\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a reply by ID.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to return deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.replies.list\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a comment's replies.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"includeDeleted\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether to include deleted replies. Deleted replies will not include their original content.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of replies to return per page.\",\n       \"default\": \"20\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\"\n     ],\n     \"response\": {\n      \"$ref\": \"ReplyList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.replies.update\",\n     \"path\": \"files/{fileId}/comments/{commentId}/replies/{replyId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a reply with patch semantics.\",\n     \"parameters\": {\n      \"commentId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the comment.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"replyId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the reply.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"commentId\",\n      \"replyId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Reply\"\n     },\n     \"response\": {\n      \"$ref\": \"Reply\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"revisions\": {\n   \"methods\": {\n    \"delete\": {\n     \"id\": \"drive.revisions.delete\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Permanently deletes a file version. You can only delete revisions for files with binary content in Google Drive, like images or videos. Revisions for other files, like Google Docs or Sheets, and the last remaining file version can't be deleted.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.revisions.get\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Gets a revision's metadata or content by ID.\",\n     \"parameters\": {\n      \"acknowledgeAbuse\": {\n       \"type\": \"boolean\",\n       \"description\": \"Whether the user is acknowledging the risk of downloading known malware or other abusive files. This is only applicable when alt=media.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      },\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ],\n     \"supportsMediaDownload\": true,\n     \"useMediaDownloadService\": true\n    },\n    \"list\": {\n     \"id\": \"drive.revisions.list\",\n     \"path\": \"files/{fileId}/revisions\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Lists a file's revisions.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"The maximum number of revisions to return per page.\",\n       \"default\": \"200\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"1000\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\"\n     ],\n     \"response\": {\n      \"$ref\": \"RevisionList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\",\n      \"https://www.googleapis.com/auth/drive.metadata\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/drive.photos.readonly\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.revisions.update\",\n     \"path\": \"files/{fileId}/revisions/{revisionId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Updates a revision with patch semantics.\",\n     \"parameters\": {\n      \"fileId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the file.\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"revisionId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the revision.\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"fileId\",\n      \"revisionId\"\n     ],\n     \"request\": {\n      \"$ref\": \"Revision\"\n     },\n     \"response\": {\n      \"$ref\": \"Revision\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.appdata\",\n      \"https://www.googleapis.com/auth/drive.file\"\n     ]\n    }\n   }\n  },\n  \"teamdrives\": {\n   \"methods\": {\n    \"create\": {\n     \"id\": \"drive.teamdrives.create\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"POST\",\n     \"description\": \"Deprecated use drives.create instead.\",\n     \"parameters\": {\n      \"requestId\": {\n       \"type\": \"string\",\n       \"description\": \"An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.\",\n       \"required\": true,\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"requestId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"delete\": {\n     \"id\": \"drive.teamdrives.delete\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"DELETE\",\n     \"description\": \"Deprecated use drives.delete instead.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    },\n    \"get\": {\n     \"id\": \"drive.teamdrives.get\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Deprecated use drives.get instead.\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"list\": {\n     \"id\": \"drive.teamdrives.list\",\n     \"path\": \"teamdrives\",\n     \"httpMethod\": \"GET\",\n     \"description\": \"Deprecated use drives.list instead.\",\n     \"parameters\": {\n      \"pageSize\": {\n       \"type\": \"integer\",\n       \"description\": \"Maximum number of Team Drives to return.\",\n       \"default\": \"10\",\n       \"format\": \"int32\",\n       \"minimum\": \"1\",\n       \"maximum\": \"100\",\n       \"location\": \"query\"\n      },\n      \"pageToken\": {\n       \"type\": \"string\",\n       \"description\": \"Page token for Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"q\": {\n       \"type\": \"string\",\n       \"description\": \"Query string for searching Team Drives.\",\n       \"location\": \"query\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then all Team Drives of the domain in which the requester is an administrator are returned.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"response\": {\n      \"$ref\": \"TeamDriveList\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n     ]\n    },\n    \"update\": {\n     \"id\": \"drive.teamdrives.update\",\n     \"path\": \"teamdrives/{teamDriveId}\",\n     \"httpMethod\": \"PATCH\",\n     \"description\": \"Deprecated use drives.update instead\",\n     \"parameters\": {\n      \"teamDriveId\": {\n       \"type\": \"string\",\n       \"description\": \"The ID of the Team Drive\",\n       \"required\": true,\n       \"location\": \"path\"\n      },\n      \"useDomainAdminAccess\": {\n       \"type\": \"boolean\",\n       \"description\": \"Issue the request as a domain administrator; if set to true, then the requester will be granted access if they are an administrator of the domain to which the Team Drive belongs.\",\n       \"default\": \"false\",\n       \"location\": \"query\"\n      }\n     },\n     \"parameterOrder\": [\n      \"teamDriveId\"\n     ],\n     \"request\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"response\": {\n      \"$ref\": \"TeamDrive\"\n     },\n     \"scopes\": [\n      \"https://www.googleapis.com/auth/drive\"\n     ]\n    }\n   }\n  }\n }\n}\n\n"
  },
  {
    "path": "googledrive.Rproj",
    "content": "Version: 1.0\n\nRestoreWorkspace: Default\nSaveWorkspace: Default\nAlwaysSaveHistory: Default\n\nEnableCodeIndexing: Yes\nUseSpacesForTab: Yes\nNumSpacesForTab: 2\nEncoding: UTF-8\n\nRnwWeave: Sweave\nLaTeX: pdfLaTeX\n\nAutoAppendNewline: Yes\nStripTrailingWhitespace: Yes\n\nBuildType: Package\nPackageUseDevtools: Yes\nPackageInstallArgs: --no-multiarch --with-keep.source\nPackageCheckArgs: --no-vignettes --no-build-vignettes\nPackageRoxygenize: rd,collate,namespace\n"
  },
  {
    "path": "index.Rmd",
    "content": "---\noutput: github_document\n---\n\n```{r setup, include = FALSE}\nauth_success <- tryCatch(\n  googledrive:::drive_auth_docs(),\n  googledrive_auth_internal_error = function(e) e\n)\n\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  error = TRUE,\n  purl = googledrive::drive_has_token(),\n  eval = googledrive::drive_has_token()\n)\n```\n\n```{r eval = !googledrive::drive_has_token(), echo = FALSE, comment = NA}\ngoogledrive:::drive_bullets(c(\n  \"Code chunks will not be evaluated, because:\",\n  strsplit(auth_success$message, split = \"\\n\")[[1]]\n))\ngoogledrive::drive_deauth()\n```\n\n# googledrive\n\n<!-- badges: start -->\n[![CRAN status](https://www.r-pkg.org/badges/version/googledrive)](https://CRAN.R-project.org/package=googledrive)\n[![R-CMD-check](https://github.com/tidyverse/googledrive/workflows/R-CMD-check/badge.svg)](https://github.com/tidyverse/googledrive/actions)\n[![Codecov test coverage](https://codecov.io/gh/tidyverse/googledrive/branch/main/graph/badge.svg)](https://codecov.io/gh/tidyverse/googledrive?branch=main)\n<!-- badges: end -->\n\n## Overview\n\ngoogledrive allows you to interact with files on Google Drive from R.\n\n## Installation\n\nInstall from CRAN:\n\n```{r, eval = FALSE}\ninstall.packages(\"googledrive\")\n```\n\n## Usage\n\n### Load googledrive\n\n```{r}\nlibrary(\"googledrive\")\n```\n\n```{r drive-setup, eval = FALSE, include = FALSE}\n# This chunk contains code to setup all the files necessary for this document\n# to make sense, starting from a blank slate. Likewise, it contains code to\n# delete those same files.\n#\n# It is meant to be run occasionally, interactively, by a human maintainer.\n# So far, I can't think of anywhere better to put this.\n#\n# The visible, executable chunks may also create files, in which case the\n# necessary clean up code shall also be visible and executable.\n\nCLEAN <- SETUP <- FALSE\n\nexamples <- drive_examples_remote()\nbuiltin <- c(\n  system.file(\"DESCRIPTION\"),\n  R.home(\"doc/html/Rlogo.svg\"),\n  R.home(\"doc/BioC_mirrors.csv\"),\n  R.home(\"doc/THANKS\")\n)\n\nif (isTRUE(SETUP)) {\n  purrr::map2(\n    examples$id,\n    examples$name,\n    ~ drive_cp(as_id(.x), name = .y)\n  )\n  purrr::map(builtin, ~ drive_upload(.x))\n\n  drive_mkdir(\"abc\")\n  abc_def <- drive_mkdir(\"abc/def\")\n  drive_upload(\n    system.file(\"NEWS.md\", package = \"googledrive\"),\n    path = abc_def,\n    name = \"googledrive-NEWS.md\"\n  )\n\n  THANKS <- drive_get(\"THANKS\")\n  r_logo <- drive_get(\"r_logo.jpg\")\n  x <- list(THANKS, r_logo)\n  purrr::map(x, ~ drive_update(.x, starred = TRUE))\n  purrr::map(x, ~ drive_share(.x, role = \"reader\", type = \"anyone\"))\n}\n\nif (isTRUE(CLEAN)) {\n  drive_rm(examples)\n  drive_rm(basename(builtin))\n  drive_rm(\"abc/\")\n  drive_rm(drive_find(\"index-chicken\"))\n}\n```\n\n### Package conventions\n\n* Most functions begin with the prefix `drive_`. Auto-completion is your friend.\n* Goal is to allow Drive access that feels similar to Unix file system utilities, e.g., `find`, `ls`, `mv`, `cp`, `mkdir`, and `rm`.\n* The metadata for one or more Drive files is held in a `dribble`, a \"Drive tibble\". This is a data frame with one row per file. A dribble is returned (and accepted) by almost every function in googledrive. Design goals:\n  - Give humans what they want: the file name\n  - Track what the API wants: the file ID\n  - Hold on to all the other metadata sent back by the API\n* googledrive is \"pipe-friendly\" (either the base `|>` or magrittr `%>%` pipe), but does not require its use.\n\n### Quick demo\n\nHere's how to list up to `n_max` of the files you see in [My Drive](https://drive.google.com). You can expect to be sent to your browser here, to authenticate yourself and authorize the googledrive package to deal on your behalf with Google Drive.\n\n```{r}\ndrive_find(n_max = 30)\n```\n\nYou can narrow the query by specifying a `pattern` you'd like to match names against. Or by specifying a file type: the `type` argument understands MIME types, file extensions, and a few human-friendly keywords.\n\n```{r eval = FALSE}\ndrive_find(pattern = \"chicken\")\ndrive_find(type = \"spreadsheet\") ## Google Sheets!\ndrive_find(type = \"csv\") ## MIME type = \"text/csv\"\ndrive_find(type = \"application/pdf\") ## MIME type = \"application/pdf\"\n```\n\nAlternatively, you can refine the search using the `q` query parameter. Accepted search clauses can be found in the [Google Drive API documentation](https://developers.google.com/drive/v3/web/search-parameters). For example, to see all files that you've starred and that are readable by \"anyone with a link\", do this:\n\n```{r}\n(files <- drive_find(q = c(\"starred = true\", \"visibility = 'anyoneWithLink'\")))\n```\n\nYou generally want to store the result of a googledrive call, as we do with `files` above. `files` is a dribble with info on several files and can be used as the input for downstream calls. It can also be manipulated as a regular data frame at any point.\n\n#### Identify files\n\n`drive_find()` searches by file properties, but you can also identify files by name (path, really) or by Drive file id using `drive_get()`.\n\n```{r}\n(x <- drive_get(\"~/abc/def/googledrive-NEWS.md\"))\n```\n\n`as_id()` can be used to convert various inputs into a marked vector of file ids. It works on file ids (for obvious reasons!), various forms of Drive URLs, and `dribble`s.\n\n```{r}\nx$id\n\n# let's retrieve same file by id (also a great way to force-refresh metadata)\ndrive_get(x$id)\ndrive_get(as_id(x))\n```\n\nIn general, googledrive functions that operate on files allow you to specify the file(s) by name/path, file id, or in a `dribble`. If it's ambiguous, use `as_id()` to mark a character vector as holding Drive file ids as opposed to file paths. This function can also extract file ids from various URLs.\n\n#### Upload files\n\nWe can upload any file type.\n\n```{r}\n(chicken <- drive_upload(\n  drive_example_local(\"chicken.csv\"),\n  \"index-chicken.csv\"\n))\n```\n\nNotice that file was uploaded as `text/csv`. Since this was a `.csv` document, and we didn't specify the type, googledrive guessed the MIME type. We can overrule this by using the `type` parameter to upload as a Google Spreadsheet. Let's delete this file first.\n\n```{r}\ndrive_rm(chicken)\n\n# example of using a dribble as input\nchicken_sheet <- drive_example_local(\"chicken.csv\") |>\n  drive_upload(\n    name = \"index-chicken-sheet\",\n    type = \"spreadsheet\"\n  )\n```\n\nMuch better!\n\n#### Share files\n\nTo allow other people to access your file, you need to change the sharing permissions. You can check the sharing status by running `drive_reveal(..., \"permissions\")`, which adds a logical column `shared` and parks more detailed metadata in a `permissions_resource` variable.\n\n```{r}\nchicken_sheet |>\n  drive_reveal(\"permissions\")\n```\n\nHere's how to grant anyone with the link permission to view this data set.\n\n```{r}\n(chicken_sheet <- chicken_sheet |>\n  drive_share(role = \"reader\", type = \"anyone\"))\n```\n\nThis comes up so often, there's even a convenience wrapper, `drive_share_anyone()`.\n\n#### Publish files\n\nVersions of Google Documents, Sheets, and Presentations can be published online. You can check your publication status by running `drive_reveal(..., \"published\")`, which adds a logical column `published` and parks more detailed metadata in a `revision_resource` variable.\n\n```{r}\nchicken_sheet |>\n  drive_reveal(\"published\")\n```\n\nBy default, `drive_publish()` will publish your most recent version.\n\n```{r}\n(chicken_sheet <- drive_publish(chicken_sheet))\n```\n\n#### Download files\n\n##### Google files\n\nWe can download files from Google Drive. Native Google file types (such as Google Documents, Google Sheets, Google Slides, etc.) need to be exported to some conventional file type. There are reasonable defaults or you can specify this explicitly via `type` or implicitly via the file extension in `path`. For example, if I would like to download the \"chicken_sheet\" Google Sheet as a `.csv` I could run the following.\n\n```{r}\ndrive_download(\"index-chicken-sheet\", type = \"csv\")\n```\n\nAlternatively, I could specify type via the `path` parameter.\n\n```{r}\ndrive_download(\n  \"index-chicken-sheet\",\n  path = \"index-chicken-sheet.csv\",\n  overwrite = TRUE\n)\n```\n\nNotice in the example above, I specified `overwrite = TRUE`, in order to overwrite the local csv file previously saved.\n\nFinally, you could just allow export to the default type. In the case of Google Sheets, this is an Excel workbook:\n\n```{r}\ndrive_download(\"index-chicken-sheet\")\n```\n\n##### All other files\n\nDownloading files that are *not* Google type files is even simpler, i.e. it does not require any conversion or type info.\n\n```{r}\n# download it and prove we got it\ndrive_download(\"chicken.txt\")\nreadLines(\"chicken.txt\") |> head()\n```\n\n#### Clean up\n\n```{r}\nfile.remove(c(\n  \"index-chicken-sheet.csv\",\n  \"index-chicken-sheet.xlsx\",\n  \"chicken.txt\"\n))\ndrive_find(\"index-chicken\") |> drive_rm()\n```\n\n## Privacy\n\n[Privacy policy](https://www.tidyverse.org/google_privacy_policy)\n"
  },
  {
    "path": "index.md",
    "content": "\n# googledrive\n\n<!-- badges: start -->\n\n[![CRAN\nstatus](https://www.r-pkg.org/badges/version/googledrive)](https://CRAN.R-project.org/package=googledrive)\n[![R-CMD-check](https://github.com/tidyverse/googledrive/workflows/R-CMD-check/badge.svg)](https://github.com/tidyverse/googledrive/actions)\n[![Codecov test\ncoverage](https://codecov.io/gh/tidyverse/googledrive/branch/main/graph/badge.svg)](https://codecov.io/gh/tidyverse/googledrive?branch=main)\n<!-- badges: end -->\n\n## Overview\n\ngoogledrive allows you to interact with files on Google Drive from R.\n\n## Installation\n\nInstall from CRAN:\n\n``` r\ninstall.packages(\"googledrive\")\n```\n\n## Usage\n\n### Load googledrive\n\n``` r\nlibrary(\"googledrive\")\n```\n\n### Package conventions\n\n- Most functions begin with the prefix `drive_`. Auto-completion is your\n  friend.\n- Goal is to allow Drive access that feels similar to Unix file system\n  utilities, e.g., `find`, `ls`, `mv`, `cp`, `mkdir`, and `rm`.\n- The metadata for one or more Drive files is held in a `dribble`, a\n  “Drive tibble”. This is a data frame with one row per file. A dribble\n  is returned (and accepted) by almost every function in googledrive.\n  Design goals:\n  - Give humans what they want: the file name\n  - Track what the API wants: the file ID\n  - Hold on to all the other metadata sent back by the API\n- googledrive is “pipe-friendly” (either the base `|>` or magrittr `%>%`\n  pipe), but does not require its use.\n\n### Quick demo\n\nHere’s how to list up to `n_max` of the files you see in [My\nDrive](https://drive.google.com). You can expect to be sent to your\nbrowser here, to authenticate yourself and authorize the googledrive\npackage to deal on your behalf with Google Drive.\n\n``` r\ndrive_find(n_max = 30)\n#> # A dribble: 30 × 3\n#>    name                       id                                drive_resource\n#>    <chr>                      <drv_id>                          <list>        \n#>  1 chicken_poem.txt           1lAxO_zr06v6pL6dyQJ9duwH1j2ztQ3lB <named list>  \n#>  2 2021-09-16_r_logo.jpg      1dandXB0QZpjeGQq_56wTXKNwaqgsOa9D <named list>  \n#>  3 2021-09-16_r_about.html    1XfCI_orH4oNUZh06C4w6vXtno-BT_zmZ <named list>  \n#>  4 2021-09-16_imdb_latin1.csv 163YPvqYmGuqQiEwEFLg2s1URq4EnpkBw <named list>  \n#>  5 2021-09-16_chicken.txt     1axJz8GSmecSnaYBx0Sb3Gb-SXVaTzKw7 <named list>  \n#>  6 2021-09-16_chicken.pdf     14Hd6_VQAeEgcwBBJamc-FUlnXhp117T2 <named list>  \n#>  7 2021-09-16_chicken.jpg     1aslW1T-B8UKzAEotDWpmRFaMyMux5-it <named list>  \n#>  8 2021-09-16_chicken.csv     1Mj--zJYZJSMKsNVjk2tYFef5LnCsNoDT <named list>  \n#>  9 pqr                        143iq-CswFTwJTjVfKkcFMDW0jYqDeUj2 <named list>  \n#> 10 mno                        1gcUTnFbsF6uioJrLCsVQ78_F1wEzyNtI <named list>  \n#> # ℹ 20 more rows\n```\n\nYou can narrow the query by specifying a `pattern` you’d like to match\nnames against. Or by specifying a file type: the `type` argument\nunderstands MIME types, file extensions, and a few human-friendly\nkeywords.\n\n``` r\ndrive_find(pattern = \"chicken\")\ndrive_find(type = \"spreadsheet\") ## Google Sheets!\ndrive_find(type = \"csv\") ## MIME type = \"text/csv\"\ndrive_find(type = \"application/pdf\") ## MIME type = \"application/pdf\"\n```\n\nAlternatively, you can refine the search using the `q` query parameter.\nAccepted search clauses can be found in the [Google Drive API\ndocumentation](https://developers.google.com/drive/v3/web/search-parameters).\nFor example, to see all files that you’ve starred and that are readable\nby “anyone with a link”, do this:\n\n``` r\n(files <- drive_find(q = c(\"starred = true\", \"visibility = 'anyoneWithLink'\")))\n#> # A dribble: 2 × 3\n#>   name       id                                drive_resource   \n#>   <chr>      <drv_id>                          <list>           \n#> 1 r_logo.jpg 1wFAZdmBiSRu4GShsqurxD7wIDSCZvPud <named list [45]>\n#> 2 THANKS     19URV7BT0_E1KhYdfDODszK5aiELOwTSz <named list [44]>\n```\n\nYou generally want to store the result of a googledrive call, as we do\nwith `files` above. `files` is a dribble with info on several files and\ncan be used as the input for downstream calls. It can also be\nmanipulated as a regular data frame at any point.\n\n#### Identify files\n\n`drive_find()` searches by file properties, but you can also identify\nfiles by name (path, really) or by Drive file id using `drive_get()`.\n\n``` r\n(x <- drive_get(\"~/abc/def/googledrive-NEWS.md\"))\n#> ✔ The input `path` resolved to exactly 1 file.\n#> # A dribble: 1 × 4\n#>   name                path                          id       drive_resource   \n#>   <chr>               <chr>                         <drv_id> <list>           \n#> 1 googledrive-NEWS.md ~/abc/def/googledrive-NEWS.md 1h1lhFf… <named list [43]>\n```\n\n`as_id()` can be used to convert various inputs into a marked vector of\nfile ids. It works on file ids (for obvious reasons!), various forms of\nDrive URLs, and `dribble`s.\n\n``` r\nx$id\n#> <drive_id[1]>\n#> [1] 1h1lhFfQrDZevE2OEX10-rbi2BfvGogFm\n\n# let's retrieve same file by id (also a great way to force-refresh metadata)\ndrive_get(x$id)\n#> # A dribble: 1 × 3\n#>   name                id                                drive_resource   \n#>   <chr>               <drv_id>                          <list>           \n#> 1 googledrive-NEWS.md 1h1lhFfQrDZevE2OEX10-rbi2BfvGogFm <named list [43]>\ndrive_get(as_id(x))\n#> # A dribble: 1 × 3\n#>   name                id                                drive_resource   \n#>   <chr>               <drv_id>                          <list>           \n#> 1 googledrive-NEWS.md 1h1lhFfQrDZevE2OEX10-rbi2BfvGogFm <named list [43]>\n```\n\nIn general, googledrive functions that operate on files allow you to\nspecify the file(s) by name/path, file id, or in a `dribble`. If it’s\nambiguous, use `as_id()` to mark a character vector as holding Drive\nfile ids as opposed to file paths. This function can also extract file\nids from various URLs.\n\n#### Upload files\n\nWe can upload any file type.\n\n``` r\n(chicken <- drive_upload(\n  drive_example_local(\"chicken.csv\"),\n  \"index-chicken.csv\"\n))\n#> Local file:\n#> • '/private/tmp/RtmpGEYKuq/temp_libpath1508f36719bd2/googledrive/extdata/example_files/chicken.csv'\n#> Uploaded into Drive file:\n#> • 'index-chicken.csv' <id: 1y3rPXUnBhqW7ay6oBbfsNauc4UZ8dwpw>\n#> With MIME type:\n#> • 'text/csv'\n#> # A dribble: 1 × 3\n#>   name              id                                drive_resource   \n#>   <chr>             <drv_id>                          <list>           \n#> 1 index-chicken.csv 1y3rPXUnBhqW7ay6oBbfsNauc4UZ8dwpw <named list [43]>\n```\n\nNotice that file was uploaded as `text/csv`. Since this was a `.csv`\ndocument, and we didn’t specify the type, googledrive guessed the MIME\ntype. We can overrule this by using the `type` parameter to upload as a\nGoogle Spreadsheet. Let’s delete this file first.\n\n``` r\ndrive_rm(chicken)\n#> File deleted:\n#> • 'index-chicken.csv' <id: 1y3rPXUnBhqW7ay6oBbfsNauc4UZ8dwpw>\n\n# example of using a dribble as input\nchicken_sheet <- drive_example_local(\"chicken.csv\") |>\n  drive_upload(\n    name = \"index-chicken-sheet\",\n    type = \"spreadsheet\"\n  )\n#> Local file:\n#> • '/private/tmp/RtmpGEYKuq/temp_libpath1508f36719bd2/googledrive/extdata/example_files/chicken.csv'\n#> Uploaded into Drive file:\n#> • 'index-chicken-sheet' <id: 1RnvPDsw19uUKqY8K01N8m-7XViOdsz4fFotBlqnUIWU>\n#> With MIME type:\n#> • 'application/vnd.google-apps.spreadsheet'\n```\n\nMuch better!\n\n#### Share files\n\nTo allow other people to access your file, you need to change the\nsharing permissions. You can check the sharing status by running\n`drive_reveal(..., \"permissions\")`, which adds a logical column `shared`\nand parks more detailed metadata in a `permissions_resource` variable.\n\n``` r\nchicken_sheet |>\n  drive_reveal(\"permissions\")\n#> # A dribble: 1 × 5\n#>   name                shared id       drive_resource    permissions_resource\n#>   <chr>               <lgl>  <drv_id> <list>            <list>              \n#> 1 index-chicken-sheet FALSE  1RnvPDs… <named list [37]> <named list [2]>\n```\n\nHere’s how to grant anyone with the link permission to view this data\nset.\n\n``` r\n(chicken_sheet <- chicken_sheet |>\n  drive_share(role = \"reader\", type = \"anyone\"))\n#> Permissions updated:\n#> • role = reader\n#> • type = anyone\n#> For file:\n#> • 'index-chicken-sheet' <id: 1RnvPDsw19uUKqY8K01N8m-7XViOdsz4fFotBlqnUIWU>\n#> # A dribble: 1 × 5\n#>   name                shared id       drive_resource    permissions_resource\n#>   <chr>               <lgl>  <drv_id> <list>            <list>              \n#> 1 index-chicken-sheet TRUE   1RnvPDs… <named list [38]> <named list [2]>\n```\n\nThis comes up so often, there’s even a convenience wrapper,\n`drive_share_anyone()`.\n\n#### Publish files\n\nVersions of Google Documents, Sheets, and Presentations can be published\nonline. You can check your publication status by running\n`drive_reveal(..., \"published\")`, which adds a logical column\n`published` and parks more detailed metadata in a `revision_resource`\nvariable.\n\n``` r\nchicken_sheet |>\n  drive_reveal(\"published\")\n#> # A dribble: 1 × 7\n#>   name             published shared id       drive_resource permissions_resource\n#>   <chr>            <lgl>     <lgl>  <drv_id> <list>         <list>              \n#> 1 index-chicken-s… FALSE     TRUE   1RnvPDs… <named list>   <named list [2]>    \n#> # ℹ 1 more variable: revision_resource <list>\n```\n\nBy default, `drive_publish()` will publish your most recent version.\n\n``` r\n(chicken_sheet <- drive_publish(chicken_sheet))\n#> File now published:\n#> • 'index-chicken-sheet' <id: 1RnvPDsw19uUKqY8K01N8m-7XViOdsz4fFotBlqnUIWU>\n#> # A dribble: 1 × 7\n#>   name             published shared id       drive_resource permissions_resource\n#>   <chr>            <lgl>     <lgl>  <drv_id> <list>         <list>              \n#> 1 index-chicken-s… TRUE      TRUE   1RnvPDs… <named list>   <named list [2]>    \n#> # ℹ 1 more variable: revision_resource <list>\n```\n\n#### Download files\n\n##### Google files\n\nWe can download files from Google Drive. Native Google file types (such\nas Google Documents, Google Sheets, Google Slides, etc.) need to be\nexported to some conventional file type. There are reasonable defaults\nor you can specify this explicitly via `type` or implicitly via the file\nextension in `path`. For example, if I would like to download the\n“chicken_sheet” Google Sheet as a `.csv` I could run the following.\n\n``` r\ndrive_download(\"index-chicken-sheet\", type = \"csv\")\n#> File downloaded:\n#> • 'index-chicken-sheet' <id: 1RnvPDsw19uUKqY8K01N8m-7XViOdsz4fFotBlqnUIWU>\n#> Saved locally as:\n#> • 'index-chicken-sheet.csv'\n```\n\nAlternatively, I could specify type via the `path` parameter.\n\n``` r\ndrive_download(\n  \"index-chicken-sheet\",\n  path = \"index-chicken-sheet.csv\",\n  overwrite = TRUE\n)\n#> File downloaded:\n#> • 'index-chicken-sheet' <id: 1RnvPDsw19uUKqY8K01N8m-7XViOdsz4fFotBlqnUIWU>\n#> Saved locally as:\n#> • 'index-chicken-sheet.csv'\n```\n\nNotice in the example above, I specified `overwrite = TRUE`, in order to\noverwrite the local csv file previously saved.\n\nFinally, you could just allow export to the default type. In the case of\nGoogle Sheets, this is an Excel workbook:\n\n``` r\ndrive_download(\"index-chicken-sheet\")\n#> File downloaded:\n#> • 'index-chicken-sheet' <id: 1RnvPDsw19uUKqY8K01N8m-7XViOdsz4fFotBlqnUIWU>\n#> Saved locally as:\n#> • 'index-chicken-sheet.xlsx'\n```\n\n##### All other files\n\nDownloading files that are *not* Google type files is even simpler,\ni.e. it does not require any conversion or type info.\n\n``` r\n# download it and prove we got it\ndrive_download(\"chicken.txt\")\n#> File downloaded:\n#> • 'chicken.txt' <id: 1xMvlJHia_qYNZmucaStDcOF9A9PD4BOT>\n#> Saved locally as:\n#> • 'chicken.txt'\nreadLines(\"chicken.txt\") |> head()\n#> [1] \"A chicken whose name was Chantecler\"      \n#> [2] \"Clucked in iambic pentameter\"             \n#> [3] \"It sat on a shelf, reading Song of Myself\"\n#> [4] \"And laid eggs with a perfect diameter.\"   \n#> [5] \"\"                                         \n#> [6] \"—Richard Maxson\"\n```\n\n#### Clean up\n\n``` r\nfile.remove(c(\n  \"index-chicken-sheet.csv\",\n  \"index-chicken-sheet.xlsx\",\n  \"chicken.txt\"\n))\n#> [1] TRUE TRUE TRUE\ndrive_find(\"index-chicken\") |> drive_rm()\n#> File deleted:\n#> • 'index-chicken-sheet' <id: 1RnvPDsw19uUKqY8K01N8m-7XViOdsz4fFotBlqnUIWU>\n```\n\n## Privacy\n\n[Privacy policy](https://www.tidyverse.org/google_privacy_policy)\n"
  },
  {
    "path": "inst/WORDLIST",
    "content": "API's\nAuth\nCLI\nCMD\nCodecov\nColaboratory\nD'Agostino\nGCE\nGCP\nIDEs\nOAuth\nOOB\nORCID\nPBC\nPUTs\nRESTful\nRStudio\nTidyverse\nVMs\nappdata\nauth\nbehaviour\nbigrquery\ncli\ncli's\ncommenter\ncsv\nde\ndeterminine\ndev\ndplyr\nfileOrganizer\nfunder\nggplot\ngmailr\ngoogleapis\ngoogledrive's\ngooglesheets\nhttps\nhttr's\ning\nlifecycle\nlowerCamel\nmagrittr\nmockr\npkgdown\npre\npurrr\nreadonly\nrebranded\nrecency\nreprexes\nrlang's\nrprojroot\nsetwise\ntargetted\ntestthat\nth\nthreshhold\ntibble\ntibble's\ntidyverse\nun\nunexamined\nvctrs\nvectorization\nwithr\nwww\n"
  },
  {
    "path": "inst/extdata/data/client_secret_123.googleusercontent.com.json",
    "content": "{\"installed\":{\"client_id\":\"abc.apps.googleusercontent.com\",\"project_id\":\"a_project\",\"auth_uri\":\"https://accounts.google.com/o/oauth2/auth\",\"token_uri\":\"https://accounts.google.com/o/oauth2/token\",\"auth_provider_x509_cert_url\":\"https://www.googleapis.com/oauth2/v1/certs\",\"client_secret\":\"ssshh-i-am-a-secret\",\"redirect_uris\":[\"http://localhost\"]}}\n"
  },
  {
    "path": "inst/extdata/data/files_fields.csv",
    "content": "name,desc\nappProperties,\"A collection of arbitrary key-value pairs which are private to the requesting app.\nEntries with null values are cleared in update and copy requests. These properties can only be retrieved using an authenticated request. An authenticated request uses an access token obtained with a OAuth 2 client ID. You cannot use an API key to retrieve private properties.\"\ncapabilities,\"Output only. Capabilities the current user has on this file. Each capability corresponds to a fine-grained action that a user may take. For more information, see [Understand file capabilities](https://developers.google.com/workspace/drive/api/guides/manage-sharing#capabilities).\"\ncontentHints,Additional information about the content of the file. These fields are never populated in responses.\ncontentRestrictions,Restrictions for accessing the content of the file. Only populated if such a restriction exists.\ncopyRequiresWriterPermission,\"Whether the options to copy, print, or download this file should be disabled for readers and commenters.\"\ncreatedTime,The time at which the file was created (RFC 3339 date-time).\ndescription,A short description of the file.\ndownloadRestrictions,Download restrictions applied on the file.\ndriveId,Output only. ID of the shared drive the file resides in. Only populated for items in shared drives.\nexplicitlyTrashed,\"Output only. Whether the file has been explicitly trashed, as opposed to recursively trashed from a parent folder.\"\nexportLinks,Output only. Links for exporting Docs Editors files to specific formats.\nfileExtension,Output only. The final component of `fullFileExtension`. This is only available for files with binary content in Google Drive.\nfolderColorRgb,\"The color for a folder or a shortcut to a folder as an RGB hex string. The supported colors are published in the `folderColorPalette` field of the [`about`](/workspace/drive/api/reference/rest/v3/about) resource. If an unsupported color is specified, the closest color in the palette is used instead.\"\nfullFileExtension,\"Output only. The full file extension extracted from the `name` field. May contain multiple concatenated extensions, such as \"\"tar.gz\"\". This is only available for files with binary content in Google Drive. This is automatically updated when the `name` field changes, however it's not cleared if the new name doesn't contain a valid extension.\"\nhasAugmentedPermissions,Output only. Whether there are permissions directly on this file. This field is only populated for items in shared drives.\nhasThumbnail,\"Output only. Whether this file has a thumbnail. This doesn't indicate whether the requesting app has access to the thumbnail. To check access, look for the presence of the thumbnailLink field.\"\nheadRevisionId,Output only. The ID of the file's head revision. This is currently only available for files with binary content in Google Drive.\niconLink,\"Output only. A static, unauthenticated link to the file's icon.\"\nid,The ID of the file.\nimageMediaMetadata,\"Output only. Additional metadata about image media, if available.\"\ninheritedPermissionsDisabled,Whether this file has inherited permissions disabled. Inherited permissions are enabled by default.\nisAppAuthorized,Output only. Whether the file was created or opened by the requesting app.\nkind,\"Output only. Identifies what kind of resource this is. Value: the fixed string `\"\"drive#file\"\"`.\"\nlabelInfo,Output only. An overview of the labels on the file.\nlastModifyingUser,Output only. The last user to modify the file. This field is only populated when the last modification was performed by a signed-in user.\nlinkShareMetadata,Contains details about the link URLs that clients are using to refer to this item.\nmd5Checksum,Output only. The MD5 checksum for the content of the file. This is only applicable to files with binary content in Google Drive.\nmimeType,\"The MIME type of the file. Google Drive attempts to automatically detect an appropriate value from uploaded content, if no value is provided. The value cannot be changed unless a new revision is uploaded. If a file is created with a Google Doc MIME type, the uploaded content is imported, if possible. The supported import formats are published in the [`about`](/workspace/drive/api/reference/rest/v3/about) resource.\"\nmodifiedByMe,Output only. Whether the file has been modified by this user.\nmodifiedByMeTime,The last time the file was modified by the user (RFC 3339 date-time).\nmodifiedTime,he last time the file was modified by anyone (RFC 3339 date-time). Note that setting modifiedTime will also update modifiedByMeTime for the user.\nname,\"The name of the file. This isn't necessarily unique within a folder. Note that for immutable items such as the top-level folders of shared drives, the My Drive root folder, and the Application Data folder, the name is constant.\"\noriginalFilename,\"The original filename of the uploaded content if available, or else the original value of the `name` field. This is only available for files with binary content in Google Drive.\"\nownedByMe,Output only. Whether the user owns the file. Not populated for items in shared drives.\nowners,Output only. The owner of this file. Only certain legacy files may have more than one owner. This field isn't populated for items in shared drives.\nparents,\"The ID of the parent folder containing the file. A file can only have one parent folder; specifying multiple parents isn't supported. If not specified as part of a create request, the file is placed directly in the user's My Drive folder. If not specified as part of a copy request, the file inherits any discoverable parent of the source file. Update requests must use the `addParents` and `removeParents` parameters to modify the parents list.\"\npermissionIds,Output only. List of permission IDs for users with access to this file.\npermissions,Output only. The full list of permissions for the file. This is only available if the requesting user can share the file. Not populated for items in shared drives.\nproperties,\"A collection of arbitrary key-value pairs which are visible to all apps.\nEntries with null values are cleared in update and copy requests.\"\nquotaBytesUsed,Output only. The number of storage quota bytes used by the file. This includes the head revision as well as previous revisions with `keepForever` enabled.\nresourceKey,Output only. A key needed to access the item via a shared link.\nsha1Checksum,\"Output only. The SHA1 checksum associated with this file, if available. This field is only populated for files with content stored in Google Drive; it's not populated for Docs Editors or shortcut files.\"\nsha256Checksum,\"Output only. The SHA256 checksum associated with this file, if available. This field is only populated for files with content stored in Google Drive; it's not populated for Docs Editors or shortcut files.\"\nshared,Output only. Whether the file has been shared. Not populated for items in shared drives.\nsharedWithMeTime,\"The time at which the file was shared with the user, if applicable (RFC 3339 date-time).\"\nsharingUser,\"Output only. The user who shared the file with the requesting user, if applicable.\"\nshortcutDetails,\"Shortcut file details. Only populated for shortcut files, which have the mimeType field set to `application/vnd.google-apps.shortcut`. Can only be set on `files.create` requests.\"\nsize,\"Output only. Size in bytes of blobs and Google Workspace editor files. Won't be populated for files that have no size, like shortcuts and folders.\"\nspaces,\"Output only. The list of spaces which contain the file. The currently supported values are `drive`, `appDataFolder`, and `photos`.\"\nstarred,Whether the user has starred the file.\nteamDriveId,Deprecated: Output only. Use `driveId` instead.\nthumbnailLink,\"Output only. A short-lived link to the file's thumbnail, if available. Typically lasts on the order of hours. Not intended for direct usage on web applications due to [Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) policies. Consider using a proxy server. Only populated when the requesting app can access the file's content. If the file isn't shared publicly, the URL returned in `files.thumbnailLink` must be fetched using a credentialed request.\"\nthumbnailVersion,Output only. The thumbnail version for use in thumbnail cache invalidation.\ntrashed,\"Whether the file has been trashed, either explicitly or from a trashed parent folder. Only the owner may trash a file, and other users cannot see files in the owner's trash.\"\ntrashedTime,The time that the item was trashed (RFC 3339 date-time). Only populated for items in shared drives.\ntrashingUser,\"Output only. If the file has been explicitly trashed, the user who trashed it. Only populated for items in shared drives.\"\nversion,\"Output only. A monotonically increasing version number for the file. This reflects every change made to the file on the server, even those not visible to the user.\"\nvideoMediaMetadata,Output only. Additional metadata about video media. This may not be available immediately upon upload.\nviewedByMe,Output only. Whether the file has been viewed by this user.\nviewedByMeTime,The last time the file was viewed by the user (RFC 3339 date-time).\nviewersCanCopyContent,Deprecated: Use `copyRequiresWriterPermission` instead.\nwebContentLink,Output only. A link for downloading the content of the file in a browser. This is only available for files with binary content in Google Drive.\nwebViewLink,Output only. A link for opening the file in a relevant Google editor or viewer in a browser.\nwritersCanShare,Whether users with only `writer` permission can modify the file's permissions. Not populated for items in shared drives.\n"
  },
  {
    "path": "inst/extdata/data/mime_tbl.csv",
    "content": "mime_type,ext,description,human_type,default\napplication/epub+zip,epub,NA,epub,FALSE\napplication/msword,doc,NA,doc,TRUE\napplication/pdf,pdf,NA,pdf,TRUE\napplication/rtf,rtf,NA,rtf,TRUE\napplication/vnd.google-apps.audio,NA,NA,audio,NA\napplication/vnd.google-apps.document,NA,Google Docs,document,NA\napplication/vnd.google-apps.drawing,NA,Google Drawings,drawing,NA\napplication/vnd.google-apps.drive-sdk,NA,Third-party shortcut,drive-sdk,NA\napplication/vnd.google-apps.file,NA,Google Drive file,file,NA\napplication/vnd.google-apps.folder,NA,Google Drive folder,folder,NA\napplication/vnd.google-apps.form,NA,Google Forms,form,NA\napplication/vnd.google-apps.fusiontable,NA,Google Fusion Tables,fusiontable,NA\napplication/vnd.google-apps.jam,NA,Google Jamboard,jam,NA\napplication/vnd.google-apps.mail-layout,NA,Email layout,mail-layout,NA\napplication/vnd.google-apps.map,NA,Google My Maps,map,NA\napplication/vnd.google-apps.photo,NA,Google Photos,photo,NA\napplication/vnd.google-apps.presentation,NA,Google Slides,presentation,NA\napplication/vnd.google-apps.script,NA,Google Apps Script,script,NA\napplication/vnd.google-apps.script+json,NA,NA,script+json,NA\napplication/vnd.google-apps.script+text/plain,NA,NA,script+text/plain,NA\napplication/vnd.google-apps.shortcut,NA,Shortcut,shortcut,NA\napplication/vnd.google-apps.site,NA,Google Sites,site,NA\napplication/vnd.google-apps.spreadsheet,NA,Google Sheets,spreadsheet,NA\napplication/vnd.google-apps.unknown,NA,NA,unknown,NA\napplication/vnd.google-apps.vid,NA,Google Vids,vid,NA\napplication/vnd.google-apps.video,NA,NA,video,NA\napplication/vnd.google.colab,ipynb,Colab notebook,colab,TRUE\napplication/vnd.ms-excel,xla,NA,xla,FALSE\napplication/vnd.ms-excel,xlc,NA,xlc,FALSE\napplication/vnd.ms-excel,xlm,NA,xlm,FALSE\napplication/vnd.ms-excel,xls,NA,xls,TRUE\napplication/vnd.ms-excel,xlt,NA,xlt,FALSE\napplication/vnd.ms-excel,xlw,NA,xlw,FALSE\napplication/vnd.ms-excel.sheet.macroenabled.12,NA,NA,NA,NA\napplication/vnd.ms-excel.template.macroenabled.12,NA,NA,NA,NA\napplication/vnd.ms-powerpoint,pps,NA,pps,FALSE\napplication/vnd.ms-powerpoint,ppt,NA,ppt,TRUE\napplication/vnd.ms-powerpoint.presentation.macroenabled.12,NA,NA,NA,NA\napplication/vnd.ms-powerpoint.slideshow.macroenabled.12,NA,NA,NA,NA\napplication/vnd.ms-powerpoint.template.macroenabled.12,NA,NA,NA,NA\napplication/vnd.ms-word.document.macroenabled.12,NA,NA,NA,NA\napplication/vnd.ms-word.template.macroenabled.12,NA,NA,NA,NA\napplication/vnd.oasis.opendocument.presentation,odp,NA,odp,TRUE\napplication/vnd.oasis.opendocument.spreadsheet,ods,NA,ods,TRUE\napplication/vnd.oasis.opendocument.text,odt,NA,odt,TRUE\napplication/vnd.openxmlformats-officedocument.presentationml.presentation,pptx,NA,pptx,TRUE\napplication/vnd.openxmlformats-officedocument.presentationml.slideshow,ppsx,NA,ppsx,TRUE\napplication/vnd.openxmlformats-officedocument.presentationml.template,potx,NA,potx,TRUE\napplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet,xlsx,NA,xlsx,TRUE\napplication/vnd.openxmlformats-officedocument.spreadsheetml.template,xltx,NA,xltx,TRUE\napplication/vnd.openxmlformats-officedocument.wordprocessingml.document,docx,NA,docx,TRUE\napplication/vnd.openxmlformats-officedocument.wordprocessingml.template,dotx,NA,dotx,TRUE\napplication/vnd.sun.xml.writer,sxw,NA,sxw,TRUE\napplication/x-msmetafile,NA,NA,NA,NA\napplication/x-vnd.oasis.opendocument.presentation,NA,NA,NA,NA\napplication/x-vnd.oasis.opendocument.spreadsheet,NA,NA,NA,NA\napplication/x-vnd.oasis.opendocument.text,NA,NA,NA,NA\napplication/zip,zip,NA,zip,TRUE\nimage/bmp,bmp,NA,bmp,FALSE\nimage/gif,gif,NA,gif,TRUE\nimage/jpeg,jfif,NA,jfif,FALSE\nimage/jpeg,jpe,NA,jpe,FALSE\nimage/jpeg,jpeg,NA,jpeg,TRUE\nimage/jpeg,jpg,NA,jpg,FALSE\nimage/jpg,NA,NA,NA,NA\nimage/pjpeg,NA,NA,NA,NA\nimage/png,png,NA,png,TRUE\nimage/svg+xml,svg,NA,svg,TRUE\nimage/svg+xml,svgz,NA,svgz,FALSE\nimage/x-bmp,NA,NA,NA,NA\nimage/x-png,NA,NA,NA,NA\ntext/csv,csv,NA,csv,TRUE\ntext/html,htm,NA,htm,FALSE\ntext/html,html,NA,html,TRUE\ntext/html,shtml,NA,shtml,FALSE\ntext/markdown,markdown,NA,markdown,FALSE\ntext/markdown,md,NA,md,TRUE\ntext/plain,brf,NA,brf,FALSE\ntext/plain,pot,NA,pot,FALSE\ntext/plain,srt,NA,srt,FALSE\ntext/plain,text,NA,text,FALSE\ntext/plain,txt,NA,txt,TRUE\ntext/richtext,rtf,NA,NA,TRUE\ntext/rtf,rtf,NA,NA,TRUE\ntext/tab-separated-values,tsv,NA,tsv,TRUE\ntext/x-markdown,md,NA,NA,TRUE\nvideo/mp4,m4v,NA,m4v,FALSE\nvideo/mp4,mp4,NA,mp4,FALSE\nvideo/mp4,mpg4,NA,mpg4,FALSE\n"
  },
  {
    "path": "inst/extdata/data/remote_example_files.csv",
    "content": "name,mime_type,id\nchicken_doc,application/vnd.google-apps.document,1X9pd4nOjl33zDFfTjw-_eFL7Qb9_g6VfVFDp1PPae94\nchicken_sheet,application/vnd.google-apps.spreadsheet,1SeFXkr3XdzPSuWauzPdN-XnaryOYmZ7sFiUF5t-wSVU\nchicken.csv,text/csv,1VOh6wWbRfuQLxbLg87o58vxJt95SIiZ7\nchicken.jpg,image/jpeg,1b2_ZjzgvrSw0hBMgn-rnEbjp3Uq0XTKJ\nchicken.pdf,application/pdf,13OQcAo8hkh0Ja5Wxlmi4a8aNvPK7pDkO\nchicken.txt,text/plain,1wOLeWVRkTb6lDmLRiOhg9iKM7DlN762Y\nimdb_latin1.csv,text/csv,1YJSVa0LTaVtGrZ4eVXYrSQ4y50uFl5bw\nr_about.html,text/html,1sfCT0zqDz3vpZZlv_4nFlhq2WMaKqjow\nr_logo.jpg,image/jpeg,1J4v-iyydf1Cad3GjDkGRrynauV9JFOyW\n"
  },
  {
    "path": "inst/extdata/data/translate_mime_types.csv",
    "content": "action,mime_type_google,mime_type_local,default\nexport,application/vnd.google-apps.document,application/epub+zip,FALSE\nexport,application/vnd.google-apps.document,application/pdf,FALSE\nexport,application/vnd.google-apps.document,application/rtf,FALSE\nexport,application/vnd.google-apps.document,application/vnd.oasis.opendocument.text,FALSE\nexport,application/vnd.google-apps.document,application/vnd.openxmlformats-officedocument.wordprocessingml.document,TRUE\nexport,application/vnd.google-apps.document,application/zip,FALSE\nexport,application/vnd.google-apps.document,text/html,FALSE\nexport,application/vnd.google-apps.document,text/markdown,FALSE\nexport,application/vnd.google-apps.document,text/plain,FALSE\nexport,application/vnd.google-apps.document,text/x-markdown,FALSE\nexport,application/vnd.google-apps.drawing,application/pdf,FALSE\nexport,application/vnd.google-apps.drawing,image/jpeg,FALSE\nexport,application/vnd.google-apps.drawing,image/png,TRUE\nexport,application/vnd.google-apps.drawing,image/svg+xml,FALSE\nexport,application/vnd.google-apps.form,application/zip,TRUE\nexport,application/vnd.google-apps.jam,application/pdf,FALSE\nexport,application/vnd.google-apps.mail-layout,text/plain,FALSE\nexport,application/vnd.google-apps.presentation,application/pdf,FALSE\nexport,application/vnd.google-apps.presentation,application/vnd.oasis.opendocument.presentation,FALSE\nexport,application/vnd.google-apps.presentation,application/vnd.openxmlformats-officedocument.presentationml.presentation,TRUE\nexport,application/vnd.google-apps.presentation,text/plain,FALSE\nexport,application/vnd.google-apps.script,application/vnd.google-apps.script+json,TRUE\nexport,application/vnd.google-apps.site,text/plain,FALSE\nexport,application/vnd.google-apps.spreadsheet,application/pdf,FALSE\nexport,application/vnd.google-apps.spreadsheet,application/vnd.oasis.opendocument.spreadsheet,FALSE\nexport,application/vnd.google-apps.spreadsheet,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,TRUE\nexport,application/vnd.google-apps.spreadsheet,application/x-vnd.oasis.opendocument.spreadsheet,FALSE\nexport,application/vnd.google-apps.spreadsheet,application/zip,FALSE\nexport,application/vnd.google-apps.spreadsheet,text/csv,FALSE\nexport,application/vnd.google-apps.spreadsheet,text/tab-separated-values,FALSE\nexport,application/vnd.google-apps.vid,video/mp4,FALSE\nimport,application/vnd.google-apps.document,application/msword,NA\nimport,application/vnd.google-apps.document,application/pdf,NA\nimport,application/vnd.google-apps.document,application/rtf,NA\nimport,application/vnd.google-apps.document,application/vnd.ms-word.document.macroenabled.12,NA\nimport,application/vnd.google-apps.document,application/vnd.ms-word.template.macroenabled.12,NA\nimport,application/vnd.google-apps.document,application/vnd.oasis.opendocument.text,NA\nimport,application/vnd.google-apps.document,application/vnd.openxmlformats-officedocument.wordprocessingml.document,NA\nimport,application/vnd.google-apps.document,application/vnd.openxmlformats-officedocument.wordprocessingml.template,NA\nimport,application/vnd.google-apps.document,application/vnd.sun.xml.writer,NA\nimport,application/vnd.google-apps.document,application/x-vnd.oasis.opendocument.text,NA\nimport,application/vnd.google-apps.document,image/bmp,NA\nimport,application/vnd.google-apps.document,image/gif,NA\nimport,application/vnd.google-apps.document,image/jpeg,NA\nimport,application/vnd.google-apps.document,image/jpg,NA\nimport,application/vnd.google-apps.document,image/pjpeg,NA\nimport,application/vnd.google-apps.document,image/png,NA\nimport,application/vnd.google-apps.document,image/x-bmp,NA\nimport,application/vnd.google-apps.document,image/x-png,NA\nimport,application/vnd.google-apps.document,text/html,NA\nimport,application/vnd.google-apps.document,text/markdown,NA\nimport,application/vnd.google-apps.document,text/plain,NA\nimport,application/vnd.google-apps.document,text/richtext,NA\nimport,application/vnd.google-apps.document,text/rtf,NA\nimport,application/vnd.google-apps.document,text/x-markdown,NA\nimport,application/vnd.google-apps.drawing,application/x-msmetafile,NA\nimport,application/vnd.google-apps.presentation,application/vnd.ms-powerpoint,NA\nimport,application/vnd.google-apps.presentation,application/vnd.ms-powerpoint.presentation.macroenabled.12,NA\nimport,application/vnd.google-apps.presentation,application/vnd.ms-powerpoint.slideshow.macroenabled.12,NA\nimport,application/vnd.google-apps.presentation,application/vnd.ms-powerpoint.template.macroenabled.12,NA\nimport,application/vnd.google-apps.presentation,application/vnd.oasis.opendocument.presentation,NA\nimport,application/vnd.google-apps.presentation,application/vnd.openxmlformats-officedocument.presentationml.presentation,NA\nimport,application/vnd.google-apps.presentation,application/vnd.openxmlformats-officedocument.presentationml.slideshow,NA\nimport,application/vnd.google-apps.presentation,application/vnd.openxmlformats-officedocument.presentationml.template,NA\nimport,application/vnd.google-apps.presentation,application/x-vnd.oasis.opendocument.presentation,NA\nimport,application/vnd.google-apps.script,application/vnd.google-apps.script+json,NA\nimport,application/vnd.google-apps.script,application/vnd.google-apps.script+text/plain,NA\nimport,application/vnd.google-apps.spreadsheet,application/vnd.ms-excel,NA\nimport,application/vnd.google-apps.spreadsheet,application/vnd.ms-excel.sheet.macroenabled.12,NA\nimport,application/vnd.google-apps.spreadsheet,application/vnd.ms-excel.template.macroenabled.12,NA\nimport,application/vnd.google-apps.spreadsheet,application/vnd.oasis.opendocument.spreadsheet,NA\nimport,application/vnd.google-apps.spreadsheet,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,NA\nimport,application/vnd.google-apps.spreadsheet,application/vnd.openxmlformats-officedocument.spreadsheetml.template,NA\nimport,application/vnd.google-apps.spreadsheet,application/x-vnd.oasis.opendocument.spreadsheet,NA\nimport,application/vnd.google-apps.spreadsheet,text/csv,NA\nimport,application/vnd.google-apps.spreadsheet,text/tab-separated-values,NA\n"
  },
  {
    "path": "inst/extdata/example_files/chicken.csv",
    "content": "chicken,breed,sex,motto\nFoghorn Leghorn,Leghorn,rooster,\"That's a joke, ah say, that's a joke, son.\"\nChicken Little,unknown,hen,\"The sky is falling!\"\nGinger,Rhode Island Red,hen,\"Listen. We'll either die free chickens or we die trying.\"\nCamilla the Chicken,Chantecler,hen,\"Bawk, buck, ba-gawk.\"\nErnie The Giant Chicken,Brahma,rooster,\"Put Captain Solo in the cargo hold.\"\n"
  },
  {
    "path": "inst/extdata/example_files/chicken.txt",
    "content": "A chicken whose name was Chantecler\nClucked in iambic pentameter\nIt sat on a shelf, reading Song of Myself\nAnd laid eggs with a perfect diameter.\n\n—Richard Maxson\n"
  },
  {
    "path": "inst/extdata/example_files/imdb_latin1.csv",
    "content": "Votes,Rating,Title,Year,Decade\n635139,8.6,Lon,1994,1990\n264285,8.1,The Princess Bride,1987,1980\n43090,N/K,\"Paris, Texas (1984)\",1984,1980\n90434,8.3,Rashmon,1950,1950\n427099,8.0,X-Men: Days of Future Past,2014,2010\n415845,8.1,How to Train Your Dragon,2010,2010\n527349,8.0,Guardians of the Galaxy,2014,2010\n474068,8.4,Le fabuleux destin d'Amlie Poulain,2001,2000\n529287,8.2,Die Hard,1988,1980\n466111,8.0,Harry Potter and the Deathly Hallows: Part 2,2011,2010\n26012,8.0,Kumonosu-j,1957,1950\n59377,8.0,Lagaan: Once Upon a Time in India,2001,2000\n358305,8.6,La vita  bella,1997,1990\n242353,8.6,It's a Wonderful Life,1946,1940\n83941,8.0,Tenk no shiro Rapyuta,1986,1980\n192744,8.2,Chinatown,1974,1970\n618914,8.4,WALLE,2008,2000\n151256,8.4,Das Boot,1981,1980\n121599,8.1,Hachi: A Dog's Tale,2009,2000\n262425,8.3,Mad Max: Fury Road,2015,2010\n311070,8.4,Oldeuboi,2003,2000\n98949,8.2,Det sjunde inseglet,1957,1950\n585474,8.5,Raiders of the Lost Ark,1981,1980\n57974,8.0,The Night of the Hunter,1955,1950\n55861,8.2,Smultronstllet,1957,1950\n424957,8.1,Million Dollar Baby,2004,2000\n117590,8.4,The Great Dictator,1940,1940\n85012,8.1,Strangers on a Train,1951,1950\n476501,8.6,Cidade de Deus,2002,2000\n268905,8.4,Citizen Kane,1941,1940\n69988:3,8.1,8,1963,1960\n1078416,8.7,Forrest Gump,1994,1990\n31003,8.1,Le salaire de la peur,1953,1950\n"
  },
  {
    "path": "inst/extdata/example_files/markdown.md",
    "content": "# Heading 1\n\nThis document is designed as a toy for experimenting with markdown **export and import** functionality.\n\n# Heading 2\n\nSometimes I use *italics* or **bold**.\n\n## Subheading\n\nLet's raise a toast to a subsection.\n\n# Lists\n\nBoth unordered and ordered lists are included.\n\n## Unordered List\n\n* Item one  \n* Item two  \n  * Nested item A  \n  * Nested item B  \n* Item three\n\n## Ordered List\n\n1. First item  \n2. Second item  \n   1. Nested ordered item 1  \n   2. Nested ordered item 2  \n3. Third item\n"
  },
  {
    "path": "inst/extdata/example_files/r_about.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>\n<head>\n<title>R: About R</title>\n<meta http-equiv=\"Content-Type\" content= \"text/html; charset=us-ascii\">\n<link rel=\"STYLESHEET\" type=\"text/css\" href=\"R.css\">\n</head>\n\n<body>\n\n<h1>About <img class=\"toplogo\" src=\"Rlogo.svg\" alt=\"[R logo]\"></h1>\n\n<hr width=\"100%\">\n\n<h2>Introduction</h2>\n\n<p><b>R</b> is a computer language not entirely unlike the S\nlanguage developed at AT&amp;T Bell Laboratories by Rick Becker,\nJohn Chambers and Allan Wilks. The two languages are implemented\nquite differently, but bear enough superficial resemblance that\nusers should be able to switch between the two with relative ease.\nCurrently the software is undergoing active development. Discussion\nof the development process is carried out on the \"r-devel\" mailing\nlist. See the <a href=\"resources.html\">resources page</a> for\ndetails on how to subscribe to this list.</p>\n\n<p>We have implemented <b>R</b> in what we hope is a very portable\nfashion and in way which requires relatively little in the way of\nmachine resources. Implementations exist for many for many members\nof the Unix family of operating systems, including <b>AIX</b>,\n<b>FreeBSD</b>, <b>GNU/Linux</b>, <b>HPUX</b>, <b>Irix</b>,\n<b>macOS</b>, <b>Solaris</b>, and <b>Tru64</b>. In addition there\nis a version for <b>Microsoft Windows</b> (9x, ME, NT4, 2000,\nXP).</p>\n\n<h2>Present Status</h2>\n\nThe present version implements most of the functionality in the\n1988 S book (the \"Blue Book\") and many of the applications. In\naddition, we have implemented much of the functionality from the\n1992 S book (the \"White Book\"). In particular we have versions of\n\"lm\", \"glm\", \"aov\" and \"loess\", and versions of \"gam\" and \"tree\"\nare available in contributed packages. There are several manuals in\nthe distribution, plus a comprehensive set of help pages in \"output\nindependent\" form which can be used to create versions for HTML,\nLaTeX, text, PDF etc.\n\n</body>\n</html>\n"
  },
  {
    "path": "man/as_dribble.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/dribble.R\n\\name{as_dribble}\n\\alias{as_dribble}\n\\title{Coerce to a \\code{dribble}}\n\\usage{\nas_dribble(x, ...)\n}\n\\arguments{\n\\item{x}{A vector of Drive file paths, a vector of file ids marked\nwith \\code{\\link[=as_id]{as_id()}}, a list of Files Resource objects, or a suitable data\nframe.}\n\n\\item{...}{Other arguments passed down to methods. (Not used.)}\n}\n\\description{\nConverts various representations of Google Drive files into a \\code{\\link{dribble}},\nthe object used by googledrive to hold Drive file metadata. Files can be\nspecified via:\n\\itemize{\n\\item File path. File name is an important special case.\n\\item File id. Mark with \\code{\\link[=as_id]{as_id()}} to distinguish from file path.\n\\item Data frame or \\code{\\link{dribble}}. Once you've successfully used googledrive to\nidentify the files of interest, you'll have a \\code{\\link{dribble}}. Pass it into\ndownstream functions.\n\\item List representing \\href{https://developers.google.com/drive/api/v3/reference/files}{Files resource}\nobjects. Mostly for internal use.\n}\n\nThis is a generic function.\n\nFor maximum clarity, get your files into a \\code{\\link{dribble}} (or capture file id)\nas early as possible. When specifying via path, it's best to include the\ntrailing slash when you're targeting a folder. If you want the folder \\code{foo},\nsay \\verb{foo/}, not \\code{foo}.\n\nSome functions, such as \\code{\\link[=drive_cp]{drive_cp()}}, \\code{\\link[=drive_mkdir]{drive_mkdir()}}, \\code{\\link[=drive_mv]{drive_mv()}}, and\n\\code{\\link[=drive_upload]{drive_upload()}}, can accept the new file or folder name as the last part of\n\\code{path}, when \\code{name} is not given. But if you say \\code{a/b/c} (no trailing slash)\nand a folder \\verb{a/b/c/} already exists, it's unclear what you want. A file\nnamed \\code{c} in \\verb{a/b/} or a file with default name in \\verb{a/b/c/}? You get an\nerror and must make your intent clear.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# create some files for us to re-discover by name or filepath\nalfa <- drive_create(\"alfa\", type = \"folder\")\nbravo <- drive_create(\"bravo\", path = alfa)\n\n# as_dribble() can work with file names or paths\nas_dribble(\"alfa\")\nas_dribble(\"bravo\")\nas_dribble(\"alfa/bravo\")\nas_dribble(c(\"alfa\", \"alfa/bravo\"))\n\n# specify the file id (substitute a real file id of your own!)\n# as_dribble(as_id(\"0B0Gh-SuuA2nTOGZVTXZTREgwZ2M\"))\n\n# Clean up\ndrive_find(\"alfa\") |> drive_rm()\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/as_shared_drive.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/shared_drives.R\n\\name{as_shared_drive}\n\\alias{as_shared_drive}\n\\title{Coerce to shared drive}\n\\usage{\nas_shared_drive(x, ...)\n}\n\\arguments{\n\\item{x}{A vector of shared drive names, a vector of shared drive ids marked\nwith \\code{\\link[=as_id]{as_id()}}, a list of Drives resource objects, or a suitable data\nframe.}\n\n\\item{...}{Other arguments passed down to methods. (Not used.)}\n}\n\\description{\nConverts various representations of a shared drive into a\n\\code{\\link{dribble}}, the object used by googledrive to hold Drive file metadata.\nShared drives can be specified via\n\\itemize{\n\\item Name\n\\item Shared drive id, marked with \\code{\\link[=as_id]{as_id()}} to distinguish from name\n\\item Data frame or \\code{\\link{dribble}} consisting solely of shared drives\n\\item List representing \\href{https://developers.google.com/drive/api/v3/reference/drives#resource-representations}{Drives resource}\nobjects (mostly for internal use)\n}\n\nA shared drive supports files owned by an organization rather than an\nindividual user. Shared drives follow different sharing and ownership models\nfrom a specific user's \"My Drive\". Shared drives are the successors to the\nearlier concept of Team Drives. Learn more about \\link[=shared_drives]{shared drives}.\n\nThis is a generic function.\n}\n\\examples{\n\\dontrun{\n# specify the name\nas_shared_drive(\"abc\")\n\n# specify the id (substitute one of your own!)\nas_shared_drive(as_id(\"0AOPK1X2jaNckUk9PVA\"))\n}\n}\n"
  },
  {
    "path": "man/deprecated-team-drive-functions.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/team_drive.R\n\\name{deprecated-team-drive-functions}\n\\alias{deprecated-team-drive-functions}\n\\alias{team_drive_find}\n\\alias{team_drive_get}\n\\alias{team_drive_create}\n\\alias{team_drive_rm}\n\\alias{team_drive_update}\n\\alias{as_team_drive}\n\\alias{is_team_drive}\n\\title{Deprecated Team Drive functions}\n\\usage{\nteam_drive_find(pattern = NULL, n_max = Inf, ..., verbose = deprecated())\n\nteam_drive_get(name = NULL, id = NULL, verbose = deprecated())\n\nteam_drive_create(name, verbose = deprecated())\n\nteam_drive_rm(team_drive = NULL, verbose = deprecated())\n\nteam_drive_update(team_drive, ..., verbose = deprecated())\n\nas_team_drive(x, ...)\n\nis_team_drive(d)\n}\n\\arguments{\n\\item{pattern}{Character. If provided, only the items whose names match this\nregular expression are returned. This is implemented locally on the results\nreturned by the API.}\n\n\\item{n_max}{Integer. An upper bound on the number of items to return. This\napplies to the results requested from the API, which may be further\nfiltered locally, via the \\code{pattern} argument.}\n\n\\item{...}{Other parameters to pass along in the request, such as \\code{pageSize}\nor \\code{useDomainAdminAccess}.}\n\n\\item{name}{Character vector of names. A character vector marked with\n\\code{\\link[=as_id]{as_id()}} is treated as if it was provided via the \\code{id} argument.}\n\n\\item{id}{Character vector of shared drive ids or URLs (it is first processed\nwith \\code{\\link[=as_id]{as_id()}}). If both \\code{name} and \\code{id} are non-\\code{NULL}, \\code{id} is silently\nignored.}\n\n\\item{team_drive}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} Google Drive and the\nDrive API have replaced Team Drives with shared drives.}\n\n\\item{x}{A vector of shared drive names, a vector of shared drive ids marked\nwith \\code{\\link[=as_id]{as_id()}}, a list of Drives resource objects, or a suitable data\nframe.}\n\n\\item{d}{A \\code{\\link{dribble}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per shared drive.\n}\n\\description{\n\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}}\n\nTeam Drives have been rebranded as \\emph{shared drives} and, as of googledrive\nv2.0.0, all \\verb{team_drive_*()} functions have been deprecated, in favor of\n\\verb{shared_drive_*()} successors.\n\nThe changes in googledrive reflect that the Team Drives resource collection\nhas been deprecated in the Drive API v3, in favor of the new (shared) Drives\nresource collection. Read more\n\\itemize{\n\\item \\url{https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api}\n}\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/dribble-checks.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/dribble.R\n\\name{dribble-checks}\n\\alias{dribble-checks}\n\\alias{is_dribble}\n\\alias{no_file}\n\\alias{single_file}\n\\alias{some_files}\n\\alias{confirm_dribble}\n\\alias{confirm_single_file}\n\\alias{confirm_some_files}\n\\alias{is_folder}\n\\alias{is_shortcut}\n\\alias{is_folder_shortcut}\n\\alias{is_native}\n\\alias{is_parental}\n\\alias{is_mine}\n\\alias{is_shared_drive}\n\\title{Check facts about a dribble}\n\\usage{\nis_dribble(d)\n\nno_file(d)\n\nsingle_file(d)\n\nsome_files(d)\n\nconfirm_dribble(d)\n\nconfirm_single_file(d)\n\nconfirm_some_files(d)\n\nis_folder(d)\n\nis_shortcut(d)\n\nis_folder_shortcut(d)\n\nis_native(d)\n\nis_parental(d)\n\nis_mine(d)\n\nis_shared_drive(d)\n}\n\\arguments{\n\\item{d}{A \\code{\\link{dribble}}.}\n}\n\\description{\nSometimes you need to check things about a \\code{\\link{dribble}}` or about the files it\nrepresents, such as:\n\\itemize{\n\\item Is it even a dribble?\n\\item Size: Does the dribble hold exactly one file? At least one file? No file?\n\\item File type: Is this file a folder?\n\\item File ownership and access: Is it mine? Published? Shared?\n}\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n## most of us have multiple files or folders on Google Drive\nd <- drive_find()\nis_dribble(d)\nno_file(d)\nsingle_file(d)\nsome_files(d)\n\n# this will error\n# confirm_single_file(d)\n\nconfirm_some_files(d)\nis_folder(d)\nis_mine(d)\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/dribble.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/dribble.R\n\\name{dribble}\n\\alias{dribble}\n\\title{dribble object}\n\\description{\ngoogledrive stores the metadata for one or more Drive files or\nshared drives as a \\code{dribble}. It is a \"Drive\n\\link[tibble:tibble-package]{tibble}\" with one row per file or shared drive\nand, at a minimum, these columns:\n\\itemize{\n\\item \\code{name}: a character column containing file or shared drive names\n\\item \\code{id}: a character column of file or shared drive ids\n\\item \\code{drive_resource}: a list-column, each element of which is either a\n\\href{https://developers.google.com/drive/api/v3/reference/files#resource-representations}{Files resource}\nor a \\href{https://developers.google.com/drive/api/v3/reference/drives#resource-representations}{Drives resource}\nobject. Note there is no guarantee that all documented fields are always\npresent. We do check if the \\code{kind} field is present and equal to one of\n\\code{drive#file} or \\code{drive#drive}.\n}\n\nThe \\code{dribble} format is handy because it exposes the file name,\nwhich is good for humans, but keeps it bundled with the file's unique id\nand other metadata, which are needed for API calls.\n\nIn general, the \\code{dribble} class will be retained even after\nmanipulation, as long as the required variables are present and of the\ncorrect type. This works best for manipulations via the dplyr and vctrs\npackages.\n}\n\\seealso{\n\\code{\\link[=as_dribble]{as_dribble()}}\n}\n"
  },
  {
    "path": "man/drive_about.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_about.R\n\\name{drive_about}\n\\alias{drive_about}\n\\title{Get info on Drive capabilities}\n\\usage{\ndrive_about()\n}\n\\value{\nA list representation of a Drive\n\\href{https://developers.google.com/drive/api/v3/reference/about}{about resource}\n}\n\\description{\nGets information about the user, the user's Drive, and system capabilities.\nThis function mostly exists to power \\code{\\link[=drive_user]{drive_user()}}, which extracts the most\nuseful information (the information on current user) and prints it nicely.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\ndrive_about()\n\n# explore the export formats available for Drive files, by MIME type\nabout <- drive_about()\nabout[[\"exportFormats\"]] |>\n  purrr::map(unlist)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{about.get} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/about/get}\n}\n}\n"
  },
  {
    "path": "man/drive_auth.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_auth.R\n\\name{drive_auth}\n\\alias{drive_auth}\n\\title{Authorize googledrive}\n\\usage{\ndrive_auth(\n  email = gargle::gargle_oauth_email(),\n  path = NULL,\n  subject = NULL,\n  scopes = \"drive\",\n  cache = gargle::gargle_oauth_cache(),\n  use_oob = gargle::gargle_oob_default(),\n  token = NULL\n)\n}\n\\arguments{\n\\item{email}{Optional. If specified, \\code{email} can take several different\nforms:\n\\itemize{\n\\item \\code{\"jane@gmail.com\"}, i.e. an actual email address. This allows the user to\ntarget a specific Google identity. If specified, this is used for token\nlookup, i.e. to determine if a suitable token is already available in the\ncache. If no such token is found, \\code{email} is used to pre-select the targeted\nGoogle identity in the OAuth chooser. (Note, however, that the email\nassociated with a token when it's cached is always determined from the token\nitself, never from this argument).\n\\item \\code{\"*@example.com\"}, i.e. a domain-only glob pattern. This can be helpful if\nyou need code that \"just works\" for both \\code{alice@example.com} and\n\\code{bob@example.com}.\n\\item \\code{TRUE} means that you are approving email auto-discovery. If exactly one\nmatching token is found in the cache, it will be used.\n\\item \\code{FALSE} or \\code{NA} mean that you want to ignore the token cache and force a\nnew OAuth dance in the browser.\n}\n\nDefaults to the option named \\code{\"gargle_oauth_email\"}, retrieved by\n\\code{\\link[gargle:gargle_oauth_email]{gargle_oauth_email()}} (unless a wrapper package implements different\ndefault behavior).}\n\n\\item{path}{JSON identifying the service account, in one of the forms\nsupported for the \\code{txt} argument of \\code{\\link[jsonlite:fromJSON]{jsonlite::fromJSON()}} (typically, a\nfile path or JSON string).}\n\n\\item{subject}{An optional subject claim. Specify this if you wish to use the\nservice account represented by \\code{path} to impersonate the \\code{subject}, who is\na normal user. Before this can work, an administrator must grant the service\naccount domain-wide authority. Identify the user to impersonate via their\nemail, e.g. \\code{subject = \"user@example.com\"}. Note that gargle automatically\nadds the non-sensitive \\code{\"https://www.googleapis.com/auth/userinfo.email\"}\nscope, so this scope must be enabled for the service account, along with\nany other \\code{scopes} being requested.}\n\n\\item{scopes}{One or more API scopes. Each scope can be specified in full or,\nfor Drive API-specific scopes, in an abbreviated form that is recognized by\n\\code{\\link[=drive_scopes]{drive_scopes()}}:\n\\itemize{\n\\item \"drive\" = \"https://www.googleapis.com/auth/drive\" (the default)\n\\item \"full\" = \"https://www.googleapis.com/auth/drive\" (same as \"drive\")\n\\item \"drive.readonly\" = \"https://www.googleapis.com/auth/drive.readonly\"\n\\item \"drive.file\" = \"https://www.googleapis.com/auth/drive.file\"\n\\item \"drive.appdata\" = \"https://www.googleapis.com/auth/drive.appdata\"\n\\item \"drive.metadata\" = \"https://www.googleapis.com/auth/drive.metadata\"\n\\item \"drive.metadata.readonly\" = \"https://www.googleapis.com/auth/drive.metadata.readonly\"\n\\item \"drive.photos.readonly\" = \"https://www.googleapis.com/auth/drive.photos.readonly\"\n\\item \"drive.scripts\" = \"https://www.googleapis.com/auth/drive.scripts\n}\n\nSee \\url{https://developers.google.com/drive/api/guides/api-specific-auth} for\ndetails on the permissions for each scope.}\n\n\\item{cache}{Specifies the OAuth token cache. Defaults to the option named\n\\code{\"gargle_oauth_cache\"}, retrieved via \\code{\\link[gargle:gargle_oauth_cache]{gargle_oauth_cache()}}.}\n\n\\item{use_oob}{Whether to use out-of-band authentication (or, perhaps, a\nvariant implemented by gargle and known as \"pseudo-OOB\") when first\nacquiring the token. Defaults to the value returned by\n\\code{\\link[gargle:gargle_oob_default]{gargle_oob_default()}}. Note that (pseudo-)OOB auth only affects\nthe initial OAuth dance. If we retrieve (and possibly refresh) a\ncached token, \\code{use_oob} has no effect.\n\nIf the OAuth client is provided implicitly by a wrapper package, its type\nprobably defaults to the value returned by\n\\code{\\link[gargle:gargle_oauth_client_type]{gargle_oauth_client_type()}}. You can take control of the client\ntype by setting \\code{options(gargle_oauth_client_type = \"web\")} or\n\\code{options(gargle_oauth_client_type = \"installed\")}.}\n\n\\item{token}{A token with class \\link[httr:Token-class]{Token2.0} or an object of\nhttr's class \\code{request}, i.e. a token that has been prepared with\n\\code{\\link[httr:config]{httr::config()}} and has a \\link[httr:Token-class]{Token2.0} in the\n\\code{auth_token} component.}\n}\n\\description{\nAuthorize googledrive to view and manage your Drive files. This function is a\nwrapper around \\code{\\link[gargle:token_fetch]{gargle::token_fetch()}}.\n\nBy default, you are directed to a web browser, asked to sign in to your\nGoogle account, and to grant googledrive permission to operate on your\nbehalf with Google Drive. By default, with your permission, these user\ncredentials are cached in a folder below your home directory, from where\nthey can be automatically refreshed, as necessary. Storage at the user\nlevel means the same token can be used across multiple projects and\ntokens are less likely to be synced to the cloud by accident.\n}\n\\details{\nMost users, most of the time, do not need to call \\code{drive_auth()}\nexplicitly -- it is triggered by the first action that requires\nauthorization. Even when called, the default arguments often suffice.\n\nHowever, when necessary, \\code{drive_auth()} allows the user to explicitly:\n\\itemize{\n\\item Declare which Google identity to use, via an \\code{email} specification.\n\\item Use a service account token or workload identity federation via\n\\code{path}.\n\\item Bring your own \\code{token}.\n\\item Customize \\code{scopes}.\n\\item Use a non-default \\code{cache} folder or turn caching off.\n\\item Explicitly request out-of-band (OOB) auth via \\code{use_oob}.\n}\n\nIf you are interacting with R within a browser (applies to RStudio\nServer, Posit Workbench, Posit Cloud, and Google Colaboratory), you need\nOOB auth or the pseudo-OOB variant. If this does not happen\nautomatically, you can request it explicitly with \\code{use_oob = TRUE} or,\nmore persistently, by setting an option via\n\\code{options(gargle_oob_default = TRUE)}.\n\nThe choice between conventional OOB or pseudo-OOB auth is determined\nby the type of OAuth client. If the client is of the \"installed\" type,\n\\code{use_oob = TRUE} results in conventional OOB auth. If the client is of\nthe \"web\" type, \\code{use_oob = TRUE} results in pseudo-OOB auth. Packages\nthat provide a built-in OAuth client can usually detect which type of\nclient to use. But if you need to set this explicitly, use the\n\\code{\"gargle_oauth_client_type\"} option:\n\n\\if{html}{\\out{<div class=\"sourceCode r\">}}\\preformatted{options(gargle_oauth_client_type = \"web\")       # pseudo-OOB\n# or, alternatively\noptions(gargle_oauth_client_type = \"installed\") # conventional OOB\n}\\if{html}{\\out{</div>}}\n\nFor details on the many ways to find a token, see\n\\code{\\link[gargle:token_fetch]{gargle::token_fetch()}}. For deeper control over auth, use\n\\code{\\link[=drive_auth_configure]{drive_auth_configure()}} to bring your own OAuth client or API key.\nTo learn more about gargle options, see \\link[gargle:gargle_options]{gargle::gargle_options}.\n}\n\\examples{\n\\dontshow{if (rlang::is_interactive()) withAutoprint(\\{ # examplesIf}\n# load/refresh existing credentials, if available\n# otherwise, go to browser for authentication and authorization\ndrive_auth()\n\n# see user associated with current token\ndrive_user()\n\n# force use of a token associated with a specific email\ndrive_auth(email = \"jenny@example.com\")\ndrive_user()\n\n# force the OAuth web dance\ndrive_auth(email = NA)\n\n# use a 'read only' scope, so it's impossible to edit or delete files\ndrive_auth(scopes = \"drive.readonly\")\n\n# use a service account token\ndrive_auth(path = \"foofy-83ee9e7c9c48.json\")\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nOther auth functions: \n\\code{\\link{drive_auth_configure}()},\n\\code{\\link{drive_deauth}()},\n\\code{\\link{drive_scopes}()}\n}\n\\concept{auth functions}\n"
  },
  {
    "path": "man/drive_auth_configure.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_auth.R\n\\name{drive_auth_configure}\n\\alias{drive_auth_configure}\n\\alias{drive_api_key}\n\\alias{drive_oauth_client}\n\\title{Edit and view auth configuration}\n\\usage{\ndrive_auth_configure(client, path, api_key, app = deprecated())\n\ndrive_api_key()\n\ndrive_oauth_client()\n}\n\\arguments{\n\\item{client}{A Google OAuth client, presumably constructed via\n\\code{\\link[gargle:gargle_oauth_client_from_json]{gargle::gargle_oauth_client_from_json()}}. Note, however, that it is\npreferred to specify the client with JSON, using the \\code{path} argument.}\n\n\\item{path}{JSON downloaded from \\href{https://console.cloud.google.com}{Google Cloud Console}, containing a client id and\nsecret, in one of the forms supported for the \\code{txt} argument of\n\\code{\\link[jsonlite:fromJSON]{jsonlite::fromJSON()}} (typically, a file path or JSON string).}\n\n\\item{api_key}{API key.}\n\n\\item{app}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} Replaced by the \\code{client}\nargument.}\n}\n\\value{\n\\itemize{\n\\item \\code{drive_auth_configure()}: An object of R6 class\n\\link[gargle:AuthState-class]{gargle::AuthState}, invisibly.\n\\item \\code{drive_oauth_client()}: the current user-configured OAuth client.\n\\item \\code{drive_api_key()}: the current user-configured API key.\n}\n}\n\\description{\nThese functions give more control over and visibility into the auth\nconfiguration than \\code{\\link[=drive_auth]{drive_auth()}} does. \\code{drive_auth_configure()}\nlets the user specify their own:\n\\itemize{\n\\item OAuth client, which is used when obtaining a user token.\n\\item API key. If googledrive is de-authorized via \\code{\\link[=drive_deauth]{drive_deauth()}}, all\nrequests are sent with an API key in lieu of a token.\n}\n\nSee the \\code{vignette(\"get-api-credentials\", package = \"gargle\")}\nfor more.\nIf the user does not configure these settings, internal defaults\nare used.\n\n\\code{drive_oauth_client()} and \\code{drive_api_key()} retrieve the\ncurrently configured OAuth client and API key, respectively.\n}\n\\examples{\n# see and store the current user-configured OAuth client (probaby `NULL`)\n(original_client <- drive_oauth_client())\n\n# see and store the current user-configured API key (probaby `NULL`)\n(original_api_key <- drive_api_key())\n\n# the preferred way to configure your own client is via a JSON file\n# downloaded from Google Developers Console\n# this example JSON is indicative, but fake\npath_to_json <- system.file(\n  \"extdata\", \"client_secret_installed.googleusercontent.com.json\",\n  package = \"gargle\"\n)\ndrive_auth_configure(path = path_to_json)\n\n# this is also obviously a fake API key\ndrive_auth_configure(api_key = \"the_key_I_got_for_a_google_API\")\n\n# confirm the changes\ndrive_oauth_client()\ndrive_api_key()\n\n# restore original auth config\ndrive_auth_configure(client = original_client, api_key = original_api_key)\n}\n\\seealso{\nOther auth functions: \n\\code{\\link{drive_auth}()},\n\\code{\\link{drive_deauth}()},\n\\code{\\link{drive_scopes}()}\n}\n\\concept{auth functions}\n"
  },
  {
    "path": "man/drive_browse.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_browse.R\n\\name{drive_browse}\n\\alias{drive_browse}\n\\title{Visit Drive file in browser}\n\\usage{\ndrive_browse(file = .Last.value)\n}\n\\arguments{\n\\item{file}{Something that identifies the file of interest on your Google\nDrive. Can be a name or path, a file id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a\n\\code{\\link{dribble}}.}\n}\n\\value{\nCharacter vector of file hyperlinks, from \\code{\\link[=drive_link]{drive_link()}}, invisibly.\n}\n\\description{\nVisits a file on Google Drive in your default browser.\n}\n\\examples{\n\\dontshow{if (drive_has_token() && rlang::is_interactive()) withAutoprint(\\{ # examplesIf}\ndrive_find(n_max = 1) |> drive_browse()\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/drive_cp.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_cp.R\n\\name{drive_cp}\n\\alias{drive_cp}\n\\title{Copy a Drive file}\n\\usage{\ndrive_cp(\n  file,\n  path = NULL,\n  name = NULL,\n  ...,\n  overwrite = NA,\n  verbose = deprecated()\n)\n}\n\\arguments{\n\\item{file}{Something that identifies the file of interest on your Google\nDrive. Can be a name or path, a file id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a\n\\code{\\link{dribble}}.}\n\n\\item{path}{Specifies target destination for the new file on Google\nDrive. Can be an actual path (character), a file id marked with\n\\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.\n\nIf \\code{path} is a shortcut to a folder, it is automatically resolved to its\ntarget folder.\n\nIf \\code{path} is given as a path (as opposed to a \\code{dribble} or an id), it is\nbest to explicitly indicate if it's a folder by including a trailing\nslash, since it cannot always be worked out from the context of the call.\nBy default, the new file has the same parent folder as the\nsource file.}\n\n\\item{name}{Character, new file name if not specified as part of\n\\code{path}. This will force \\code{path} to be interpreted as a folder, even if it\nis character and lacks a trailing slash. Defaults to \"Copy of \\code{FILE-NAME}\".}\n\n\\item{...}{Named parameters to pass along to the Drive API. Has \\link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by\nspecifying properties of the Files resource via \\code{...}. Read the \"Request\nbody\" section of the Drive API docs for the associated endpoint to learn\nabout relevant parameters.}\n\n\\item{overwrite}{Logical, indicating whether to check for a pre-existing file\nat the targetted \"filepath\". The quotes around \"filepath\" refer to the fact\nthat Drive does not impose a 1-to-1 relationship between filepaths and files,\nlike a typical file system; read more about that in \\code{\\link[=drive_get]{drive_get()}}.\n\\itemize{\n\\item \\code{NA} (default): Just do the operation, even if it results in multiple\nfiles with the same filepath.\n\\item \\code{TRUE}: Check for a pre-existing file at the filepath. If there is\nzero or one, move a pre-existing file to the trash, then carry on. Note\nthat the new file does not inherit any properties from the old one, such\nas sharing or publishing settings. It will have a new file ID. An error is\nthrown if two or more pre-existing files are found.\n\\item \\code{FALSE}: Error if there is any pre-existing file at the filepath.\n}\n\nNote that existence checks, based on filepath, are expensive operations, i.e.\nthey require additional API calls.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nCopies an existing Drive file into a new file id.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Target one of the official example files\n(src_file <- drive_example_remote(\"chicken.txt\"))\n\n# Make a \"Copy of\" copy in your My Drive\ncp1 <- drive_cp(src_file)\n\n# Make an explicitly named copy, in a different folder, and star it.\n# The starring is an example of providing metadata via `...`.\n# `starred` is not an actual argument to `drive_cp()`,\n# it just gets passed through to the API.\nfolder <- drive_mkdir(\"drive-cp-folder\")\ncp2 <- drive_cp(\n  src_file,\n  path = folder,\n  name = \"chicken-cp.txt\",\n  starred = TRUE\n)\ndrive_reveal(cp2, \"starred\")\n\n# `overwrite = FALSE` errors if file already exists at target filepath\n# THIS WILL ERROR!\n# drive_cp(src_file, name = \"Copy of chicken.txt\", overwrite = FALSE)\n\n# `overwrite = TRUE` moves an existing file to trash, then proceeds\ncp3 <- drive_cp(src_file, name = \"Copy of chicken.txt\", overwrite = TRUE)\n\n# Delete all of our copies and the new folder!\ndrive_rm(cp1, cp2, cp3, folder)\n\n# Target an official example file that's a csv file\n(csv_file <- drive_example_remote(\"chicken.csv\"))\n\n# copy AND AT THE SAME TIME convert it to a Google Sheet\nchicken_sheet <- drive_cp(\n  csv_file,\n  name = \"chicken-sheet-copy\",\n  mime_type = drive_mime_type(\"spreadsheet\")\n)\n# is it really a Google Sheet?\ndrive_reveal(chicken_sheet, \"mime_type\")$mime_type\n\n# go see the new Sheet in the browser\n# drive_browse(chicken_sheet)\n\n# Clean up\ndrive_rm(chicken_sheet)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{files.copy} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/copy}\n}\n}\n"
  },
  {
    "path": "man/drive_create.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_create.R\n\\name{drive_create}\n\\alias{drive_create}\n\\title{Create a new blank Drive file}\n\\usage{\ndrive_create(\n  name,\n  path = NULL,\n  type = NULL,\n  ...,\n  overwrite = NA,\n  verbose = deprecated()\n)\n}\n\\arguments{\n\\item{name}{Name for the new file or, optionally, a path that specifies\nan existing parent folder, as well as the new file name.}\n\n\\item{path}{Target destination for the new item, i.e. a folder or a\nshared drive. Can be given as an actual path (character), a file id or URL\nmarked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}. Defaults to your \"My Drive\" root\nfolder. If \\code{path} is a shortcut to a folder, it is automatically resolved\nto its target folder.}\n\n\\item{type}{Character. Create a blank Google Doc, Sheet or Slides by\nsetting \\code{type} to \\code{document}, \\code{spreadsheet}, or \\code{presentation},\nrespectively. All non-\\code{NULL} values for \\code{type} are pre-processed with\n\\code{\\link[=drive_mime_type]{drive_mime_type()}}.}\n\n\\item{...}{Named parameters to pass along to the Drive API. Has \\link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by\nspecifying properties of the Files resource via \\code{...}. Read the \"Request\nbody\" section of the Drive API docs for the associated endpoint to learn\nabout relevant parameters.}\n\n\\item{overwrite}{Logical, indicating whether to check for a pre-existing file\nat the targetted \"filepath\". The quotes around \"filepath\" refer to the fact\nthat Drive does not impose a 1-to-1 relationship between filepaths and files,\nlike a typical file system; read more about that in \\code{\\link[=drive_get]{drive_get()}}.\n\\itemize{\n\\item \\code{NA} (default): Just do the operation, even if it results in multiple\nfiles with the same filepath.\n\\item \\code{TRUE}: Check for a pre-existing file at the filepath. If there is\nzero or one, move a pre-existing file to the trash, then carry on. Note\nthat the new file does not inherit any properties from the old one, such\nas sharing or publishing settings. It will have a new file ID. An error is\nthrown if two or more pre-existing files are found.\n\\item \\code{FALSE}: Error if there is any pre-existing file at the filepath.\n}\n\nNote that existence checks, based on filepath, are expensive operations, i.e.\nthey require additional API calls.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nCreates a new blank Drive file. Note there are better options for these\nspecial cases:\n\\itemize{\n\\item Creating a folder? Use \\code{\\link[=drive_mkdir]{drive_mkdir()}}.\n\\item Want to upload existing local content into a new Drive file? Use\n\\code{\\link[=drive_upload]{drive_upload()}}.\n}\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Create a blank Google Doc named 'WordStar' in\n# your 'My Drive' root folder and star it\nwordstar <- drive_create(\"WordStar\", type = \"document\", starred = TRUE)\n\n# is 'WordStar' really starred? YES\npurrr::pluck(wordstar, \"drive_resource\", 1, \"starred\")\n\n# Create a blank Google Slides presentation in\n# the root folder, and set its description\nexecuvision <- drive_create(\n  \"ExecuVision\",\n  type = \"presentation\",\n  description = \"deeply nested bullet lists FTW\"\n)\n\n# Did we really set the description? YES\npurrr::pluck(execuvision, \"drive_resource\", 1, \"description\")\n\n# check out the new presentation\ndrive_browse(execuvision)\n\n# Create folder 'b4xl' in the root folder,\n# then create an empty new Google Sheet in it\nb4xl <- drive_mkdir(\"b4xl\")\ndrive_create(\"VisiCalc\", path = b4xl, type = \"spreadsheet\")\n\n# Another way to create a Google Sheet in the folder 'b4xl'\ndrive_create(\"b4xl/SuperCalc\", type = \"spreadsheet\")\n\n# Yet another way to create a new file in a folder,\n# this time specifying parent `path` as a character\ndrive_create(\"Lotus 1-2-3\", path = \"b4xl\", type = \"spreadsheet\")\n\n# Did we really create those Sheets in the intended folder? YES\ndrive_ls(\"b4xl\")\n\n# `overwrite = FALSE` errors if file already exists at target filepath\n# THIS WILL ERROR!\ndrive_create(\"VisiCalc\", path = b4xl, overwrite = FALSE)\n\n# `overwrite = TRUE` moves an existing file to trash, then proceeds\ndrive_create(\"VisiCalc\", path = b4xl, overwrite = TRUE)\n\n# Clean up\ndrive_rm(wordstar, b4xl, execuvision)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{files.create} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/create}\n}\n}\n"
  },
  {
    "path": "man/drive_deauth.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_auth.R\n\\name{drive_deauth}\n\\alias{drive_deauth}\n\\title{Suspend authorization}\n\\usage{\ndrive_deauth()\n}\n\\description{\nPut googledrive into a de-authorized state. Instead of sending a token,\ngoogledrive will send an API key. This can be used to access public\nresources for which no Google sign-in is required. This is handy for using\ngoogledrive in a non-interactive setting to make requests that do not\nrequire a token. It will prevent the attempt to obtain a token\ninteractively in the browser. The user can configure their own API key\nvia \\code{\\link[=drive_auth_configure]{drive_auth_configure()}} and retrieve that key via\n\\code{\\link[=drive_api_key]{drive_api_key()}}.\nIn the absence of a user-configured key, a built-in default key is used.\n}\n\\examples{\n\\dontshow{if (rlang::is_interactive()) withAutoprint(\\{ # examplesIf}\ndrive_deauth()\ndrive_user()\n\n# in a deauth'ed state, we can still get metadata on a world-readable file\npublic_file <- drive_example_remote(\"chicken.csv\")\npublic_file\n# we can still download it too\ndrive_download(public_file)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nOther auth functions: \n\\code{\\link{drive_auth}()},\n\\code{\\link{drive_auth_configure}()},\n\\code{\\link{drive_scopes}()}\n}\n\\concept{auth functions}\n"
  },
  {
    "path": "man/drive_download.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_download.R\n\\name{drive_download}\n\\alias{drive_download}\n\\title{Download a Drive file}\n\\usage{\ndrive_download(\n  file,\n  path = NULL,\n  type = NULL,\n  overwrite = FALSE,\n  verbose = deprecated()\n)\n}\n\\arguments{\n\\item{file}{Something that identifies the file of interest on your Google\nDrive. Can be a name or path, a file id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a\n\\code{\\link{dribble}}.}\n\n\\item{path}{Character. Path for output file. If absent, the default file name\nis the file's name on Google Drive and the default location is working\ndirectory, possibly with an added file extension.}\n\n\\item{type}{Character. Only consulted if \\code{file} is a native Google file.\nSpecifies the desired type of the exported file. Will be processed via\n\\code{\\link[=drive_mime_type]{drive_mime_type()}}, so either a file extension like \\code{\"pdf\"} or a full MIME\ntype like \\code{\"application/pdf\"} is acceptable.}\n\n\\item{overwrite}{A logical scalar. If local \\code{path} already exists, do you\nwant to overwrite it?}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nThis function downloads a file from Google Drive. Native Google\nfile types, such as Google Docs, Google Sheets, and Google Slides, must be\nexported to a conventional local file type. This can be specified:\n\\itemize{\n\\item explicitly via \\code{type}\n\\item implicitly via the file extension of \\code{path}\n\\item not at all, i.e. rely on the built-in default\n}\n\nTo see what export file types are even possible, see the \\href{https://developers.google.com/drive/api/v3/ref-export-formats}{Drive API documentation}\nor the result of \\code{drive_about()$exportFormats}. The returned dribble\nincludes a \\code{local_path} column.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Target one of the official example files\n(src_file <- drive_example_remote(\"chicken_sheet\"))\n\n# Download Sheet as csv, explicit type\ndownloaded_file <- drive_download(src_file, type = \"csv\")\n\n# See local path to new file\ndownloaded_file$local_path\n\n# Download as csv, type implicit in file extension\ndrive_download(src_file, path = \"my_csv_file.csv\")\n\n# Download with default name and type (xlsx)\ndrive_download(src_file)\n\n# Clean up\nunlink(c(\"chicken_sheet.csv\", \"chicken_sheet.xlsx\", \"my_csv_file.csv\"))\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\n\\href{https://developers.google.com/drive/api/v3/manage-downloads}{Download files}, in the\nDrive API documentation.\n}\n"
  },
  {
    "path": "man/drive_empty_trash.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_trash.R\n\\name{drive_empty_trash}\n\\alias{drive_empty_trash}\n\\title{Empty Drive Trash}\n\\usage{\ndrive_empty_trash(verbose = deprecated())\n}\n\\arguments{\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\description{\nCaution, this will permanently delete files in your Drive trash.\n}\n"
  },
  {
    "path": "man/drive_endpoints.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_endpoints.R\n\\name{drive_endpoints}\n\\alias{drive_endpoints}\n\\alias{drive_endpoint}\n\\title{List Drive endpoints}\n\\usage{\ndrive_endpoints(i = NULL)\n\ndrive_endpoint(i)\n}\n\\arguments{\n\\item{i}{The name(s) or integer index(ices) of the endpoints to return. \\code{i}\nis optional for \\code{drive_endpoints()} and, if not given, the entire list is\nreturned.}\n}\n\\value{\nOne or more of the Drive API v3 endpoints that are used internally by\ngoogledrive.\n}\n\\description{\nThe googledrive package stores a named list of Drive API v3 endpoints (or\n\"methods\", using Google's vocabulary) internally and these functions expose\nthis data.\n\\itemize{\n\\item \\code{drive_endpoint()} returns one endpoint, i.e. it uses \\code{[[}.\n\\item \\code{drive_endpoints()} returns a list of endpoints, i.e. it uses \\code{[}.\n}\n\nThe names of this list (or the \\code{id} sub-elements) are the nicknames that can\nbe used to specify an endpoint in \\code{\\link[=request_generate]{request_generate()}}. For each endpoint, we\nstore its nickname or \\code{id}, the associated HTTP verb, the \\code{path}, and details\nabout the parameters. This list is derived programmatically from the Drive\nAPI v3 Discovery Document\n(\\verb{https://www.googleapis.com/discovery/v1/apis/drive/v3/rest}) using the\napproach described in the \\href{https://gargle.r-lib.org/articles/request-helper-functions.html#discovery-documents}{Discovery Documents section}\nof the gargle vignette \\href{https://gargle.r-lib.org/articles/request-helper-functions.html}{Request helper functions}.\n}\n\\examples{\nstr(head(drive_endpoints(), 3), max.level = 2)\ndrive_endpoint(\"drive.files.delete\")\ndrive_endpoint(4)\n}\n"
  },
  {
    "path": "man/drive_examples.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_examples.R\n\\name{drive_examples}\n\\alias{drive_examples}\n\\alias{drive_examples_local}\n\\alias{drive_examples_remote}\n\\alias{drive_example_local}\n\\alias{drive_example_remote}\n\\title{Example files}\n\\usage{\ndrive_examples_local(matches)\n\ndrive_examples_remote(matches)\n\ndrive_example_local(matches)\n\ndrive_example_remote(matches)\n}\n\\arguments{\n\\item{matches}{A regular expression that matches the name of the desired\nexample file(s). This argument is optional for the plural forms\n(\\code{drive_examples_local()} and \\code{drive_examples_remote()}) and, if provided,\nmultiple matches are allowed. The single forms (\\code{drive_example_local()} and\n\\code{drive_example_remote()}) require this argument and require that there is\nexactly one match.}\n}\n\\value{\n\\itemize{\n\\item For \\code{drive_example_local()} and \\code{drive_examples_local()}, one or more local\nfilepaths.\n\\item For \\code{drive_example_remote()} and \\code{drive_examples_remote()}, a \\code{dribble}.\n}\n}\n\\description{\ngoogledrive makes a variety of example files -- both local and remote --\navailable for use in examples and reprexes. These functions help you access\nthe example files. See \\code{vignette(\"example-files\", package = \"googledrive\")}\nfor more.\n}\n\\examples{\ndrive_examples_local() |> basename()\ndrive_examples_local(\"chicken\") |> basename()\ndrive_example_local(\"imdb\")\n\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\ndrive_examples_remote()\ndrive_examples_remote(\"chicken\")\ndrive_example_remote(\"chicken_doc\")\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/drive_extension.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_mime_type.R\n\\name{drive_extension}\n\\alias{drive_extension}\n\\title{Lookup extension from MIME type}\n\\usage{\ndrive_extension(type = NULL)\n}\n\\arguments{\n\\item{type}{Character. MIME type or file extension.}\n}\n\\value{\nCharacter. File extension.\n}\n\\description{\nThis is a helper to determinine which extension should be used\nfor a file. Two types of input are acceptable:\n\\itemize{\n\\item MIME types accepted by Google Drive.\n\\item File extensions, such as \"pdf\", \"csv\", etc. (these are simply passed through).\n}\n}\n\\examples{\n\n## get the extension for mime type image/jpeg\ndrive_extension(\"image/jpeg\")\n\n## it's vectorized\ndrive_extension(c(\"text/plain\", \"pdf\", \"image/gif\"))\n}\n"
  },
  {
    "path": "man/drive_fields.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_fields.R\n\\name{drive_fields}\n\\alias{drive_fields}\n\\alias{prep_fields}\n\\title{Request partial resources}\n\\usage{\ndrive_fields(fields = NULL, resource = \"files\")\n\nprep_fields(fields, resource = \"files\")\n}\n\\arguments{\n\\item{fields}{Character vector of field names. If \\code{resource = \"files\"}, they\nare checked for validity. Otherwise, they are passed through.}\n\n\\item{resource}{Character, naming the API resource of interest. Currently,\nonly the Files resource is anticipated.}\n}\n\\value{\n\\code{drive_fields()}: Character vector of field names. \\code{prep_fields()}: a\nstring.\n}\n\\description{\nYou may be able to improve the performance of your API calls by\nrequesting only the metadata that you actually need. This function is\nprimarily for internal use and is currently focused on the \\href{https://developers.google.com/drive/api/v3/reference/files}{Files resource}. Note\nthat high-level googledrive functions assume that the \\code{name}, \\code{id}, and\n\\code{kind} fields are included, at a bare minimum. Assuming that \\code{resource = \"files\"} (the default), input provided via \\code{fields} is checked for validity\nagainst the known field names and the validated fields are returned. To see\na tibble containing all possible fields and a short description of each,\ncall \\code{drive_fields(expose())}.\n\n\\code{prep_fields()} prepares fields for inclusion as query\nparameters.\n}\n\\examples{\n# get a tibble of all fields for the Files resource + indicator of defaults\ndrive_fields(expose())\n\n# invalid fields are removed and throw warning\ndrive_fields(c(\"name\", \"parents\", \"ownedByMe\", \"pancakes!\"))\n\n# prepare fields for query\nprep_fields(c(\"name\", \"parents\", \"kind\"))\n}\n\\seealso{\n\\href{https://developers.google.com/drive/api/v3/performance}{Improve performance}, in\nthe Drive API documentation.\n}\n"
  },
  {
    "path": "man/drive_find.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_find.R\n\\name{drive_find}\n\\alias{drive_find}\n\\title{Find files on Google Drive}\n\\usage{\ndrive_find(\n  pattern = NULL,\n  trashed = FALSE,\n  type = NULL,\n  n_max = Inf,\n  shared_drive = NULL,\n  corpus = NULL,\n  ...,\n  verbose = deprecated(),\n  team_drive = deprecated()\n)\n}\n\\arguments{\n\\item{pattern}{Character. If provided, only the items whose names match this\nregular expression are returned. This is implemented locally on the results\nreturned by the API.}\n\n\\item{trashed}{Logical. Whether to search files that are not in the trash\n(\\code{trashed = FALSE}, the default), only files that are in the trash\n(\\code{trashed = TRUE}), or to search regardless of trashed status (\\code{trashed = NA}).}\n\n\\item{type}{Character. If provided, only files of this type will be returned.\nCan be anything that \\code{\\link[=drive_mime_type]{drive_mime_type()}} knows how to handle. This is\nprocessed by googledrive and sent as a query parameter.}\n\n\\item{n_max}{Integer. An upper bound on the number of items to return. This\napplies to the results requested from the API, which may be further\nfiltered locally, via the \\code{pattern} argument.}\n\n\\item{shared_drive}{Anything that identifies one specific shared drive: its\nname, its id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}. The value\nprovided to \\code{shared_drive} is pre-processed with \\code{\\link[=as_shared_drive]{as_shared_drive()}}. Read\nmore about \\link[=shared_drives]{shared drives}.}\n\n\\item{corpus}{Character, specifying which collections of items to search.\nRelevant to those who work with shared drives and/or Google Workspace\ndomains. If specified, must be one of \\code{\"user\"}, \\code{\"drive\"} (requires that\n\\code{shared_drive} also be specified), \\code{\"allDrives\"}, or \\code{\"domain\"}. Read more\nabout \\link[=shared_drives]{shared drives}.}\n\n\\item{...}{Other parameters to pass along in the request. The most likely\ncandidate is \\code{q}. See below and the API's\n\\href{https://developers.google.com/drive/api/v3/search-files}{Search for files and folders guide}.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n\n\\item{team_drive}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} Google Drive and the\nDrive API have replaced Team Drives with shared drives.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nThis is the closest googledrive function to what you can do at\n\\url{https://drive.google.com}: by default, you just get a listing of your files.\nYou can also search in various ways, e.g., filter by file type or ownership\nor work with \\link[=shared_drives]{shared drives}. This is a very powerful\nfunction. Together with the more specific \\code{\\link[=drive_get]{drive_get()}}, this is the main way\nto identify files to target for downstream work. If you know you want to\nsearch within a specific folder or shared drive, use \\code{\\link[=drive_ls]{drive_ls()}}.\n}\n\\section{File type}{\n\n\nThe \\code{type} argument is pre-processed with \\code{\\link[=drive_mime_type]{drive_mime_type()}}, so you can\nuse a few shortcuts and file extensions, in addition to full-blown MIME\ntypes. googledrive forms a search clause to pass to \\code{q}.\n}\n\n\\section{Search parameters}{\n\n\nDo advanced search on file properties by providing search clauses to the\n\\code{q} parameter that is passed to the API via \\code{...}. Multiple \\code{q} clauses or\nvector-valued \\code{q} are combined via 'and'.\n}\n\n\\section{Trash}{\n\n\nBy default, \\code{drive_find()} sets \\code{trashed = FALSE} and does not include\nfiles in the trash. Literally, it adds \\code{q = \"trashed = false\"} to the\nquery. To search \\emph{only} the trash, set \\code{trashed = TRUE}. To see files\nregardless of trash status, set \\code{trashed = NA}, which adds\n\\code{q = \"(trashed = true or trashed = false)\"} to the query.\n}\n\n\\section{Sort order}{\n\n\nBy default, \\code{drive_find()} sends \\code{orderBy = \"recency desc\"}, so the top\nfiles in your result have high \"recency\" (whatever that means). To suppress\nsending \\code{orderBy} at all, do \\code{drive_find(orderBy = NULL)}. The \\code{orderBy}\nparameter accepts sort keys in addition to \\code{recency}, which are documented\nin the \\href{https://developers.google.com/drive/api/v3/reference/files/list}{\\code{files.list} endpoint}.\ngoogledrive translates a snake_case specification of \\code{order_by} into the\nlowerCamel form, \\code{orderBy}.\n}\n\n\\section{Shared drives and domains}{\n\n\nIf you work with shared drives and/or Google Workspace, you can apply your\nsearch query to collections of items beyond those associated with \"My\nDrive\". Use the \\code{shared_drive} or \\code{corpus} arguments to control this.\nRead more about \\link[=shared_drives]{shared drives}.\n}\n\n\\examples{\n\\dontrun{\n# list \"My Drive\" w/o regard for folder hierarchy\ndrive_find()\n\n# filter for folders, the easy way and the hard way\ndrive_find(type = \"folder\")\ndrive_find(q = \"mimeType = 'application/vnd.google-apps.folder'\")\n\n# filter for Google Sheets, the easy way and the hard way\ndrive_find(type = \"spreadsheet\")\ndrive_find(q = \"mimeType='application/vnd.google-apps.spreadsheet'\")\n\n# files whose names match a regex\n# the local, general, sometimes-slow-to-execute version\ndrive_find(pattern = \"ick\")\n# the server-side, executes-faster version\n# NOTE: works only for a pattern at the beginning of file name\ndrive_find(q = \"name contains 'chick'\")\n\n# search for files located directly in your root folder\ndrive_find(q = \"'root' in parents\")\n# FYI: this is equivalent to\ndrive_ls(\"~/\")\n\n# control page size or cap the number of files returned\ndrive_find(pageSize = 50)\n# all params passed through `...` can be camelCase or snake_case\ndrive_find(page_size = 50)\ndrive_find(n_max = 58)\ndrive_find(page_size = 5, n_max = 15)\n\n# various ways to specify q search clauses\n# multiple q's\ndrive_find(\n  q = \"name contains 'TEST'\",\n  q = \"modifiedTime > '2020-07-21T12:00:00'\"\n)\n# vector q\ndrive_find(q = c(\"starred = true\", \"visibility = 'anyoneWithLink'\"))\n\n# default `trashed = FALSE` excludes files in the trash\n# `trashed = TRUE` consults ONLY file in the trash\ndrive_find(trashed = TRUE)\n# `trashed = NA` disregards trash status completely\ndrive_find(trashed = NA)\n\n# suppress the default sorting on recency\ndrive_find(order_by = NULL, n_max = 5)\n\n# sort on various keys\ndrive_find(order_by = \"modifiedByMeTime\", n_max = 5)\n# request descending order\ndrive_find(order_by = \"quotaBytesUsed desc\", n_max = 5)\n}\n\n}\n\\seealso{\nWraps the \\code{files.list} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/list}\n}\n\nHelpful resource for forming your own queries:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/search-files}\n}\n}\n"
  },
  {
    "path": "man/drive_get.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_get.R\n\\name{drive_get}\n\\alias{drive_get}\n\\title{Get Drive files by path or id}\n\\usage{\ndrive_get(\n  path = NULL,\n  id = NULL,\n  shared_drive = NULL,\n  corpus = NULL,\n  verbose = deprecated(),\n  team_drive = deprecated()\n)\n}\n\\arguments{\n\\item{path}{Character vector of path(s) to get. Use a trailing slash to\nindicate explicitly that a path is a folder, which can disambiguate if\nthere is a file of the same name (yes this is possible on Drive!). If\n\\code{path} appears to contain Drive URLs or is explicitly marked with\n\\code{\\link[=as_id]{as_id()}}, it is treated as if it was provided via the \\code{id} argument.}\n\n\\item{id}{Character vector of Drive file ids or URLs (it is first processed\nwith \\code{\\link[=as_id]{as_id()}}). If both \\code{path} and \\code{id} are non-\\code{NULL}, \\code{id} is silently\nignored.}\n\n\\item{shared_drive}{Anything that identifies one specific shared drive: its\nname, its id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}. The value\nprovided to \\code{shared_drive} is pre-processed with \\code{\\link[=as_shared_drive]{as_shared_drive()}}. Read\nmore about \\link[=shared_drives]{shared drives}.}\n\n\\item{corpus}{Character, specifying which collections of items to search.\nRelevant to those who work with shared drives and/or Google Workspace\ndomains. If specified, must be one of \\code{\"user\"}, \\code{\"drive\"} (requires that\n\\code{shared_drive} also be specified), \\code{\"allDrives\"}, or \\code{\"domain\"}. Read more\nabout \\link[=shared_drives]{shared drives}.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n\n\\item{team_drive}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} Google Drive and the\nDrive API have replaced Team Drives with shared drives.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\nIf the target files were specified via \\code{path},\nthere will be a \\code{path} column.\n}\n\\description{\nRetrieves metadata for files specified via \\code{path} or via file \\code{id}. This\nfunction is quite straightforward if you specify files by \\code{id}. But there are\nsome important considerations when you specify your target files by \\code{path}.\nSee below for more. If the target files are specified via \\code{path}, the\nreturned \\code{\\link{dribble}} will include a \\code{path} column.\n}\n\\section{Getting by \\code{path}}{\n\n\nGoogle Drive does NOT behave like your local file system! File and folder\nnames need not be unique, even at a given level of the hierarchy. This\nmeans that a single path can describe multiple files (or 0 or exactly 1).\n\nA single file can also be compatible with multiple paths, i.e. one path\ncould be more specific than the other. A file located at \\verb{~/alfa/bravo} can\nbe found as \\code{bravo}, \\code{alfa/bravo}, and \\verb{~/alfa/bravo}. If all 3 of those\nwere included in the input \\code{path}, they would be represented by a\n\\strong{single} row in the output.\n\nIt's best to think of \\code{drive_get()} as a setwise operation when using file\npaths. Do not assume that the \\code{i}-th input path corresponds to row \\code{i} in\nthe output (although it often does!). If there's not a 1-to-1 relationship\nbetween the input and output, this will be announced in a message.\n\n\\code{drive_get()} performs just enough path resolution to uniquely identify a\nfile compatible with each input \\code{path}, for all \\code{path}s at once. If you\nabsolutely want the full canonical path, run the output of \\code{drive_get()}\nthrough \\code{\\link[=drive_reveal]{drive_reveal(d, \"path\")}}`.\n}\n\n\\section{Files that you don't own}{\n\n\nIf you want to get a file via \\code{path} and it's not necessarily on your My\nDrive, you may need to specify the \\code{shared_drive} or \\code{corpus} arguments to\nsearch other collections of items. Read more about \\link[=shared_drives]{shared drives}.\n}\n\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# get info about your \"My Drive\" root folder\ndrive_get(\"~/\")\n# the API reserves the file id \"root\" for your root folder\ndrive_get(id = \"root\")\ndrive_get(id = \"root\") |> drive_reveal(\"path\")\n\n# set up some files to get by path\nalfalfa <- drive_mkdir(\"alfalfa\")\nbroccoli <- drive_upload(\n  drive_example_local(\"chicken.txt\"),\n  name = \"broccoli\", path = alfalfa\n)\ndrive_get(\"broccoli\")\ndrive_get(\"alfalfa/broccoli\")\ndrive_get(\"~/alfalfa/broccoli\")\ndrive_get(c(\"broccoli\", \"alfalfa/\", \"~/alfalfa/broccoli\"))\n\n# Clean up\ndrive_rm(alfalfa)\n\n\\dontrun{\n# The examples below are indicative of correct syntax.\n# But note these will generally result in an error or a\n# 0-row dribble, unless you replace the inputs with paths\n# or file ids that exist in your Drive.\n\n# multiple names\ndrive_get(c(\"abc\", \"def\"))\n\n# multiple names, one of which must be a folder\ndrive_get(c(\"abc\", \"def/\"))\n\n# query by file id(s)\ndrive_get(id = \"abcdefgeh123456789\")\ndrive_get(as_id(\"abcdefgeh123456789\"))\ndrive_get(id = c(\"abcdefgh123456789\", \"jklmnopq123456789\"))\n\n# apply to a browser URL for, e.g., a Google Sheet\nmy_url <- \"https://docs.google.com/spreadsheets/d/FILE_ID/edit#gid=SHEET_ID\"\ndrive_get(my_url)\ndrive_get(as_id(my_url))\ndrive_get(id = my_url)\n\n# access the shared drive named \"foo\"\n# shared_drive params must be specified if getting by path\nfoo <- shared_drive_get(\"foo\")\ndrive_get(c(\"this.jpg\", \"that-file\"), shared_drive = foo)\n# shared_drive params are not necessary if getting by id\ndrive_get(as_id(\"123456789\"))\n\n# search all shared drives and other files user has accessed\ndrive_get(c(\"this.jpg\", \"that-file\"), corpus = \"allDrives\")\n}\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nTo add path information to any \\code{\\link{dribble}} that lacks it, use\n\\code{\\link[=drive_reveal]{drive_reveal(d, \"path\")}}. To list the contents of a\nfolder, use \\code{\\link[=drive_ls]{drive_ls()}}. For general searching, use \\code{\\link[=drive_find]{drive_find()}}.\n\nWraps the \\code{files.get} endpoint and, if you specify files by name or\npath, also calls \\code{files.list}:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/get}\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/list}\n}\n}\n"
  },
  {
    "path": "man/drive_has_token.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_auth.R\n\\name{drive_has_token}\n\\alias{drive_has_token}\n\\title{Is there a token on hand?}\n\\usage{\ndrive_has_token()\n}\n\\value{\nLogical.\n}\n\\description{\nReports whether googledrive has stored a token, ready for use in downstream\nrequests.\n}\n\\examples{\ndrive_has_token()\n}\n\\seealso{\nOther low-level API functions: \n\\code{\\link{drive_token}()},\n\\code{\\link{request_generate}()},\n\\code{\\link{request_make}()}\n}\n\\concept{low-level API functions}\n"
  },
  {
    "path": "man/drive_id.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_id-class.R\n\\name{drive_id}\n\\alias{drive_id}\n\\alias{as_id}\n\\title{\\code{drive_id} class}\n\\usage{\nas_id(x, ...)\n}\n\\arguments{\n\\item{x}{A character vector of file or shared drive ids or URLs, a\n\\code{\\link{dribble}}, or a suitable data frame.}\n\n\\item{...}{Other arguments passed down to methods. (Not used.)}\n}\n\\value{\nA character vector bearing the S3 class \\code{drive_id}.\n}\n\\description{\n\\code{drive_id} is an S3 class to mark strings as Drive file ids, in order to\ndistinguish them from Drive file names or paths. \\code{as_id()} converts various\ninputs into an instance of \\code{drive_id}.\n\n\\code{as_id()} is a generic function.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\nas_id(\"123abc\")\nas_id(\"https://docs.google.com/spreadsheets/d/qawsedrf16273849/edit#gid=12345\")\n\nx <- drive_find(n_max = 3)\nas_id(x)\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/drive_link.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_browse.R\n\\name{drive_link}\n\\alias{drive_link}\n\\title{Retrieve Drive file links}\n\\usage{\ndrive_link(file)\n}\n\\arguments{\n\\item{file}{Something that identifies the file(s) of interest on your Google\nDrive. Can be a character vector of names/paths, a character vector of file\nids or URLs marked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.}\n}\n\\value{\nCharacter vector of file hyperlinks.\n}\n\\description{\nReturns the \\code{\"webViewLink\"} for one or more files, which is the \"link for\nopening the file in a relevant Google editor or viewer in a browser\".\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# get a few files into a dribble\nthree_files <- drive_find(n_max = 3)\n\n# get their browser links\ndrive_link(three_files)\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/drive_ls.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_ls.R\n\\name{drive_ls}\n\\alias{drive_ls}\n\\title{List contents of a folder or shared drive}\n\\usage{\ndrive_ls(path = NULL, ..., recursive = FALSE)\n}\n\\arguments{\n\\item{path}{Specifies a single folder on Google Drive whose contents you want\nto list. Can be an actual path (character), a file id or URL marked with\n\\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}. If it is a shared drive or is a folder on a\nshared drive, it must be passed as a \\code{\\link{dribble}}. If \\code{path} is a shortcut\nto a folder, it is automatically resolved to its target folder.}\n\n\\item{...}{Any parameters that are valid for \\code{\\link[=drive_find]{drive_find()}}.}\n\n\\item{recursive}{Logical, indicating if you want only direct children of\n\\code{path} (\\code{recursive = FALSE}, the default) or all children, including\nindirect (\\code{recursive = TRUE}).}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nList the contents of a folder or shared drive, recursively or not. This is a\nthin wrapper around \\code{\\link[=drive_find]{drive_find()}}, that simply adds one constraint: the\nsearch is limited to direct or indirect children of \\code{path}.\n}\n\\examples{\n\\dontrun{\n# get contents of the folder 'abc' (non-recursive)\ndrive_ls(\"abc\")\n\n# get contents of folder 'abc' whose names contain the letters 'def'\ndrive_ls(path = \"abc\", pattern = \"def\")\n\n# get all Google spreadsheets in folder 'abc'\n# whose names contain the letters 'def'\ndrive_ls(path = \"abc\", pattern = \"def\", type = \"spreadsheet\")\n\n# get all the files below 'abc', recursively, that are starred\ndrive_ls(path = \"abc\", q = \"starred = true\", recursive = TRUE)\n}\n}\n"
  },
  {
    "path": "man/drive_mime_type.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_mime_type.R\n\\name{drive_mime_type}\n\\alias{drive_mime_type}\n\\title{Lookup MIME type}\n\\usage{\ndrive_mime_type(type = NULL)\n}\n\\arguments{\n\\item{type}{Character. Google Drive file type, file extension, or MIME type.\nPass the sentinel \\code{\\link[=expose]{expose()}} if you want to get the full table used for\nvalidation and lookup, i.e. all MIME types known to be relevant to the\nDrive API.}\n}\n\\value{\nCharacter. MIME type.\n}\n\\description{\nThis is a helper to determine which MIME type should be used\nfor a file. Three types of input are acceptable:\n\\itemize{\n\\item Native Google Drive file types. Important examples:\n\\itemize{\n\\item \"document\" for Google Docs\n\\item \"folder\" for folders\n\\item \"presentation\" for Google Slides\n\\item \"spreadsheet\" for Google Sheets\n}\n\\item File extensions, such as \"pdf\", \"csv\", etc.\n\\item MIME types accepted by Google Drive (these are simply passed through).\n}\n}\n\\examples{\n## get the mime type for Google Spreadsheets\ndrive_mime_type(\"spreadsheet\")\n\n## get the mime type for jpegs\ndrive_mime_type(\"jpeg\")\n\n## it's vectorized\ndrive_mime_type(c(\"presentation\", \"pdf\", \"image/gif\"))\n\n## see the internal tibble of MIME types known to the Drive API\ndrive_mime_type(expose())\n}\n"
  },
  {
    "path": "man/drive_mkdir.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_mkdir.R\n\\name{drive_mkdir}\n\\alias{drive_mkdir}\n\\title{Create a Drive folder}\n\\usage{\ndrive_mkdir(name, path = NULL, ..., overwrite = NA, verbose = deprecated())\n}\n\\arguments{\n\\item{name}{Name for the new folder or, optionally, a path that specifies\nan existing parent folder, as well as the new name.}\n\n\\item{path}{Target destination for the new folder, i.e. a folder or a\nshared drive. Can be given as an actual path (character), a file id or URL\nmarked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}. Defaults to your \"My Drive\" root\nfolder. If \\code{path} is a shortcut to a folder, it is automatically resolved\nto its target folder.}\n\n\\item{...}{Named parameters to pass along to the Drive API. Has \\link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by\nspecifying properties of the Files resource via \\code{...}. Read the \"Request\nbody\" section of the Drive API docs for the associated endpoint to learn\nabout relevant parameters.}\n\n\\item{overwrite}{Logical, indicating whether to check for a pre-existing file\nat the targetted \"filepath\". The quotes around \"filepath\" refer to the fact\nthat Drive does not impose a 1-to-1 relationship between filepaths and files,\nlike a typical file system; read more about that in \\code{\\link[=drive_get]{drive_get()}}.\n\\itemize{\n\\item \\code{NA} (default): Just do the operation, even if it results in multiple\nfiles with the same filepath.\n\\item \\code{TRUE}: Check for a pre-existing file at the filepath. If there is\nzero or one, move a pre-existing file to the trash, then carry on. Note\nthat the new file does not inherit any properties from the old one, such\nas sharing or publishing settings. It will have a new file ID. An error is\nthrown if two or more pre-existing files are found.\n\\item \\code{FALSE}: Error if there is any pre-existing file at the filepath.\n}\n\nNote that existence checks, based on filepath, are expensive operations, i.e.\nthey require additional API calls.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nCreates a new Drive folder. To update the metadata of an existing Drive file,\nincluding a folder, use \\code{\\link[=drive_update]{drive_update()}}.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Create folder named 'ghi', then another below named it 'jkl' and star it\nghi <- drive_mkdir(\"ghi\")\njkl <- drive_mkdir(\"ghi/jkl\", starred = TRUE)\n\n# is 'jkl' really starred? YES\npurrr::pluck(jkl, \"drive_resource\", 1, \"starred\")\n\n# Another way to create folder 'mno' in folder 'ghi'\ndrive_mkdir(\"mno\", path = \"ghi\")\n\n# Yet another way to create a folder named 'pqr' in folder 'ghi',\n# this time with parent folder stored in a dribble,\n# and setting the new folder's description\npqr <- drive_mkdir(\"pqr\", path = ghi, description = \"I am a folder\")\n\n# Did we really set the description? YES\npurrr::pluck(pqr, \"drive_resource\", 1, \"description\")\n\n# `overwrite = FALSE` errors if something already exists at target filepath\n# THIS WILL ERROR!\ndrive_create(\"name-squatter-mkdir\", path = ghi)\ndrive_mkdir(\"name-squatter-mkdir\", path = ghi, overwrite = FALSE)\n\n# `overwrite = TRUE` moves the existing item to trash, then proceeds\ndrive_mkdir(\"name-squatter-mkdir\", path = ghi, overwrite = TRUE)\n\n# list everything inside 'ghi'\ndrive_ls(\"ghi\")\n\n# Clean up\ndrive_rm(ghi)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{files.create} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/create}\n}\n}\n"
  },
  {
    "path": "man/drive_mv.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_mv.R\n\\name{drive_mv}\n\\alias{drive_mv}\n\\title{Move a Drive file}\n\\usage{\ndrive_mv(\n  file,\n  path = NULL,\n  name = NULL,\n  overwrite = NA,\n  verbose = deprecated()\n)\n}\n\\arguments{\n\\item{file}{Something that identifies the file of interest on your Google\nDrive. Can be a name or path, a file id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a\n\\code{\\link{dribble}}.}\n\n\\item{path}{Specifies target destination for the file on Google\nDrive. Can be an actual path (character), a file id marked with\n\\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.\n\nIf \\code{path} is a shortcut to a folder, it is automatically resolved to its\ntarget folder.\n\nIf \\code{path} is given as a path (as opposed to a \\code{dribble} or an id), it is\nbest to explicitly indicate if it's a folder by including a trailing\nslash, since it cannot always be worked out from the context of the call.\nBy default, the file stays in its current folder.}\n\n\\item{name}{Character, new file name if not specified as part of\n\\code{path}. This will force \\code{path} to be interpreted as a folder, even if it\nis character and lacks a trailing slash. By default, the file keeps its current name.}\n\n\\item{overwrite}{Logical, indicating whether to check for a pre-existing file\nat the targetted \"filepath\". The quotes around \"filepath\" refer to the fact\nthat Drive does not impose a 1-to-1 relationship between filepaths and files,\nlike a typical file system; read more about that in \\code{\\link[=drive_get]{drive_get()}}.\n\\itemize{\n\\item \\code{NA} (default): Just do the operation, even if it results in multiple\nfiles with the same filepath.\n\\item \\code{TRUE}: Check for a pre-existing file at the filepath. If there is\nzero or one, move a pre-existing file to the trash, then carry on. Note\nthat the new file does not inherit any properties from the old one, such\nas sharing or publishing settings. It will have a new file ID. An error is\nthrown if two or more pre-existing files are found.\n\\item \\code{FALSE}: Error if there is any pre-existing file at the filepath.\n}\n\nNote that existence checks, based on filepath, are expensive operations, i.e.\nthey require additional API calls.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nMove a Drive file to a different folder, give it a different name, or both.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# create a file to move\nfile <- drive_example_remote(\"chicken.txt\") |>\n  drive_cp(\"chicken-mv.txt\")\n\n# rename it, but leave in current folder (root folder, in this case)\nfile <- drive_mv(file, \"chicken-mv-renamed.txt\")\n\n# create a folder to move the file into\nfolder <- drive_mkdir(\"mv-folder\")\n\n# move the file and rename it again,\n# specify destination as a dribble\nfile <- drive_mv(file, path = folder, name = \"chicken-mv-re-renamed.txt\")\n\n# verify renamed file is now in the folder\ndrive_ls(folder)\n\n# move the file back to root folder\nfile <- drive_mv(file, \"~/\")\n\n# move it again\n# specify destination as path with trailing slash\n# to ensure we get a move vs. renaming it to \"mv-folder\"\nfile <- drive_mv(file, \"mv-folder/\")\n\n# `overwrite = FALSE` errors if something already exists at target filepath\n# THIS WILL ERROR!\ndrive_create(\"name-squatter-mv\", path = \"~/\")\ndrive_mv(file, path = \"~/\", name = \"name-squatter-mv\", overwrite = FALSE)\n\n# `overwrite = TRUE` moves the existing item to trash, then proceeds\ndrive_mv(file, path = \"~/\", name = \"name-squatter-mv\", overwrite = TRUE)\n\n# Clean up\ndrive_rm(file, folder)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nMakes a metadata-only request to the \\code{files.update} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/update}\n}\n}\n"
  },
  {
    "path": "man/drive_publish.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_publish.R\n\\name{drive_publish}\n\\alias{drive_publish}\n\\alias{drive_unpublish}\n\\title{Publish native Google files}\n\\usage{\ndrive_publish(file, ..., verbose = deprecated())\n\ndrive_unpublish(file, ..., verbose = deprecated())\n}\n\\arguments{\n\\item{file}{Something that identifies the file(s) of interest on your Google\nDrive. Can be a character vector of names/paths, a character vector of file\nids or URLs marked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.}\n\n\\item{...}{Name-value pairs to add to the API request body (see API docs\nlinked below for details). For \\code{drive_publish()}, we include\n\\code{publishAuto = TRUE} and \\code{publishedOutsideDomain = TRUE}, if user does not\nspecify other values.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\nThere will be extra columns, \\code{published} and\n\\code{revisions_resource}.\n}\n\\description{\nPublish (or un-publish) native Google files to the web. Native Google files\ninclude Google Docs, Google Sheets, and Google Slides. The returned\n\\code{\\link{dribble}} will have extra columns, \\code{published} and \\code{revisions_resource}.\nRead more in \\code{\\link[=drive_reveal]{drive_reveal()}}.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Create a file to publish\nfile <- drive_example_remote(\"chicken_sheet\") |>\n  drive_cp()\n\n# Publish file\nfile <- drive_publish(file)\nfile$published\n\n# Unpublish file\nfile <- drive_unpublish(file)\nfile$published\n\n# Clean up\ndrive_rm(file)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{revisions.update} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/revisions/update}\n}\n}\n"
  },
  {
    "path": "man/drive_put.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_put.R\n\\name{drive_put}\n\\alias{drive_put}\n\\title{PUT new media into a Drive file}\n\\usage{\ndrive_put(\n  media,\n  path = NULL,\n  name = NULL,\n  ...,\n  type = NULL,\n  verbose = deprecated()\n)\n}\n\\arguments{\n\\item{media}{Character, path to the local file to upload.}\n\n\\item{path}{Specifies target destination for the new file on Google\nDrive. Can be an actual path (character), a file id marked with\n\\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.\n\nIf \\code{path} is a shortcut to a folder, it is automatically resolved to its\ntarget folder.\n\nIf \\code{path} is given as a path (as opposed to a \\code{dribble} or an id), it is\nbest to explicitly indicate if it's a folder by including a trailing\nslash, since it cannot always be worked out from the context of the call.\nBy default, the file is created in the current\nuser's \"My Drive\" root folder.}\n\n\\item{name}{Character, new file name if not specified as part of\n\\code{path}. This will force \\code{path} to be interpreted as a folder, even if it\nis character and lacks a trailing slash. Defaults to the file's local name.}\n\n\\item{...}{Named parameters to pass along to the Drive API. Has \\link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by\nspecifying properties of the Files resource via \\code{...}. Read the \"Request\nbody\" section of the Drive API docs for the associated endpoint to learn\nabout relevant parameters.}\n\n\\item{type}{Character. If \\code{type = NULL}, a MIME type is automatically\ndetermined from the file extension, if possible. If the source file is of a\nsuitable type, you can request conversion to Google Doc, Sheet or Slides by\nsetting \\code{type} to \\code{document}, \\code{spreadsheet}, or \\code{presentation},\nrespectively. All non-\\code{NULL} values for \\code{type} are pre-processed with\n\\code{\\link[=drive_mime_type]{drive_mime_type()}}.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nPUTs new media into a Drive file, in the HTTP sense:\n\\itemize{\n\\item If the file already exists, we replace its content.\n\\item If the file does not already exist, we create a new file.\n}\n\nThis is a convenience wrapper around \\code{\\link[=drive_upload]{drive_upload()}} and\n\\code{\\link[=drive_update]{drive_update()}}. In pseudo-code:\n\n\\if{html}{\\out{<div class=\"sourceCode\">}}\\preformatted{target_filepath <- <determined from `path`, `name`, and `media`>\nhits <- <get all Drive files at target_filepath>\nif (no hits) \\{\n  drive_upload(media, path, name, type, ...)\n\\} else if (exactly 1 hit) \\{\n  drive_update(hit, media, ...)\n\\} else \\{\n  ERROR\n\\}\n}\\if{html}{\\out{</div>}}\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# create a local file to work with\nlocal_file <- tempfile(\"drive_put_\", fileext = \".txt\")\nwriteLines(c(\"beginning\", \"middle\"), local_file)\n\n# PUT to a novel filepath --> drive_put() delegates to drive_upload()\nfile <- drive_put(local_file)\n\n# update the local file\ncat(\"end\", file = local_file, sep = \"\\n\", append = TRUE)\n\n# PUT again --> drive_put() delegates to drive_update()\nfile <- drive_put(local_file)\n\n# create a second file at this filepath\nfile2 <- drive_create(basename(local_file))\n\n# PUT again --> ERROR\ndrive_put(local_file)\n\n# Clean up\ndrive_find(\"drive_put_.+[.]txt\") |> drive_rm()\nunlink(local_file)\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/drive_read_string.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_read.R\n\\name{drive_read_string}\n\\alias{drive_read_string}\n\\alias{drive_read_raw}\n\\title{Read the content of a Drive file}\n\\usage{\ndrive_read_string(file, type = NULL, encoding = NULL)\n\ndrive_read_raw(file, type = NULL)\n}\n\\arguments{\n\\item{file}{Something that identifies the file of interest on your Google\nDrive. Can be a name or path, a file id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a\n\\code{\\link{dribble}}.}\n\n\\item{type}{Character. Only consulted if \\code{file} is a native Google file.\nSpecifies the desired type of the exported file. Will be processed via\n\\code{\\link[=drive_mime_type]{drive_mime_type()}}, so either a file extension like \\code{\"pdf\"} or a full MIME\ntype like \\code{\"application/pdf\"} is acceptable.}\n\n\\item{encoding}{Passed along to \\code{\\link[httr:content]{httr::content()}}. Describes the encoding of\nthe \\emph{input} \\code{file}.}\n}\n\\value{\n\\itemize{\n\\item \\code{read_drive_string()}: a UTF-8 encoded string\n\\item \\code{read_drive_raw()}: a \\code{\\link[=raw]{raw()}} vector\n}\n}\n\\description{\nThese functions return the content of a Drive file as either a\nstring or raw bytes. You will likely need to do additional work to parse\nthe content into a useful R object.\n\n\\code{\\link[=drive_download]{drive_download()}} is the more generally useful function, but for certain\nfile types, such as comma-separated values (MIME type \\code{text/csv}), it can\nbe handy to read data directly from Google Drive and avoid writing to disk.\n\nJust as for \\code{\\link[=drive_download]{drive_download()}}, native Google file types, such as Google\nSheets or Docs, must be exported as a conventional MIME type. See the help\nfor \\code{\\link[=drive_download]{drive_download()}} for more.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# comma-separated values --> data.frame or tibble\n(chicken_csv <- drive_example_remote(\"chicken.csv\"))\nread.csv(text = chicken_csv |> drive_read_string())\n\n# Google Doc --> character vector\n(chicken_doc <- drive_example_remote(\"chicken_doc\"))\nchicken_doc |>\n  # NOTE: we must specify an export MIME type\n  drive_read_string(type = \"text/plain\") |>\n  strsplit(split = \"(\\r\\n|\\r|\\n)\")\n  (\\(x) x[[1]])()\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/drive_rename.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_rename.R\n\\name{drive_rename}\n\\alias{drive_rename}\n\\title{Rename a Drive file}\n\\usage{\ndrive_rename(file, name = NULL, overwrite = NA, verbose = deprecated())\n}\n\\arguments{\n\\item{file}{Something that identifies the file of interest on your Google\nDrive. Can be a name or path, a file id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a\n\\code{\\link{dribble}}.}\n\n\\item{name}{Character. Name you would like the file to have.}\n\n\\item{overwrite}{Logical, indicating whether to check for a pre-existing file\nat the targetted \"filepath\". The quotes around \"filepath\" refer to the fact\nthat Drive does not impose a 1-to-1 relationship between filepaths and files,\nlike a typical file system; read more about that in \\code{\\link[=drive_get]{drive_get()}}.\n\\itemize{\n\\item \\code{NA} (default): Just do the operation, even if it results in multiple\nfiles with the same filepath.\n\\item \\code{TRUE}: Check for a pre-existing file at the filepath. If there is\nzero or one, move a pre-existing file to the trash, then carry on. Note\nthat the new file does not inherit any properties from the old one, such\nas sharing or publishing settings. It will have a new file ID. An error is\nthrown if two or more pre-existing files are found.\n\\item \\code{FALSE}: Error if there is any pre-existing file at the filepath.\n}\n\nNote that existence checks, based on filepath, are expensive operations, i.e.\nthey require additional API calls.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nThis is a wrapper for \\code{\\link[=drive_mv]{drive_mv()}} that only renames a file.\nIf you would like to rename AND move the file, see \\code{\\link[=drive_mv]{drive_mv()}}.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Create a file to rename\nfile <- drive_create(\"file-to-rename\")\n\n# Rename it\nfile <- drive_rename(file, name = \"renamed-file\")\n\n# `overwrite = FALSE` errors if something already exists at target filepath\n# THIS WILL ERROR!\ndrive_create(\"name-squatter-rename\")\ndrive_rename(file, name = \"name-squatter-rename\", overwrite = FALSE)\n\n# `overwrite = TRUE` moves the existing item to trash, then proceeds\nfile <- drive_rename(file, name = \"name-squatter-rename\", overwrite = TRUE)\n\n# Clean up\ndrive_rm(file)\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/drive_reveal.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_reveal.R\n\\name{drive_reveal}\n\\alias{drive_reveal}\n\\title{Add a new column of Drive file information}\n\\usage{\ndrive_reveal(file, what = c(\"path\", \"permissions\", \"published\", \"parent\"))\n}\n\\arguments{\n\\item{file}{Something that identifies the file(s) of interest on your Google\nDrive. Can be a character vector of names/paths, a character vector of file\nids or URLs marked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.}\n\n\\item{what}{Character, describing the type of info you want to add. These\nvalues get special handling (more details below):\n\\itemize{\n\\item \\code{path}\n\\item \\code{permissions}\n\\item \\code{published}\n\\item \\code{parent}\n}\n\nYou can also request any property in the \\code{drive_resource} column by name.\nThe request can be in \\code{camelCase} or \\code{snake_case}, but the new column name\nwill always be \\code{snake_case}. Some examples of \\code{what}:\n\\itemize{\n\\item \\code{mime_type} (or \\code{mimeType})\n\\item \\code{trashed}\n\\item \\code{starred}\n\\item \\code{description}\n\\item \\code{version}\n\\item \\code{web_view_link} (or \\code{webViewLink})\n\\item \\code{modified_time} (or \\code{modifiedTime})\n\\item \\code{created_time} (or \\code{createdTime})\n\\item \\code{owned_by_me} (or \\code{ownedByMe})\n\\item \\code{size}\n\\item \\code{quota_bytes_used} (or \\code{quotaBytesUsed})\n}}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\nThe additional info requested via \\code{what}\nappears in one (or more) extra columns.\n}\n\\description{\n\\code{drive_reveal()} adds extra information about your Drive files that is not\nreadily available in the default \\code{\\link{dribble}} produced by googledrive. Why is\nthis info not always included in the default \\code{dribble}?\n\\itemize{\n\\item You don't always care about it. There is a lot of esoteric information in\nthe \\code{drive_resource} that has little value for most users.\n\\item It might be \"expensive\" to get this information and put it into a usable\nform. For example, revealing a file's \\code{\"path\"}, \\code{\"permissions\"}, or\n\\code{\"published\"} status all require additional API calls.\n}\n\n\\code{drive_reveal()} can also \\strong{hoist} any property out of the \\code{drive_resource}\nlist-column, when the property's name is passed as the \\code{what} argument. The\nresulting new column is simplified if it is easy to do so, e.g., if the\nindividual elements are all string or logical. If \\code{what} extracts a\ndate-time, we return \\code{\\link[=DateTimeClasses]{POSIXct}}. Otherwise, you'll get a\nlist-column. If this makes you sad, consider using \\code{tidyr::hoist()} instead.\nIt is more powerful due to a richer \"plucking specification\" and its \\code{ptype}\nand \\code{transform} arguments. Another useful function is\n\\code{tidyr::unnest_wider()}.\n}\n\\section{File path}{\n\nWhen \\code{what = \"path\"} the \\code{\\link{dribble}} gains a character column holding each\nfile's path. This can be \\emph{very slow}, so use with caution.\n\nThe example path \\verb{~/a/b/} illustrates two conventions used in googledrive:\n\\itemize{\n\\item The leading \\verb{~/} means that the folder \\code{a} is located in the current\nuser's \"My Drive\" root folder.\n\\item The trailing \\code{/} means that \\code{b}, located in \\code{a}, is \\emph{a folder or a folder\nshortcut}.\n}\n}\n\n\\section{Permissions}{\n\nWhen \\code{what = \"permissions\"} the \\code{\\link{dribble}} gains a logical column \\code{shared}\nthat indicates whether a file is shared and a new list-column\n\\code{permissions_resource} containing lists of\n\\href{https://developers.google.com/drive/api/v3/reference/permissions}{Permissions resources}.\n}\n\n\\section{Publishing}{\n\nWhen \\code{what = \"published\"} the \\code{\\link{dribble}} gains a logical column\n\\code{published} that indicates whether a file is published and a new list-column\n\\code{revision_resource} containing lists of\n\\href{https://developers.google.com/drive/api/v3/reference/revisions}{Revisions resources}.\n}\n\n\\section{Parent}{\n\nWhen \\code{what = \"parent\"} the \\code{\\link{dribble}} gains a character column \\code{id_parent}\nthat is the file id of this item's parent folder. This information is\navailable in the \\code{drive_resource}, but can't just be hoisted out:\n\\itemize{\n\\item Google Drive used to allow files to have multiple parents, but this is no\nlonger supported and googledrive now assumes this is impossible. However,\nwe have seen (very old) files that still have >1 parent folder. If we see\nthis we message about it and drop all but the first parent.\n\\item The \\code{parents} property in \\code{drive_resource} has an \"extra\" layer of nesting\nand needs to be flattened.\n}\n\nIf you really want the raw \\code{parents} property, call \\code{drive_reveal(what = \"parents\")}.\n}\n\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Get a few of your files\nfiles <- drive_find(n_max = 10, trashed = NA)\n\n# the \"special\" cases that require additional API calls and can be slow\ndrive_reveal(files, \"path\")\ndrive_reveal(files, \"permissions\")\ndrive_reveal(files, \"published\")\n\n# a \"special\" case of digging info out of `drive_resource`, then processing\n# a bit\ndrive_reveal(files, \"parent\")\n\n# the \"simple\" cases of digging info out of `drive_resource`\ndrive_reveal(files, \"trashed\")\ndrive_reveal(files, \"mime_type\")\ndrive_reveal(files, \"starred\")\ndrive_reveal(files, \"description\")\ndrive_reveal(files, \"version\")\ndrive_reveal(files, \"web_view_link\")\ndrive_reveal(files, \"modified_time\")\ndrive_reveal(files, \"created_time\")\ndrive_reveal(files, \"owned_by_me\")\ndrive_reveal(files, \"size\")\ndrive_reveal(files, \"quota_bytes_used\")\n\n# 'root' is a special file id that represents your My Drive root folder\ndrive_get(id = \"root\") |>\n  drive_reveal(\"path\")\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nTo learn more about the properties present in the metadata of a\nDrive file (which is what's in the \\code{drive_resource} list-column of a\n\\code{\\link{dribble}}), see the API docs:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files#resource-representations}\n}\n}\n"
  },
  {
    "path": "man/drive_rm.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_rm.R\n\\name{drive_rm}\n\\alias{drive_rm}\n\\title{Delete files from Drive}\n\\usage{\ndrive_rm(..., verbose = deprecated())\n}\n\\arguments{\n\\item{...}{One or more Drive files, specified in any valid way, i.e. as a\n\\code{\\link{dribble}}, by name or path, or by file id or URL marked with \\code{\\link[=as_id]{as_id()}}. Or\nany combination thereof. Elements are processed with \\code{\\link[=as_dribble]{as_dribble()}} and\nrow-bound prior to deletion.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nLogical vector, indicating whether the delete succeeded.\n}\n\\description{\nCaution: this will permanently delete your files! For a safer, reversible\noption, see \\code{\\link[=drive_trash]{drive_trash()}}.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Target one of the official example files to copy (then remove)\n(src_file <- drive_example_remote(\"chicken.txt\"))\n\n# Create a copy, then remove it by name\nsrc_file |>\n  drive_cp(name = \"chicken-rm.txt\")\ndrive_rm(\"chicken-rm.txt\")\n\n# Create several more copies\nx1 <- src_file |>\n  drive_cp(name = \"chicken-abc.txt\")\ndrive_cp(src_file, name = \"chicken-def.txt\")\nx2 <- src_file |>\n  drive_cp(name = \"chicken-ghi.txt\")\n\n# Remove the copies all at once, specified in different ways\ndrive_rm(x1, \"chicken-def.txt\", as_id(x2))\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{files.delete} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/delete}\n}\n}\n"
  },
  {
    "path": "man/drive_scopes.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_auth.R\n\\name{drive_scopes}\n\\alias{drive_scopes}\n\\title{Produce scopes specific to the Drive API}\n\\usage{\ndrive_scopes(scopes = NULL)\n}\n\\arguments{\n\\item{scopes}{One or more API scopes. Each scope can be specified in full or,\nfor Drive API-specific scopes, in an abbreviated form that is recognized by\n\\code{\\link[=drive_scopes]{drive_scopes()}}:\n\\itemize{\n\\item \"drive\" = \"https://www.googleapis.com/auth/drive\" (the default)\n\\item \"full\" = \"https://www.googleapis.com/auth/drive\" (same as \"drive\")\n\\item \"drive.readonly\" = \"https://www.googleapis.com/auth/drive.readonly\"\n\\item \"drive.file\" = \"https://www.googleapis.com/auth/drive.file\"\n\\item \"drive.appdata\" = \"https://www.googleapis.com/auth/drive.appdata\"\n\\item \"drive.metadata\" = \"https://www.googleapis.com/auth/drive.metadata\"\n\\item \"drive.metadata.readonly\" = \"https://www.googleapis.com/auth/drive.metadata.readonly\"\n\\item \"drive.photos.readonly\" = \"https://www.googleapis.com/auth/drive.photos.readonly\"\n\\item \"drive.scripts\" = \"https://www.googleapis.com/auth/drive.scripts\n}\n\nSee \\url{https://developers.google.com/drive/api/guides/api-specific-auth} for\ndetails on the permissions for each scope.}\n}\n\\value{\nA character vector of scopes.\n}\n\\description{\nWhen called with no arguments, \\code{drive_scopes()} returns a named character vector\nof scopes associated with the Drive API. If \\code{drive_scopes(scopes =)} is given,\nan abbreviated entry such as \\code{\"drive.readonly\"} is expanded to a full scope\n(\\code{\"https://www.googleapis.com/auth/drive.readonly\"} in this case).\nUnrecognized scopes are passed through unchanged.\n}\n\\examples{\ndrive_scopes(\"full\")\ndrive_scopes(\"drive.readonly\")\ndrive_scopes()\n}\n\\seealso{\n\\url{https://developers.google.com/drive/api/guides/api-specific-auth} for details on\nthe permissions for each scope.\n\nOther auth functions: \n\\code{\\link{drive_auth}()},\n\\code{\\link{drive_auth_configure}()},\n\\code{\\link{drive_deauth}()}\n}\n\\concept{auth functions}\n"
  },
  {
    "path": "man/drive_share.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_share.R\n\\name{drive_share}\n\\alias{drive_share}\n\\alias{drive_share_anyone}\n\\title{Share Drive files}\n\\usage{\ndrive_share(\n  file,\n  role = c(\"reader\", \"commenter\", \"writer\", \"fileOrganizer\", \"owner\", \"organizer\"),\n  type = c(\"user\", \"group\", \"domain\", \"anyone\"),\n  ...,\n  verbose = deprecated()\n)\n\ndrive_share_anyone(file, verbose = deprecated())\n}\n\\arguments{\n\\item{file}{Something that identifies the file(s) of interest on your Google\nDrive. Can be a character vector of names/paths, a character vector of file\nids or URLs marked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.}\n\n\\item{role}{Character. The role to grant. Must be one of:\n\\itemize{\n\\item owner (not allowed in shared drives)\n\\item organizer (applies to shared drives)\n\\item fileOrganizer (applies to shared drives)\n\\item writer\n\\item commenter\n\\item reader\n}}\n\n\\item{type}{Character. Describes the grantee. Must be one of:\n\\itemize{\n\\item user\n\\item group\n\\item domain\n\\item anyone\n}}\n\n\\item{...}{Name-value pairs to add to the API request. This is where you\nprovide additional information, such as the \\code{emailAddress} (when grantee\n\\code{type} is \\code{\"group\"} or \\code{\"user\"}) or the \\code{domain} (when grantee type is\n\\code{\"domain\"}). Read the API docs linked below for more details.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\nThere will be extra columns, \\code{shared} and\n\\code{permissions_resource}.\n}\n\\description{\nGrant individuals or other groups access to files, including permission to\nread, comment, or edit. The returned \\code{\\link{dribble}} will have extra columns,\n\\code{shared} and \\code{permissions_resource}. Read more in \\code{\\link[=drive_reveal]{drive_reveal()}}.\n\n\\code{drive_share_anyone()} is a convenience wrapper for a common special case:\n\"make this \\code{file} readable by 'anyone with a link'\".\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Create a file to share\nfile <- drive_example_remote(\"chicken_doc\") |>\n  drive_cp(name = \"chicken-share.txt\")\n\n# Let a specific person comment\nfile <- file |>\n  drive_share(\n    role = \"commenter\",\n    type = \"user\",\n    emailAddress = \"susan@example.com\"\n  )\n\n# Let a different specific person edit and customize the email notification\nfile <- file |>\n  drive_share(\n    role = \"writer\",\n    type = \"user\",\n    emailAddress = \"carol@example.com\",\n    emailMessage = \"Would appreciate your feedback on this!\"\n  )\n\n# Let anyone read the file\nfile <- file |>\n  drive_share(role = \"reader\", type = \"anyone\")\n# Single-purpose wrapper function for this\ndrive_share_anyone(file)\n\n# Clean up\ndrive_rm(file)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{permissions.create} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/permissions/create}\n}\n\nDrive roles and permissions are described here:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/ref-roles}\n}\n}\n"
  },
  {
    "path": "man/drive_token.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_auth.R\n\\name{drive_token}\n\\alias{drive_token}\n\\title{Produce configured token}\n\\usage{\ndrive_token()\n}\n\\value{\nA \\code{request} object (an S3 class provided by \\link[httr:httr-package]{httr}).\n}\n\\description{\nFor internal use or for those programming around the Drive API.\nReturns a token pre-processed with \\code{\\link[httr:config]{httr::config()}}. Most users\ndo not need to handle tokens \"by hand\" or, even if they need some\ncontrol, \\code{\\link[=drive_auth]{drive_auth()}} is what they need. If there is no current\ntoken, \\code{\\link[=drive_auth]{drive_auth()}} is called to either load from cache or\ninitiate OAuth2.0 flow.\nIf auth has been deactivated via \\code{\\link[=drive_deauth]{drive_deauth()}}, \\code{drive_token()}\nreturns \\code{NULL}.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\nreq <- request_generate(\n  \"drive.files.get\",\n  list(fileId = \"abc\"),\n  token = drive_token()\n)\nreq\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nOther low-level API functions: \n\\code{\\link{drive_has_token}()},\n\\code{\\link{request_generate}()},\n\\code{\\link{request_make}()}\n}\n\\concept{low-level API functions}\n"
  },
  {
    "path": "man/drive_trash.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_trash.R\n\\name{drive_trash}\n\\alias{drive_trash}\n\\alias{drive_untrash}\n\\title{Move Drive files to or from trash}\n\\usage{\ndrive_trash(file, verbose = deprecated())\n\ndrive_untrash(file, verbose = deprecated())\n}\n\\arguments{\n\\item{file}{Something that identifies the file(s) of interest on your Google\nDrive. Can be a character vector of names/paths, a character vector of file\nids or URLs marked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nMove Drive files to or from trash\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Create a file and put it in the trash.\nfile <- drive_example_remote(\"chicken.txt\") |>\n  drive_cp(\"chicken-trash.txt\")\ndrive_trash(\"chicken-trash.txt\")\n\n# Confirm it's in the trash\ndrive_find(trashed = TRUE)\n\n# Remove it from the trash and confirm\ndrive_untrash(\"chicken-trash.txt\")\ndrive_find(trashed = TRUE)\n\n# Clean up\ndrive_rm(\"chicken-trash.txt\")\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/drive_update.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_update.R\n\\name{drive_update}\n\\alias{drive_update}\n\\title{Update an existing Drive file}\n\\usage{\ndrive_update(file, media = NULL, ..., verbose = deprecated())\n}\n\\arguments{\n\\item{file}{Something that identifies the file of interest on your Google\nDrive. Can be a name or path, a file id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a\n\\code{\\link{dribble}}.}\n\n\\item{media}{Character, path to the local file to upload.}\n\n\\item{...}{Named parameters to pass along to the Drive API. Has \\link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by\nspecifying properties of the Files resource via \\code{...}. Read the \"Request\nbody\" section of the Drive API docs for the associated endpoint to learn\nabout relevant parameters.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nUpdate an existing Drive file id with new content (\"media\" in Drive\nAPI-speak), new metadata, or both.  To create a new file or update existing,\ndepending on whether the Drive file already exists, see \\code{\\link[=drive_put]{drive_put()}}.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Create a new file, so we can update it\nx <- drive_example_remote(\"chicken.csv\") |>\n  drive_cp()\n\n# Update the file with new media\nx <- x |>\n  drive_update(drive_example_local(\"chicken.txt\"))\n\n# Update the file with new metadata.\n# Notice here `name` is not an argument of `drive_update()`, we are passing\n# this to the API via the `...``\nx <- x |>\n  drive_update(name = \"CHICKENS!\")\n\n# Update the file with new media AND new metadata\nx <- x |>\n  drive_update(\n    drive_example_local(\"chicken.txt\"),\n    name = \"chicken-poem-again.txt\"\n  )\n\n# Clean up\ndrive_rm(x)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{files.update} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/update}\n}\n\nThis function supports media upload:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/manage-uploads}\n}\n}\n"
  },
  {
    "path": "man/drive_upload.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_upload.R\n\\name{drive_upload}\n\\alias{drive_upload}\n\\title{Upload into a new Drive file}\n\\usage{\ndrive_upload(\n  media,\n  path = NULL,\n  name = NULL,\n  type = NULL,\n  ...,\n  overwrite = NA,\n  verbose = deprecated()\n)\n}\n\\arguments{\n\\item{media}{Character, path to the local file to upload.}\n\n\\item{path}{Specifies target destination for the new file on Google\nDrive. Can be an actual path (character), a file id marked with\n\\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.\n\nIf \\code{path} is a shortcut to a folder, it is automatically resolved to its\ntarget folder.\n\nIf \\code{path} is given as a path (as opposed to a \\code{dribble} or an id), it is\nbest to explicitly indicate if it's a folder by including a trailing\nslash, since it cannot always be worked out from the context of the call.\nBy default, the file is created in the current\nuser's \"My Drive\" root folder.}\n\n\\item{name}{Character, new file name if not specified as part of\n\\code{path}. This will force \\code{path} to be interpreted as a folder, even if it\nis character and lacks a trailing slash. Defaults to the file's local name.}\n\n\\item{type}{Character. If \\code{type = NULL}, a MIME type is automatically\ndetermined from the file extension, if possible. If the source file is of a\nsuitable type, you can request conversion to Google Doc, Sheet or Slides by\nsetting \\code{type} to \\code{document}, \\code{spreadsheet}, or \\code{presentation},\nrespectively. All non-\\code{NULL} values for \\code{type} are pre-processed with\n\\code{\\link[=drive_mime_type]{drive_mime_type()}}.}\n\n\\item{...}{Named parameters to pass along to the Drive API. Has \\link[rlang:dyn-dots]{dynamic dots} semantics. You can affect the metadata of the target file by\nspecifying properties of the Files resource via \\code{...}. Read the \"Request\nbody\" section of the Drive API docs for the associated endpoint to learn\nabout relevant parameters.}\n\n\\item{overwrite}{Logical, indicating whether to check for a pre-existing file\nat the targetted \"filepath\". The quotes around \"filepath\" refer to the fact\nthat Drive does not impose a 1-to-1 relationship between filepaths and files,\nlike a typical file system; read more about that in \\code{\\link[=drive_get]{drive_get()}}.\n\\itemize{\n\\item \\code{NA} (default): Just do the operation, even if it results in multiple\nfiles with the same filepath.\n\\item \\code{TRUE}: Check for a pre-existing file at the filepath. If there is\nzero or one, move a pre-existing file to the trash, then carry on. Note\nthat the new file does not inherit any properties from the old one, such\nas sharing or publishing settings. It will have a new file ID. An error is\nthrown if two or more pre-existing files are found.\n\\item \\code{FALSE}: Error if there is any pre-existing file at the filepath.\n}\n\nNote that existence checks, based on filepath, are expensive operations, i.e.\nthey require additional API calls.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nUploads a local file into a new Drive file. To update the content or metadata\nof an existing Drive file, use \\code{\\link[=drive_update]{drive_update()}}. To upload or update,\ndepending on whether the Drive file already exists, see \\code{\\link[=drive_put]{drive_put()}}.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# upload a csv file\nchicken_csv <- drive_example_local(\"chicken.csv\") |>\n  drive_upload(\"chicken-upload.csv\")\n\n# or convert it to a Google Sheet\nchicken_sheet <- drive_example_local(\"chicken.csv\") |>\n  drive_upload(\n    name = \"chicken-sheet-upload.csv\",\n    type = \"spreadsheet\"\n  )\n\n# check out the new Sheet!\ndrive_browse(chicken_sheet)\n\n# Clean up\ndrive_find(\"chicken.*upload\") |> drive_rm()\n\n# Upload a file and, at the same time, star it\nchicken <- drive_example_local(\"chicken.jpg\") |>\n  drive_upload(starred = \"true\")\n\n# Is is really starred? YES\npurrr::pluck(chicken, \"drive_resource\", 1, \"starred\")\n\n# Clean up\ndrive_rm(chicken)\n\n# `overwrite = FALSE` errors if something already exists at target filepath\n# THIS WILL ERROR!\ndrive_create(\"name-squatter-upload\")\ndrive_example_local(\"chicken.jpg\") |>\n  drive_upload(\n    name = \"name-squatter-upload\",\n    overwrite = FALSE\n  )\n\n# `overwrite = TRUE` moves the existing item to trash, then proceeds\nchicken <- drive_example_local(\"chicken.jpg\") |>\n  drive_upload(\n    name = \"name-squatter-upload\",\n    overwrite = TRUE\n  )\n\n# Clean up\ndrive_rm(chicken)\n\n\\dontrun{\n# Upload to a shared drive:\n#   * Shared drives are only available if your account is associated with a\n#     Google Workspace\n#   * The shared drive (or shared-drive-hosted folder) MUST be captured as a\n#     dribble first and provided via `path`\nsd <- shared_drive_get(\"Marketing\")\ndrive_upload(\"fascinating.csv\", path = sd)\n}\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{files.create} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/files/create}\n}\n\nMIME types that can be converted to native Google formats:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/manage-uploads#import_to_google_docs_types}\n}\n}\n"
  },
  {
    "path": "man/drive_user.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/drive_user.R\n\\name{drive_user}\n\\alias{drive_user}\n\\title{Get info on current user}\n\\usage{\ndrive_user(verbose = deprecated())\n}\n\\arguments{\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\nA list of class \\code{drive_user}.\n}\n\\description{\nReveals information about the user associated with the current token. This is\na thin wrapper around \\code{\\link[=drive_about]{drive_about()}} that just extracts the most useful\ninformation (the information on current user) and prints it nicely.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\ndrive_user()\n\n# more info is returned than is printed\nuser <- drive_user()\nstr(user)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\nWraps the \\code{about.get} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/about/get}\n}\n}\n"
  },
  {
    "path": "man/expose.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/utils.R\n\\name{expose}\n\\alias{expose}\n\\title{An expose object}\n\\usage{\nexpose()\n}\n\\description{\n\\code{expose()} returns a sentinel object, similar in spirit to \\code{NULL}, that tells\nthe calling function to return its internal data structure. googledrive\nstores a lot of information about the Drive API, MIME types, etc., internally\nand then exploits it in helper functions, like \\code{\\link[=drive_mime_type]{drive_mime_type()}},\n\\code{\\link[=drive_fields]{drive_fields()}}, \\code{\\link[=drive_endpoints]{drive_endpoints()}}, etc. We use these objects to\nprovide nice defaults, check input validity, or lookup something cryptic,\nlike MIME type, based on something friendlier, like a file extension. Pass\n\\code{expose()} to such a function if you want to inspect its internal object, in\nits full glory. This is inspired by the \\code{waiver()} object in ggplot2.\n}\n\\examples{\ndrive_mime_type(expose())\ndrive_fields(expose())\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/googledrive-configuration.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/googledrive-package.R, R/utils-ui.R\n\\name{googledrive-configuration}\n\\alias{googledrive-configuration}\n\\alias{local_drive_quiet}\n\\alias{with_drive_quiet}\n\\title{googledrive configuration}\n\\usage{\nlocal_drive_quiet(env = parent.frame())\n\nwith_drive_quiet(code)\n}\n\\arguments{\n\\item{env}{The environment to use for scoping}\n\n\\item{code}{Code to execute quietly}\n}\n\\description{\nSome aspects of googledrive behaviour can be controlled via an option.\n}\n\\section{Auth}{\n\n\nRead about googledrive's main auth function, \\code{\\link[=drive_auth]{drive_auth()}}. It is powered\nby the gargle package, which consults several options:\n\\itemize{\n\\item Default Google user or, more precisely, \\code{email}: see\n\\code{\\link[gargle:gargle_options]{gargle::gargle_oauth_email()}}\n\\item Whether or where to cache OAuth tokens: see\n\\code{\\link[gargle:gargle_options]{gargle::gargle_oauth_cache()}}\n\\item Whether to prefer \"out-of-band\" auth: see\n\\code{\\link[gargle:gargle_options]{gargle::gargle_oob_default()}}\n\\item Application Default Credentials: see \\code{\\link[gargle:credentials_app_default]{gargle::credentials_app_default()}}\n}\n}\n\n\\section{Messages}{\n\n\nThe \\code{googledrive_quiet} option can be used to suppress messages from\ngoogledrive. By default, googledrive always messages, i.e. it is \\emph{not}\nquiet.\n\nSet \\code{googledrive_quiet} to \\code{TRUE} to suppress messages, by one of these\nmeans, in order of decreasing scope:\n\\itemize{\n\\item Put \\code{options(googledrive_quiet = TRUE)} in a start-up file, such as\n\\code{.Rprofile}, or at the top of your R script\n\\item Use \\code{local_drive_quiet()} to silence googledrive in a specific scope\n\n\\if{html}{\\out{<div class=\"sourceCode\">}}\\preformatted{foo <- function() \\{\n  ...\n  local_drive_quiet()\n  drive_this(...)\n  drive_that(...)\n  ...\n\\}\n}\\if{html}{\\out{</div>}}\n\\item Use \\code{with_drive_quiet()} to run a small bit of code silently\n\n\\if{html}{\\out{<div class=\"sourceCode\">}}\\preformatted{with_drive_quiet(\n  drive_something(...)\n)\n}\\if{html}{\\out{</div>}}\n}\n\n\\code{local_drive_quiet()} and \\code{with_drive_quiet()} follow the conventions of the\nthe withr package (\\url{https://withr.r-lib.org}).\n}\n\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# message: \"Created Drive file\"\n(x <- drive_create(\"drive-quiet-demo\", type = \"document\"))\n\n# message: \"File updated\"\nx <- drive_update(x, starred = TRUE)\ndrive_reveal(x, \"starred\")\n\n# suppress messages for a small amount of code\nwith_drive_quiet(\n  x <- drive_update(x, name = \"drive-quiet-works\")\n)\nx$name\n\n# message: \"File updated\"\nx <- drive_update(x, media = drive_example_local(\"chicken.txt\"))\n\n# suppress messages within a specific scope, e.g. function\nunstar <- function(y) {\n  local_drive_quiet()\n  drive_update(y, starred = FALSE)\n}\nx <- unstar(x)\ndrive_reveal(x, \"starred\")\n\n# Clean up\ndrive_rm(x)\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man/googledrive-deprecated.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/deprecated.R\n\\name{googledrive-deprecated}\n\\alias{googledrive-deprecated}\n\\alias{drive_auth_config}\n\\alias{drive_oauth_app}\n\\alias{drive_example}\n\\title{Deprecated googledrive functions}\n\\usage{\ndrive_auth_config(active, app, path, api_key)\n\ndrive_oauth_app()\n\ndrive_example(path = NULL)\n}\n\\arguments{\n\\item{app}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} Replaced by the \\code{client}\nargument.}\n\n\\item{path}{JSON downloaded from \\href{https://console.cloud.google.com}{Google Cloud Console}, containing a client id and\nsecret, in one of the forms supported for the \\code{txt} argument of\n\\code{\\link[jsonlite:fromJSON]{jsonlite::fromJSON()}} (typically, a file path or JSON string).}\n\n\\item{api_key}{API key.}\n}\n\\description{\n\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}}\n}\n\\section{\\code{drive_auth_config()}}{\n\n\nThis function is defunct.\n\\itemize{\n\\item Use \\code{\\link[=drive_auth_configure]{drive_auth_configure()}} to configure your own OAuth client or API key.\n\\item Use \\code{\\link[=drive_deauth]{drive_deauth()}} to go into a de-authorized state.\n\\item Use \\code{\\link[=drive_oauth_client]{drive_oauth_client()}} to retrieve a user-configured client, if it\nexists.\n\\item Use \\code{\\link[=drive_api_key]{drive_api_key()}} to retrieve a user-configured API key, if it exists.\n}\n}\n\n\\section{\\code{drive_oauth_app()}}{\n\n\nIn light of the new \\code{\\link[gargle:gargle_oauth_client_from_json]{gargle::gargle_oauth_client()}} constructor and class of\nthe same name, \\code{drive_oauth_app()} is being replaced by\n\\code{\\link[=drive_oauth_client]{drive_oauth_client()}}.\n}\n\n\\section{\\code{drive_example()}}{\n\n\nThis function is defunct. Access example files with \\code{\\link[=drive_examples_local]{drive_examples_local()}},\n\\code{\\link[=drive_example_local]{drive_example_local()}}, \\code{\\link[=drive_examples_remote]{drive_examples_remote()}}, and\n\\code{\\link[=drive_example_remote]{drive_example_remote()}}.\n}\n\n\\keyword{internal}\n"
  },
  {
    "path": "man/googledrive-package.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/googledrive-package.R\n\\docType{package}\n\\name{googledrive-package}\n\\alias{googledrive}\n\\alias{googledrive-package}\n\\title{googledrive: An Interface to Google Drive}\n\\description{\ngoogledrive allows you to interact with files on Google Drive\nfrom R.\n\n\\code{googledrive::drive_find(n_max = 50)} lists up to 50 of the files you see\nin \\href{https://drive.google.com}{My Drive}. You can expect to be sent to your\nbrowser here, to authenticate yourself and authorize the googledrive\npackage to deal on your behalf with Google Drive.\n\nMost functions begin with the prefix \\code{drive_}.\n\nThe goal is to allow Drive access that feels similar to Unix file system\nutilities, e.g., \\code{find}, \\code{ls}, \\code{mv}, \\code{cp}, \\code{mkdir}, and \\code{rm}.\n\nThe metadata for one or more Drive files is held in a \\code{\\link{dribble}}, a \"Drive\ntibble\". This is a data frame with one row per file. A dribble is returned\n(and accepted) by almost every function in googledrive. It is designed to\ngive people what they want (file name), track what the API wants (file id),\nand to hold the metadata needed for general file operations.\n\ngoogledrive is \"pipe-friendly\" (either the base \\verb{|>} or magrittr \\verb{\\%>\\%}\npipe), but does not require its use.\n\nPlease see the googledrive website for full documentation:\n\\itemize{\n\\item \\url{https://googledrive.tidyverse.org/index.html}\n}\n\nIn addition to function-specific help, there are several articles which are\nindexed here:\n\\itemize{\n\\item \\href{https://googledrive.tidyverse.org/articles/index.html}{Article index}\n}\n}\n\\seealso{\nUseful links:\n\\itemize{\n  \\item \\url{https://googledrive.tidyverse.org}\n  \\item \\url{https://github.com/tidyverse/googledrive}\n  \\item Report bugs at \\url{https://github.com/tidyverse/googledrive/issues}\n}\n\n}\n\\author{\n\\strong{Maintainer}: Jennifer Bryan \\email{jenny@posit.co} (\\href{https://orcid.org/0000-0002-6983-2759}{ORCID})\n\nAuthors:\n\\itemize{\n  \\item Lucy D'Agostino McGowan\n}\n\nOther contributors:\n\\itemize{\n  \\item Posit Software, PBC [copyright holder, funder]\n}\n\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/pipe.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/utils-pipe.R\n\\name{\\%>\\%}\n\\alias{\\%>\\%}\n\\title{Pipe operator}\n\\usage{\nlhs \\%>\\% rhs\n}\n\\description{\nSee \\code{magrittr::\\link[magrittr]{\\%>\\%}} for details.\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/request_generate.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/request_generate.R\n\\name{request_generate}\n\\alias{request_generate}\n\\title{Build a request for the Google Drive API}\n\\usage{\nrequest_generate(\n  endpoint = character(),\n  params = list(),\n  key = NULL,\n  token = drive_token()\n)\n}\n\\arguments{\n\\item{endpoint}{Character. Nickname for one of the selected Drive v3 API\nendpoints built into googledrive. Learn more in \\code{\\link[=drive_endpoints]{drive_endpoints()}}.}\n\n\\item{params}{Named list. Parameters destined for endpoint URL substitution,\nthe query, or the body.}\n\n\\item{key}{API key. Needed for requests that don't contain a token. The need\nfor an API key in the absence of a token is explained in Google's document\n\"Credentials, access, security, and identity\"\n(\\verb{https://support.google.com/googleapi/answer/6158857?hl=en&ref_topic=7013279}).\nIn order of precedence, these sources are consulted: the formal \\code{key}\nargument, a \\code{key} parameter in \\code{params}, a user-configured API key fetched\nvia \\code{\\link[=drive_api_key]{drive_api_key()}}, a built-in key shipped with googledrive. See\n\\code{\\link[=drive_auth_configure]{drive_auth_configure()}} for details on a user-configured key.}\n\n\\item{token}{Drive token. Set to \\code{NULL} to suppress the inclusion of a token.\nNote that, if auth has been de-activated via \\code{\\link[=drive_deauth]{drive_deauth()}},\n\\code{drive_token()} will actually return \\code{NULL}.}\n}\n\\value{\n\\code{list()}\\cr Components are \\code{method}, \\code{path}, \\code{query}, \\code{body},\n\\code{token}, and \\code{url}, suitable as input for \\code{\\link[=request_make]{request_make()}}.\n}\n\\description{\nBuild a request, using knowledge of the \\href{https://developers.google.com/drive/api/v3/about-sdk}{Drive v3 API} from its\nDiscovery Document\n(\\verb{https://www.googleapis.com/discovery/v1/apis/drive/v3/rest}). Most users\nshould, instead, use higher-level wrappers that facilitate common tasks,\nsuch as uploading or downloading Drive files. The functions here are\nintended for internal use and for programming around the Drive API.\n\n\\code{request_generate()} lets you provide the bare minimum of input.\nIt takes a nickname for an endpoint and:\n\\itemize{\n\\item Uses the API spec to look up the \\code{path}, \\code{method}, and base URL.\n\\item Checks \\code{params} for validity and completeness with respect to the\nendpoint. Separates parameters into those destined for the body, the query,\nand URL endpoint substitution (which is also enacted).\n\\item Adds an API key to the query if and only if \\code{token = NULL}.\n\\item Adds \\code{supportsAllDrives = TRUE} to the query if the endpoint requires.\n}\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\nreq <- request_generate(\n  \"drive.files.get\",\n  list(fileId = \"abc\"),\n  token = drive_token()\n)\nreq\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\n\\code{\\link[gargle:request_develop]{gargle::request_develop()}}, \\code{\\link[gargle:request_develop]{gargle::request_build()}}\n\nOther low-level API functions: \n\\code{\\link{drive_has_token}()},\n\\code{\\link{drive_token}()},\n\\code{\\link{request_make}()}\n}\n\\concept{low-level API functions}\n"
  },
  {
    "path": "man/request_make.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/request_make.R\n\\name{request_make}\n\\alias{request_make}\n\\alias{do_request}\n\\alias{do_paginated_request}\n\\title{Make a request for the Google Drive v3 API}\n\\usage{\nrequest_make(x, ...)\n\ndo_request(x, ...)\n\ndo_paginated_request(\n  x,\n  ...,\n  n_max = Inf,\n  n = function(res) 1,\n  verbose = deprecated()\n)\n}\n\\arguments{\n\\item{x}{List, holding the components for an HTTP request, presumably created\nwith \\code{\\link[=request_generate]{request_generate()}} Should contain the \\code{method}, \\code{url}, \\code{body},\nand \\code{token}.}\n\n\\item{...}{Optional arguments passed through to the HTTP method.}\n\n\\item{n_max}{Maximum number of items to return. Defaults to \\code{Inf}, i.e. there\nis no limit and we keep making requests until we get all items.}\n\n\\item{n}{Function that computes the number of items in one response or page.\nThe default function always returns \\code{1} and therefore treats each page as\nan item. If you know more about the structure of the response, you can\npass another function to count and threshhold, for example, the number of\nfiles or comments.}\n\n\\item{verbose}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}} This logical argument to\nindividual googledrive functions is deprecated. To globally suppress\ngoogledrive messaging, use \\code{options(googledrive_quiet = TRUE)} (the default\nbehaviour is to emit informational messages). To suppress messaging in a\nmore limited way, use the helpers \\code{\\link[=local_drive_quiet]{local_drive_quiet()}} or\n\\code{\\link[=with_drive_quiet]{with_drive_quiet()}}.}\n}\n\\value{\n\\code{request_make()}: Object of class \\code{response} from \\link[httr:httr-package]{httr::httr}.\n\n\\code{do_request()}: List representing the content returned by a single\nrequest.\n\n\\code{do_paginated_request()}: List of lists, representing the returned\ncontent, one component per page.\n}\n\\description{\nLow-level functions to execute one or more Drive API requests and, perhaps,\nprocess the response(s). Most users should, instead, use higher-level\nwrappers that facilitate common tasks, such as uploading or downloading Drive\nfiles. The functions here are intended for internal use and for programming\naround the Drive API. Three functions are documented here:\n\\itemize{\n\\item \\code{request_make()} does the bare minimum: calls \\code{\\link[gargle:request_retry]{gargle::request_retry()}},\nonly adding the googledrive user agent. Typically the input is created\nwith \\code{\\link[=request_generate]{request_generate()}} and the output is processed with\n\\code{\\link[gargle:response_process]{gargle::response_process()}}.\n\\item \\code{do_request()} is simply\n\\code{gargle::response_process(request_make(x, ...))}. It exists only because\nwe had to make \\code{do_paginated_request()} and it felt weird to not make the\nequivalent for a single request.\n\\item \\code{do_paginated_request()} executes the input request \\strong{with page\ntraversal}. It is impossible to separate paginated requests into a \"make\nrequest\" step and a \"process request\" step, because the token for the\nnext page must be extracted from the content of the current page.\nTherefore this function does both and returns a list of processed\nresponses, one per page.\n}\n}\n\\examples{\n\\dontrun{\n# build a request for an endpoint that is:\n#   * paginated\n#   * NOT privileged in googledrive, i.e. not covered by request_generate()\n# \"comments\" are a great example\n# https://developers.google.com/drive/v3/reference/comments\n#\n# Practice with a target file with > 2 comments\n# Note that we request 2 items (comments) per page\nreq <- gargle::request_build(\n  path = \"drive/v3/files/{fileId}/comments\",\n  method = \"GET\",\n  params = list(\n    fileId = \"your-file-id-goes-here\",\n    fields = \"*\",\n    pageSize = 2\n  ),\n  token = googledrive::drive_token()\n)\n# make the paginated request, but cap it at 1 page\n# should get back exactly two comments\ndo_paginated_request(req, n_max = 1)\n}\n}\n\\seealso{\nOther low-level API functions: \n\\code{\\link{drive_has_token}()},\n\\code{\\link{drive_token}()},\n\\code{\\link{request_generate}()}\n}\n\\concept{low-level API functions}\n"
  },
  {
    "path": "man/shared_drive_create.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/shared_drive_create.R\n\\name{shared_drive_create}\n\\alias{shared_drive_create}\n\\title{Create a new shared drive}\n\\usage{\nshared_drive_create(name)\n}\n\\arguments{\n\\item{name}{Character. Name of the new shared drive. Must be non-empty and not\nentirely whitespace.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per shared drive.\n}\n\\description{\nA shared drive supports files owned by an organization rather than an\nindividual user. Shared drives follow different sharing and ownership models\nfrom a specific user's \"My Drive\". Shared drives are the successors to the\nearlier concept of Team Drives. Learn more about \\link[=shared_drives]{shared drives}.\n}\n\\examples{\n\\dontrun{\nshared_drive_create(\"my-awesome-shared-drive\")\n\n# Clean up\nshared_drive_rm(\"my-awesome-shared-drive\")\n}\n}\n\\seealso{\nWraps the \\code{drives.create} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/drives/create}\n}\n}\n"
  },
  {
    "path": "man/shared_drive_find.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/shared_drive_find.R\n\\name{shared_drive_find}\n\\alias{shared_drive_find}\n\\title{Find shared drives}\n\\usage{\nshared_drive_find(pattern = NULL, n_max = Inf, ...)\n}\n\\arguments{\n\\item{pattern}{Character. If provided, only the items whose names match this\nregular expression are returned. This is implemented locally on the results\nreturned by the API.}\n\n\\item{n_max}{Integer. An upper bound on the number of items to return. This\napplies to the results requested from the API, which may be further\nfiltered locally, via the \\code{pattern} argument.}\n\n\\item{...}{Other parameters to pass along in the request, such as \\code{pageSize}\nor \\code{useDomainAdminAccess}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per shared drive.\n}\n\\description{\nThis is the closest googledrive function to what you get from\nvisiting \\url{https://drive.google.com} and clicking \"Shared drives\".\n\nA shared drive supports files owned by an organization rather than an\nindividual user. Shared drives follow different sharing and ownership models\nfrom a specific user's \"My Drive\". Shared drives are the successors to the\nearlier concept of Team Drives. Learn more about \\link[=shared_drives]{shared drives}.\n}\n\\examples{\n\\dontrun{\nshared_drive_find()\n}\n}\n\\seealso{\nWraps the \\code{drives.list} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/drives/list}\n}\n}\n"
  },
  {
    "path": "man/shared_drive_get.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/shared_drive_get.R\n\\name{shared_drive_get}\n\\alias{shared_drive_get}\n\\title{Get shared drives by name or id}\n\\usage{\nshared_drive_get(name = NULL, id = NULL)\n}\n\\arguments{\n\\item{name}{Character vector of names. A character vector marked with\n\\code{\\link[=as_id]{as_id()}} is treated as if it was provided via the \\code{id} argument.}\n\n\\item{id}{Character vector of shared drive ids or URLs (it is first processed\nwith \\code{\\link[=as_id]{as_id()}}). If both \\code{name} and \\code{id} are non-\\code{NULL}, \\code{id} is silently\nignored.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per shared drive.\n}\n\\description{\nRetrieve metadata for shared drives specified by name or id. Note that Google\nDrive does NOT behave like your local file system:\n\\itemize{\n\\item You can get zero, one, or more shared drives back for each name! Shared\ndrive names need not be unique.\n}\n\nA shared drive supports files owned by an organization rather than an\nindividual user. Shared drives follow different sharing and ownership models\nfrom a specific user's \"My Drive\". Shared drives are the successors to the\nearlier concept of Team Drives. Learn more about \\link[=shared_drives]{shared drives}.\n}\n\\examples{\n\\dontrun{\nshared_drive_get(\"my-awesome-shared-drive\")\nshared_drive_get(c(\"apple\", \"orange\", \"banana\"))\nshared_drive_get(as_id(\"KCmiHLXUk9PVA-0AJNG\"))\nshared_drive_get(as_id(\"https://drive.google.com/drive/u/0/folders/KCmiHLXUk9PVA-0AJNG\"))\nshared_drive_get(id = \"KCmiHLXUk9PVA-0AJNG\")\nshared_drive_get(id = \"https://drive.google.com/drive/u/0/folders/KCmiHLXUk9PVA-0AJNG\")\n}\n}\n"
  },
  {
    "path": "man/shared_drive_rm.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/shared_drive_rm.R\n\\name{shared_drive_rm}\n\\alias{shared_drive_rm}\n\\title{Delete shared drives}\n\\usage{\nshared_drive_rm(drive = NULL)\n}\n\\arguments{\n\\item{drive}{Anything that identifies the shared drive(s) of interest. Can\nbe a character vector of names, a character vector of file ids or URLs\nmarked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}} consisting only of shared drives.}\n}\n\\value{\nLogical vector, indicating whether the delete succeeded.\n}\n\\description{\nA shared drive supports files owned by an organization rather than an\nindividual user. Shared drives follow different sharing and ownership models\nfrom a specific user's \"My Drive\". Shared drives are the successors to the\nearlier concept of Team Drives. Learn more about \\link[=shared_drives]{shared drives}.\n}\n\\examples{\n\\dontrun{\n# Create shared drives to remove in various ways\nshared_drive_create(\"testdrive-01\")\nsd02 <- shared_drive_create(\"testdrive-02\")\nshared_drive_create(\"testdrive-03\")\nsd04 <- shared_drive_create(\"testdrive-04\")\n\n# remove by name\nshared_drive_rm(\"testdrive-01\")\n# remove by id\nshared_drive_rm(as_id(sd02))\n# remove by URL (or, rather, id found in URL)\nshared_drive_rm(as_id(\"https://drive.google.com/drive/u/0/folders/Q5DqUk9PVA\"))\n# remove by dribble\nshared_drive_rm(sd04)\n}\n}\n\\seealso{\nWraps the \\code{drives.delete} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/drives/delete}\n}\n}\n"
  },
  {
    "path": "man/shared_drive_update.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/shared_drive_update.R\n\\name{shared_drive_update}\n\\alias{shared_drive_update}\n\\title{Update a shared drive}\n\\usage{\nshared_drive_update(shared_drive, ...)\n}\n\\arguments{\n\\item{shared_drive}{Anything that identifies one specific shared drive: its\nname, its id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}. The value\nprovided to \\code{shared_drive} is pre-processed with \\code{\\link[=as_shared_drive]{as_shared_drive()}}. Read\nmore about \\link[=shared_drives]{shared drives}.}\n\n\\item{...}{Properties to set in \\code{name = value} form. See the \"Request\nbody\" section of the Drive API docs for this endpoint.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per shared drive.\n}\n\\description{\nUpdate the metadata of an existing shared drive, e.g. its background image or\ntheme.\n\nA shared drive supports files owned by an organization rather than an\nindividual user. Shared drives follow different sharing and ownership models\nfrom a specific user's \"My Drive\". Shared drives are the successors to the\nearlier concept of Team Drives. Learn more about \\link[=shared_drives]{shared drives}.\n}\n\\examples{\n\\dontrun{\n# create a shared drive\nsd <- shared_drive_create(\"I love themes!\")\n\n# see the themes available to you\nthemes <- drive_about()$driveThemes\npurrr::map_chr(themes, \"id\")\n\n# cycle through various themes for this shared drive\nsd <- shared_drive_update(sd, themeId = \"bok_choy\")\nsd <- shared_drive_update(sd, themeId = \"cocktails\")\n\n# Clean up\nshared_drive_rm(sd)\n}\n}\n\\seealso{\nWraps the \\code{drives.update} endpoint:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/reference/drives/update}\n}\n}\n"
  },
  {
    "path": "man/shared_drives.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/shared_drives.R\n\\name{shared_drives}\n\\alias{shared_drives}\n\\title{Access shared drives}\n\\description{\nA shared drive supports files owned by an organization rather than an\nindividual user. Shared drives follow different sharing and ownership models\nfrom a specific user's \"My Drive\". Shared drives are the successors to the\nearlier concept of Team Drives.\n\nHow to capture a shared drive or files/folders that live on a\nshared drive for downstream use:\n\\itemize{\n\\item \\code{\\link[=shared_drive_find]{shared_drive_find()}} and \\code{\\link[=shared_drive_get]{shared_drive_get()}} return a \\code{\\link{dribble}} with\nmetadata on shared drives themselves. You will need this in order to use a\nshared drive in certain file operations. For example, you can specify a\nshared drive as the parent folder via the \\code{path} argument for upload, move,\ncopy, etc. In that context, the id of a shared drive functions like the id of\nits top-level or root folder.\n\\item \\code{\\link[=drive_find]{drive_find()}} and \\code{\\link[=drive_get]{drive_get()}} return a \\code{\\link{dribble}} with metadata on\nfiles, including folders. Both can be directed to search for files on shared\ndrives using the optional arguments \\code{shared_drive} or \\code{corpus} (documented\nbelow).\n}\n\nRegard the functions mentioned above as the official \"port of\nentry\" for working with shared drives. Use these functions to capture your\ntarget(s) in a \\code{\\link{dribble}} to pass along to other googledrive functions.\nThe flexibility to refer to files by name or path does not apply as broadly\nto shared drives. While it's always a good idea to get things into a\n\\code{\\link{dribble}} early, for shared drives it's often required.\n}\n\\section{Specific shared drive}{\n\nTo search one specific shared drive, pass its name, marked id, or\n\\code{\\link{dribble}} to \\code{shared_drive} somewhere in the call, like so:\n\n\\if{html}{\\out{<div class=\"sourceCode\">}}\\preformatted{drive_find(..., shared_drive = \"i_am_a_shared_drive_name\")\ndrive_find(..., shared_drive = as_id(\"i_am_a_shared_drive_id\"))\ndrive_find(..., shared_drive = i_am_a_shared_drive_dribble)\n}\\if{html}{\\out{</div>}}\n\nThe value provided to \\code{shared_drive} is pre-processed with\n\\code{\\link[=as_shared_drive]{as_shared_drive()}}.\n}\n\n\\section{Other collections}{\n\nTo search other collections, pass the \\code{corpus} parameter somewhere in the\ncall, like so:\n\n\\if{html}{\\out{<div class=\"sourceCode\">}}\\preformatted{drive_find(..., corpus = \"user\")\ndrive_find(..., corpus = \"allDrives\")\ndrive_find(..., corpus = \"domain\")\n}\\if{html}{\\out{</div>}}\n\nPossible values of \\code{corpus} and what they mean:\n\\itemize{\n\\item \\code{\"user\"}: Queries files that the user has accessed, including both shared\ndrive and My Drive files.\n\\item \\code{\"drive\"}: Queries all items in the shared drive specified via\n\\code{shared_drive}. googledrive automatically fills this in whenever\n\\code{shared_drive} is not \\code{NULL}.\n\\item \\code{\"allDrives\"}: Queries files that the user has accessed and all shared\ndrives in which they are a member. Note that the response may include\n\\code{incompleteSearch : true}, indicating that some corpora were not searched\nfor this request (currently, googledrive does not surface this). Prefer\n\\code{\"user\"} or \\code{\"drive\"} to \\code{\"allDrives\"} for efficiency.\n\\item \\code{\"domain\"}: Queries files that are shared to the domain, including both\nshared drive and My Drive files.\n}\n}\n\n\\section{Google blogs and docs}{\n\nHere is some of the best official Google reading about shared drives:\n\\itemize{\n\\item \\href{https://workspaceupdates.googleblog.com/2019/04/shared-drives.html}{Team Drives is being renamed to shared drives} from Google Workspace blog\n\\item \\href{https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api}{Upcoming changes to the Google Drive API and Google Picker API} from the Google Cloud blog\n\\item \\url{https://developers.google.com/drive/api/v3/about-shareddrives}\n\\item \\url{https://developers.google.com/drive/api/v3/shared-drives-diffs}\n\\item Get started with shared drives: \\verb{https://support.google.com/a/users/answer/9310351} from Google Workspace Learning Center\n\\item Best practices for shared drives: \\verb{https://support.google.com/a/users/answer/9310156} from Google Workspace Learning Center\n}\n}\n\n\\section{API docs}{\n\ngoogledrive implements shared drive support as outlined here:\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/enable-shareddrives}\n}\n\nUsers shouldn't need to know any of this, but here are details for the\ncurious. The extra information needed to search shared drives consists of the\nfollowing query parameters:\n\\itemize{\n\\item \\code{corpora}: Where to search? Formed from googledrive's \\code{corpus} argument.\n\\item \\code{driveId}: The id of a specific shared drive. Only allowed -- and also\nabsolutely required -- when \\code{corpora = \"drive\"}. When user specifies a\n\\code{shared_drive}, googledrive sends its id and also infers that \\code{corpora}\nshould be set to \\code{\"drive\"}.\n\\item \\code{includeItemsFromAllDrives}: Do you want to see shared drive items?\nObviously, this should be \\code{TRUE} and googledrive sends this whenever shared\ndrive parameters are detected.\n\\item \\code{supportsAllDrives}: Does the sending application (googledrive, in this\ncase) know about shared drive? Obviously, this should be \\code{TRUE} and\ngoogledrive sends it for all applicable endpoints, all the time.\n}\n}\n\n"
  },
  {
    "path": "man/shortcut_create.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/shortcut.R\n\\name{shortcut_create}\n\\alias{shortcut_create}\n\\title{Create a shortcut to a Drive file}\n\\usage{\nshortcut_create(file, path = NULL, name = NULL, overwrite = NA)\n}\n\\arguments{\n\\item{file}{Something that identifies the file of interest on your Google\nDrive. Can be a name or path, a file id or URL marked with \\code{\\link[=as_id]{as_id()}}, or a\n\\code{\\link{dribble}}.}\n\n\\item{path}{Target destination for the new shortcut, i.e. a folder or a\nshared drive. Can be given as an actual path (character), a file id or URL\nmarked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}. Defaults to your \"My Drive\" root\nfolder. If \\code{path} is a shortcut to a folder, it is automatically resolved\nto its target folder.}\n\n\\item{name}{Character, new shortcut name if not specified as part of\n\\code{path}. This will force \\code{path} to be interpreted as a folder, even if it\nis character and lacks a trailing slash. By default, the shortcut starts out with the same name as\nthe target \\code{file}. As a consequence, if you want to use\n\\code{overwrite = TRUE} or \\code{overwrite = FALSE}, you \\strong{must} explicitly\nspecify the shortcut's \\code{name}.}\n\n\\item{overwrite}{Logical, indicating whether to check for a pre-existing file\nat the targetted \"filepath\". The quotes around \"filepath\" refer to the fact\nthat Drive does not impose a 1-to-1 relationship between filepaths and files,\nlike a typical file system; read more about that in \\code{\\link[=drive_get]{drive_get()}}.\n\\itemize{\n\\item \\code{NA} (default): Just do the operation, even if it results in multiple\nfiles with the same filepath.\n\\item \\code{TRUE}: Check for a pre-existing file at the filepath. If there is\nzero or one, move a pre-existing file to the trash, then carry on. Note\nthat the new file does not inherit any properties from the old one, such\nas sharing or publishing settings. It will have a new file ID. An error is\nthrown if two or more pre-existing files are found.\n\\item \\code{FALSE}: Error if there is any pre-existing file at the filepath.\n}\n\nNote that existence checks, based on filepath, are expensive operations, i.e.\nthey require additional API calls.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\n}\n\\description{\nCreates a shortcut to the target Drive \\code{file}, which could be a folder. A\nDrive shortcut functions like a symbolic or \"soft\" link and is primarily\nuseful for creating a specific Drive user experience in the browser, i.e. to\nmake a Drive file or folder appear in more than 1 place. Shortcuts are a\nrelatively new feature in Drive; they were introduced when Drive stopped\nallowing a file to have more than 1 parent folder.\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Target one of the official example files\n(src_file <- drive_example_remote(\"chicken_sheet\"))\n\n# Create a shortcut in the default location with the default name\nsc1 <- shortcut_create(src_file)\n# This shortcut could now be moved, renamed, etc.\n\n# Create a shortcut in the default location with a custom name\nsc2 <- src_file |>\n  shortcut_create(name = \"chicken_sheet_second_shortcut\")\n\n# Create a folder, then put a shortcut there, with default name\nfolder <- drive_mkdir(\"chicken_sheet_shortcut_folder\")\nsc3 <- src_file |>\n  shortcut_create(folder)\n\n# Look at all these shortcuts\n(dat <- drive_find(\"chicken_sheet\", type = \"shortcut\"))\n\n# Confirm the shortcuts all target the original file\ndat <- dat |>\n  drive_reveal(\"shortcut_details\")\npurrr::map_chr(dat$shortcut_details, \"targetId\")\nas_id(src_file)\n\n# Clean up\ndrive_rm(sc1, sc2, sc3, folder)\n\\dontshow{\\}) # examplesIf}\n}\n\\seealso{\n\\itemize{\n\\item \\url{https://developers.google.com/drive/api/v3/shortcuts}\n}\n}\n"
  },
  {
    "path": "man/shortcut_resolve.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/shortcut.R\n\\name{shortcut_resolve}\n\\alias{shortcut_resolve}\n\\title{Resolve shortcuts to their targets}\n\\usage{\nshortcut_resolve(file)\n}\n\\arguments{\n\\item{file}{Something that identifies the file(s) of interest on your Google\nDrive. Can be a character vector of names/paths, a character vector of file\nids or URLs marked with \\code{\\link[=as_id]{as_id()}}, or a \\code{\\link{dribble}}.}\n}\n\\value{\nAn object of class \\code{\\link{dribble}}, a tibble with one row per file.\nExtra columns \\code{name_shortcut} and\n\\code{id_shortcut} refer to the original shortcut.\n}\n\\description{\nRetrieves the metadata for the Drive file that a shortcut refers to, i.e. the\nshortcut's target. The returned \\code{\\link{dribble}} has the usual columns (\\code{name},\n\\code{id}, \\code{drive_resource}), which refer to the target. It will also include the\ncolumns \\code{name_shortcut} and \\code{id_shortcut}, which refer to the original\nshortcut. There are 3 possible scenarios:\n\\enumerate{\n\\item \\code{file} is a shortcut and user can \\code{\\link[=drive_get]{drive_get()}} the target. All is simple\nand well.\n\\item \\code{file} is a shortcut, but \\code{\\link[=drive_get]{drive_get()}} fails for the target. This can\nhappen if the user can see the shortcut, but does not have read access\nto the target. It can also happen if the target has been trashed or\ndeleted. In such cases, all of the target's metadata, except for \\code{id},\nwill be missing. Call \\code{drive_get()} on a problematic \\code{id} to see the\nspecific error.\n\\item \\code{file} is not a shortcut. \\code{name_shortcut} and \\code{id_shortcut} will both be\n\\code{NA}.\n}\n}\n\\examples{\n\\dontshow{if (drive_has_token()) withAutoprint(\\{ # examplesIf}\n# Create a file to make a shortcut to\nfile <- drive_example_remote(\"chicken_sheet\") |>\n  drive_cp(name = \"chicken-sheet-for-shortcut\")\n\n# Create a shortcut\nsc1 <- file |>\n  shortcut_create(name = \"shortcut-1\")\n\n# Create a second shortcut by copying the first\nsc1 <- sc1 |>\n  drive_cp(name = \"shortcut-2\")\n\n# Get the shortcuts\n(sc_dat <- drive_find(\"-[12]$\", type = \"shortcut\"))\n\n# Resolve them\n(resolved <- shortcut_resolve(sc_dat))\n\nresolved$id\nfile$id\n\n# Delete the target file\ndrive_rm(file)\n\n# (Try to) resolve the shortcuts again\nshortcut_resolve(sc_dat)\n# No error, but resolution is unsuccessful due to non-existent target\n\n# Clean up\ndrive_rm(sc_dat)\n\\dontshow{\\}) # examplesIf}\n}\n"
  },
  {
    "path": "man-roxygen/corpus.R",
    "content": "#' @param corpus Character, specifying which collections of items to search.\n#'   Relevant to those who work with shared drives and/or Google Workspace\n#'   domains. If specified, must be one of `\"user\"`, `\"drive\"` (requires that\n#'   `shared_drive` also be specified), `\"allDrives\"`, or `\"domain\"`. Read more\n#'   about [shared drives][shared_drives].\n"
  },
  {
    "path": "man-roxygen/dots-metadata.R",
    "content": "#' @param ... Named parameters to pass along to the Drive API. Has [dynamic\n#'   dots][rlang::dyn-dots] semantics. You can affect the metadata of the target file by\n#'   specifying properties of the Files resource via `...`. Read the \"Request\n#'   body\" section of the Drive API docs for the associated endpoint to learn\n#'   about relevant parameters.\n"
  },
  {
    "path": "man-roxygen/file-plural.R",
    "content": "#' @param file Something that identifies the file(s) of interest on your Google\n#'   Drive. Can be a character vector of names/paths, a character vector of file\n#'   ids or URLs marked with [as_id()], or a [`dribble`].\n"
  },
  {
    "path": "man-roxygen/file-singular.R",
    "content": "#' @param file Something that identifies the file of interest on your Google\n#'   Drive. Can be a name or path, a file id or URL marked with [as_id()], or a\n#'   [`dribble`].\n"
  },
  {
    "path": "man-roxygen/media.R",
    "content": "#' @param media Character, path to the local file to upload.\n"
  },
  {
    "path": "man-roxygen/n_max.R",
    "content": "#' @param n_max Integer. An upper bound on the number of items to return. This\n#'   applies to the results requested from the API, which may be further\n#'   filtered locally, via the `pattern` argument.\n"
  },
  {
    "path": "man-roxygen/overwrite.R",
    "content": "#' @param overwrite Logical, indicating whether to check for a pre-existing file\n#'   at the targetted \"filepath\". The quotes around \"filepath\" refer to the fact\n#'   that Drive does not impose a 1-to-1 relationship between filepaths and files,\n#'   like a typical file system; read more about that in [drive_get()].\n#'\n#'   * `NA` (default): Just do the operation, even if it results in multiple\n#'     files with the same filepath.\n#'   * `TRUE`: Check for a pre-existing file at the filepath. If there is\n#'     zero or one, move a pre-existing file to the trash, then carry on. Note\n#'     that the new file does not inherit any properties from the old one, such\n#'     as sharing or publishing settings. It will have a new file ID. An error is\n#'     thrown if two or more pre-existing files are found.\n#'   * `FALSE`: Error if there is any pre-existing file at the filepath.\n#'\n#' Note that existence checks, based on filepath, are expensive operations, i.e.\n#' they require additional API calls.\n\n"
  },
  {
    "path": "man-roxygen/pattern.R",
    "content": "#' @param pattern Character. If provided, only the items whose names match this\n#'   regular expression are returned. This is implemented locally on the results\n#'   returned by the API.\n"
  },
  {
    "path": "man-roxygen/shared-drive-description.R",
    "content": "#' @description\n\n#' A shared drive supports files owned by an organization rather than an\n#' individual user. Shared drives follow different sharing and ownership models\n#' from a specific user's \"My Drive\". Shared drives are the successors to the\n#' earlier concept of Team Drives. Learn more about [shared\n#' drives][shared_drives].\n"
  },
  {
    "path": "man-roxygen/shared_drive-plural.R",
    "content": "#' @param drive Anything that identifies the shared drive(s) of interest. Can\n#'   be a character vector of names, a character vector of file ids or URLs\n#'   marked with [as_id()], or a [`dribble`] consisting only of shared drives.\n"
  },
  {
    "path": "man-roxygen/shared_drive-singular.R",
    "content": "#' @param shared_drive Anything that identifies one specific shared drive: its\n#'   name, its id or URL marked with [as_id()], or a [`dribble`]. The value\n#'   provided to `shared_drive` is pre-processed with [as_shared_drive()]. Read\n#'   more about [shared drives][shared_drives].\n"
  },
  {
    "path": "man-roxygen/team-drives-description.R",
    "content": "#' @description\n\n#' Team Drives have been rebranded as *shared drives* and, as of googledrive\n#' v2.0.0, all `team_drive_*()` functions have been deprecated, in favor of\n#' `shared_drive_*()` successors.\n#'\n#' The changes in googledrive reflect that the Team Drives resource collection\n#' has been deprecated in the Drive API v3, in favor of the new (shared) Drives\n#' resource collection. Read more\n\n#' * <https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api>\n\n"
  },
  {
    "path": "man-roxygen/team_drive-plural.R",
    "content": "#' @param team_drive `r lifecycle::badge(\"deprecated\")` Google Drive and the\n#'   Drive API have replaced Team Drives with shared drives.\n"
  },
  {
    "path": "man-roxygen/team_drive-singular.R",
    "content": "#' @param team_drive `r lifecycle::badge(\"deprecated\")` Google Drive and the\n#'   Drive API have replaced Team Drives with shared drives.\n"
  },
  {
    "path": "man-roxygen/verbose.R",
    "content": "#' @param verbose `r lifecycle::badge(\"deprecated\")` This logical argument to\n#'   individual googledrive functions is deprecated. To globally suppress\n#'   googledrive messaging, use `options(googledrive_quiet = TRUE)` (the default\n#'   behaviour is to emit informational messages). To suppress messaging in a\n#'   more limited way, use the helpers [`local_drive_quiet()`] or\n#'   [`with_drive_quiet()`].\n"
  },
  {
    "path": "revdep/.gitignore",
    "content": "checks\nlibrary\nchecks.noindex\nlibrary.noindex\ndata.sqlite\n*.html\ncloud.noindex\n"
  },
  {
    "path": "revdep/README.md",
    "content": "# Revdeps\n\n"
  },
  {
    "path": "revdep/cran.md",
    "content": "## revdepcheck results\n\nWe checked 23 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package.\n\n * We saw 0 new problems\n * We failed to check 0 packages\n\n"
  },
  {
    "path": "revdep/failures.md",
    "content": "*Wow, no problems at all. :)*"
  },
  {
    "path": "revdep/problems.md",
    "content": "*Wow, no problems at all. :)*"
  },
  {
    "path": "tests/spelling.R",
    "content": "if (requireNamespace(\"spelling\", quietly = TRUE)) {\n  spelling::spell_check_test(\n    vignettes = TRUE,\n    error = FALSE,\n    skip_on_cran = TRUE\n  )\n}\n"
  },
  {
    "path": "tests/testthat/.gitignore",
    "content": ".httr-oauth\ntesting-token.rds\n.Rapp.history\nall-test-clean.*\nall-test-setup.*\n"
  },
  {
    "path": "tests/testthat/_snaps/deprecated.md",
    "content": "# drive_auth_config() is deprecated\n\n    Code\n      drive_auth_config()\n    Condition\n      Error:\n      ! `drive_auth_config()` was deprecated in googledrive 1.0.0 and is now defunct.\n      i Use `drive_auth_configure()` to configure your own OAuth client or API key.\n      i Use `drive_deauth()` to go into a de-authorized state.\n      i Use `drive_oauth_client()` to retrieve a user-configured client, if it exists.\n      i Use `drive_api_key()` to retrieve a user-configured API key, if it exists.\n\n# drive_oauth_app() is deprecated\n\n    Code\n      absorb <- drive_oauth_app()\n    Condition\n      Warning:\n      `drive_oauth_app()` was deprecated in googledrive 2.1.0.\n      i Please use `drive_oauth_client()` instead.\n\n# drive_auth_configure(app =) is deprecated in favor of client\n\n    Code\n      drive_auth_configure(app = client)\n    Condition\n      Warning:\n      The `app` argument of `drive_auth_configure()` is deprecated as of googledrive 2.1.0.\n      i Please use the `client` argument instead.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/dribble.md",
    "content": "# tbl_sum.dribble method works\n\n    Code\n      print(d)\n    Output\n      # A dribble: 2 x 3\n        name  id       drive_resource  \n        <chr> <drv_id> <list>          \n      1 a     b        <named list [1]>\n      2 b     a        <named list [1]>\n\n# new_dribble() requires a list and adds the dribble class\n\n    Code\n      new_dribble(1:3)\n    Condition\n      Error:\n      ! `x` must be a list\n\n# validate_dribble() checks class, var names, var types\n\n    Code\n      validate_dribble(\"a\")\n    Condition\n      Error in `validate_dribble()`:\n      ! inherits(x, \"dribble\") is not TRUE\n\n---\n\n    Code\n      validate_dribble(d)\n    Condition\n      Error in `validate_dribble()`:\n      ! Invalid <dribble>. This column has the wrong type:\n      * `id`\n\n---\n\n    Code\n      validate_dribble(d)\n    Condition\n      Error in `validate_dribble()`:\n      ! Invalid <dribble>. These columns have the wrong type:\n      * `name`\n      * `id`\n\n---\n\n    Code\n      validate_dribble(d)\n    Condition\n      Error in `validate_dribble()`:\n      ! Invalid <dribble>. This required column is missing:\n      * `name`\n\n---\n\n    Code\n      validate_dribble(d)\n    Condition\n      Error in `validate_dribble()`:\n      ! Invalid <dribble>. These required columns are missing:\n      * `name`\n      * `id`\n\n---\n\n    Code\n      validate_dribble(d)\n    Condition\n      Error in `validate_dribble()`:\n      ! Invalid <dribble>. Can't confirm `kind = \"drive#file\"` or `kind = \"drive#drive\"` for all elements of the `drive_resource` column.\n\n# dribble nrow checkers work\n\n    Code\n      confirm_single_file(d)\n    Condition\n      Error in `confirm_single_file()`:\n      ! `d` does not identify at least one Drive file.\n\n---\n\n    Code\n      confirm_some_files(d)\n    Condition\n      Error in `confirm_some_files()`:\n      ! `d` does not identify at least one Drive file.\n\n---\n\n    Code\n      confirm_single_file(d)\n    Condition\n      Error in `confirm_single_file()`:\n      ! `d` identifies more than one Drive file.\n\n# as_dribble() default method handles unsuitable input\n\n    Code\n      as_dribble(1.3)\n    Condition\n      Error in `as_dribble()`:\n      ! Don't know how to coerce an object of class <numeric> into a <dribble>.\n\n---\n\n    Code\n      as_dribble(TRUE)\n    Condition\n      Error in `as_dribble()`:\n      ! Don't know how to coerce an object of class <logical> into a <dribble>.\n\n# as_dribble.list() catches bad input\n\n    Code\n      as_dribble(list(drib_lst))\n    Condition\n      Error in `as_dribble.list()`:\n      ! map_lgl(x, ~all(required_nms %in% names(.x))) is not TRUE\n\n---\n\n    Code\n      as_dribble(list(drib_lst))\n    Condition\n      Error in `validate_dribble()`:\n      ! Invalid <dribble>. Can't confirm `kind = \"drive#file\"` or `kind = \"drive#drive\"` for all elements of the `drive_resource` column.\n\n# as_parent() throws specific errors\n\n    Code\n      foo <- d[0, ]\n      as_parent(foo)\n    Condition\n      Error in `as_parent()`:\n      ! Parent specified via `foo` is invalid:\n      x Does not exist.\n\n---\n\n    Code\n      foo <- d\n      as_parent(foo)\n    Condition\n      Error in `as_parent()`:\n      ! Parent specified via `foo` is invalid:\n      x Doesn't uniquely identify exactly one folder or shared drive.\n\n---\n\n    Code\n      foo <- d[1, ]\n      as_parent(foo)\n    Condition\n      Error in `as_parent()`:\n      ! Parent specified via `foo` is invalid:\n      x Is neither a folder nor a shared drive.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_auth.md",
    "content": "# drive_auth_configure works\n\n    Code\n      drive_auth_configure(client = gargle::gargle_client(), path = \"PATH\")\n    Condition\n      Error in `drive_auth_configure()`:\n      ! Must supply exactly one of `client` or `path`, not both\n\n# drive_scopes() reveals Drive scopes\n\n    Code\n      drive_scopes()\n    Output\n                                                          drive \n                        \"https://www.googleapis.com/auth/drive\" \n                                                           full \n                        \"https://www.googleapis.com/auth/drive\" \n                                                 drive.readonly \n               \"https://www.googleapis.com/auth/drive.readonly\" \n                                                     drive.file \n                   \"https://www.googleapis.com/auth/drive.file\" \n                                                  drive.appdata \n                \"https://www.googleapis.com/auth/drive.appdata\" \n                                                 drive.metadata \n               \"https://www.googleapis.com/auth/drive.metadata\" \n                                        drive.metadata.readonly \n      \"https://www.googleapis.com/auth/drive.metadata.readonly\" \n                                          drive.photos.readonly \n        \"https://www.googleapis.com/auth/drive.photos.readonly\" \n                                                  drive.scripts \n                \"https://www.googleapis.com/auth/drive.scripts\" \n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_cp.md",
    "content": "# drive_cp() can copy file in place\n\n    Code\n      write_utf8(drive_cp_message)\n    Output\n      Original file:\n      * 'i-am-a-file-TEST-drive_cp' <id: {FILE_ID}>\n      Copied to file:\n      * '{cp_name}' <id: {FILE_ID}>\n\n# drive_cp() can copy a file into a different folder\n\n    Code\n      write_utf8(drive_cp_message)\n    Output\n      Original file:\n      * 'i-am-a-file-TEST-drive_cp' <id: {FILE_ID}>\n      Copied to file:\n      * 'i-am-a-folder-TEST-drive_cp/{cp_name}' <id: {FILE_ID}>\n\n# drive_cp() doesn't tolerate ambiguity in `path`\n\n    Code\n      drive_cp(file, nm_(\"i-am-a-folder\"))\n    Condition\n      Error in `confirm_clear_path()`:\n      ! Unclear if `path` specifies parent folder or full path to the new file, including its name.\n      See `?as_dribble()` for advice on how to make this clear.\n\n# drive_cp() errors if asked to copy a folder\n\n    Code\n      drive_cp(nm_(\"i-am-a-folder\"))\n    Condition\n      Error in `drive_cp()`:\n      ! The Drive API does not copy folders or shared drives.\n\n# drive_cp() takes name, assumes path is folder if both are specified\n\n    Code\n      write_utf8(drive_cp_message)\n    Output\n      Original file:\n      * 'i-am-a-file-TEST-drive_cp' <id: {FILE_ID}>\n      Copied to file:\n      * 'i-am-a-folder-TEST-drive_cp/{cp_name}' <id: {FILE_ID}>\n\n---\n\n    Code\n      file_cp <- drive_cp(nm_(\"i-am-a-file\"), path = nm_(\"file-name\"), name = nm_(\n        \"file-name\"))\n    Condition\n      Error in `as_parent()`:\n      ! Parent specified via `path` is invalid:\n      x Does not exist.\n\n---\n\n    Code\n      file_cp <- drive_cp(nm_(\"i-am-a-file\"), append_slash(nm_(\"not-unique-folder\")))\n    Condition\n      Error in `as_parent()`:\n      ! Parent specified via `path` is invalid:\n      x Doesn't uniquely identify exactly one folder or shared drive.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_create.md",
    "content": "# drive_create() errors for bad input (before hitting Drive API)\n\n    Code\n      drive_create()\n    Condition\n      Error in `drive_create()`:\n      ! `name` is absent but must be supplied.\n\n---\n\n    Code\n      drive_create(letters)\n    Condition\n      Error in `drive_create()`:\n      ! is_string(name) is not TRUE\n\n# drive_create() errors if parent path does not exist\n\n    Code\n      drive_create(\"a\", path = \"qweruiop\")\n    Condition\n      Error in `as_parent()`:\n      ! Parent specified via `path` is invalid:\n      x Does not exist.\n\n# drive_create() errors if parent exists but is not a folder\n\n    Code\n      drive_create(\"a\", path = x)\n    Condition\n      Error in `as_parent()`:\n      ! Parent specified via `path` is invalid:\n      x Is neither a folder nor a shared drive.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_download.md",
    "content": "# drive_download() won't overwrite existing file\n\n    Code\n      withr::with_dir(tmpdir, drive_download(dribble(), path = precious_filepath))\n    Condition\n      Error in `drive_download()`:\n      ! Local `path` already exists and overwrite is `FALSE`:\n      * 'precious-TEST-drive_download.txt'\n\n# drive_download() downloads a file and adds local_path column\n\n    Code\n      write_utf8(drive_download_message)\n    Output\n      File downloaded:\n      * '{file_to_download}' <id: {FILE_ID}>\n      Saved locally as:\n      * '{download_filepath}'\n\n# drive_download() errors if file does not exist on Drive\n\n    Code\n      drive_download(nm_(\"this-should-not-exist\"))\n    Condition\n      Error in `confirm_single_file()`:\n      ! `file` does not identify at least one Drive file.\n\n# drive_download() converts with explicit `type`\n\n    Code\n      write_utf8(drive_download_message)\n    Output\n      File downloaded:\n      * '{file_to_download}' <id: {FILE_ID}>\n      Saved locally as:\n      * '{download_filename}'\n\n# drive_download() converts with type implicit in `path`\n\n    Code\n      write_utf8(drive_download_message)\n    Output\n      File downloaded:\n      * '{file_to_download}' <id: {FILE_ID}>\n      Saved locally as:\n      * '{download_filename}'\n\n# drive_download() converts using default MIME type, if necessary\n\n    Code\n      write_utf8(drive_download_message)\n    Output\n      File downloaded:\n      * '{file_to_download}' <id: {FILE_ID}>\n      Saved locally as:\n      * '{download_filename}'\n\n# drive_download() can convert a Google Doc to local markdown\n\n    Code\n      write_utf8(drive_download_message)\n    Output\n      File downloaded:\n      * '{file_to_download}' <id: {FILE_ID}>\n      Saved locally as:\n      * '{download_filename}'\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_examples.md",
    "content": "# drive_example_remote() errors when >1 match\n\n    Code\n      drive_example_remote(\"chicken\")\n    Condition\n      Error in `one_file()`:\n      ! Found multiple matching remote files:\n      * 'chicken_doc'\n      * 'chicken_sheet'\n      * 'chicken.csv'\n      * 'chicken.jpg'\n      * 'chicken.pdf'\n      * 'chicken.txt'\n      i Make the `matches` regular expression more specific.\n\n# drive_example_local() errors when >1 match\n\n    Code\n      drive_example_local(\"chicken\")\n    Condition\n      Error in `one_file()`:\n      ! Found multiple matching local files:\n      * 'chicken.csv'\n      * 'chicken.jpg'\n      * 'chicken.pdf'\n      * 'chicken.txt'\n      i Make the `matches` regular expression more specific.\n\n# drive_examples_local() errors when no match\n\n    Code\n      drive_examples_local(\"platypus\")\n    Condition\n      Error in `many_files()`:\n      ! Can't find a local example file with a name that matches \"platypus\".\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_fields.md",
    "content": "# drive_fields() admits it only knows about Files fields\n\n    Code\n      out <- drive_fields(x, resource = \"foo\")\n    Message\n      ! Currently only fields for the 'files' resource can be checked for validity.\n        Nothing done.\n\n# drive_fields() detects bad fields\n\n    Code\n      out <- drive_fields(c(\"name\", \"parents\", \"ownedByMe\", \"pancakes!\"))\n    Condition\n      Warning:\n      Omitting fields that are not recognized as part of the Files resource:\n      * 'pancakes!'\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_find.md",
    "content": "# drive_find() errors for nonsense in `n_max`\n\n    Code\n      drive_find(n_max = \"a\")\n    Condition\n      Error in `drive_find()`:\n      ! is.numeric(n_max) is not TRUE\n\n---\n\n    Code\n      drive_find(n_max = 1:3)\n    Condition\n      Error in `drive_find()`:\n      ! length(n_max) == 1 is not TRUE\n\n---\n\n    Code\n      drive_find(n_max = -2)\n    Condition\n      Error in `drive_find()`:\n      ! n_max >= 0 is not TRUE\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_get.md",
    "content": "# drive_get() 'no input' edge cases\n\n    Code\n      drive_get(id = NA_character_)\n    Condition\n      Error in `map()`:\n      i In index: 1.\n      Caused by error in `.f()`:\n      ! Can't `drive_get()` a file when `id` is `NA`.\n\n---\n\n    Code\n      drive_get(id = \"\")\n    Condition\n      Error in `validate_drive_id()`:\n      ! A <drive_id> must match this regular expression: `^[a-zA-Z0-9_-]+$`\n      Invalid input:\n      x '\"\"'\n\n---\n\n    Code\n      dat <- drive_get(\"\")\n    Message\n      ! Problem with 1 path: path is empty string\n      ! No path resolved to exactly 1 file.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_id-class.md",
    "content": "# as_id() errors for unanticipated input\n\n    Code\n      as_id(mean)\n    Condition\n      Error in `as_id()`:\n      ! Don't know how to coerce an object of class <function> into a <drive_id>.\n\n---\n\n    Code\n      as_id(1.2)\n    Condition\n      Error in `as_id()`:\n      ! Don't know how to coerce an object of class <numeric> into a <drive_id>.\n\n---\n\n    Code\n      as_id(1L)\n    Condition\n      Error in `as_id()`:\n      ! Don't know how to coerce an object of class <integer> into a <drive_id>.\n\n# drive_id's are formatted OK\n\n    Code\n      print(x$id)\n    Output\n      <drive_id[10]>\n       [1] 1CEefQCUc5T7B4yrawnNfqwdWEbiDyDs9E5OB9p6AXQ8\n       [2] 1oUrQNg-2lcAieZyCqoQ_vDwYLMVzhN4-oOSTt2L3Glw\n       [3] 1V6qQhCVkgVRLUL24_lExApTklRsrDLv3           \n       [4] 1uBR1UMWUXQ02OS9B6sQ3-98Z7QFUGUwn           \n       [5] 1U_5_O1-Od_q30wQVhGgZlMevFkcxHr7V           \n       [6] 1Y2O_otAmg7BN0Bk_5d-i9ZlGcflmw_uo           \n       [7] 1o_UmldMPpRfr4JlVyZKu1ZR2vN_m-uhs           \n       [8] 1oa-yeDNPd8x7sddbwHEWjGadY7HkGvMv           \n       [9] 1yeH1TqZczcPvhZoJvSOnG2_rfFCycyix           \n      [10] 1qSmvJtYUf6w1UtnA4XWUmG_qrVjjTnCN           \n\n# drive_ids look OK in a dribble and truncate gracefully\n\n    Code\n      print(x)\n    Output\n      # A dribble: 10 x 3\n         name                                 id       drive_resource   \n         <chr>                                <drv_id> <list>           \n       1 foo_sheet-TEST-drive_publish         1CEefQC~ <named list [36]>\n       2 foo_doc-TEST-drive_publish           1oUrQNg~ <named list [36]>\n       3 DESC-TEST-drive_mv-jenny-7694ef72    1V6qQhC~ <named list [40]>\n       4 DESC-TEST-drive_mv-jenny-7694ef72    1uBR1UM~ <named list [40]>\n       5 name-collision-TEST-path-utils-jenny 1U_5_O1~ <named list [39]>\n       6 DESCRIPTION-TEST-drive-update-jenny  1Y2O_ot~ <named list [40]>\n       7 name-collision-TEST-path-utils-jenny 1o_Umld~ <named list [39]>\n       8 DESC-TEST-drive-mv-jenny             1oa-yeD~ <named list [40]>\n       9 DESC-TEST-drive-mv-jenny             1yeH1Tq~ <named list [40]>\n      10 DESC-TEST-drive-mv-jenny             1qSmvJt~ <named list [40]>\n\n---\n\n    Code\n      print(drive_reveal(x, \"mime_type\"))\n    Output\n      # A dribble: 10 x 4\n         name                                 mime_type        id       drive_resource\n         <chr>                                <chr>            <drv_id> <list>        \n       1 foo_sheet-TEST-drive_publish         application/vnd~ 1CEefQC~ <named list>  \n       2 foo_doc-TEST-drive_publish           application/vnd~ 1oUrQNg~ <named list>  \n       3 DESC-TEST-drive_mv-jenny-7694ef72    text/plain       1V6qQhC~ <named list>  \n       4 DESC-TEST-drive_mv-jenny-7694ef72    text/plain       1uBR1UM~ <named list>  \n       5 name-collision-TEST-path-utils-jenny application/oct~ 1U_5_O1~ <named list>  \n       6 DESCRIPTION-TEST-drive-update-jenny  text/plain       1Y2O_ot~ <named list>  \n       7 name-collision-TEST-path-utils-jenny application/oct~ 1o_Umld~ <named list>  \n       8 DESC-TEST-drive-mv-jenny             text/plain       1oa-yeD~ <named list>  \n       9 DESC-TEST-drive-mv-jenny             text/plain       1yeH1Tq~ <named list>  \n      10 DESC-TEST-drive-mv-jenny             text/plain       1qSmvJt~ <named list>  \n\n---\n\n    Code\n      print(x)\n    Output\n      # A dribble: 10 x 3\n         name                                 id       drive_resource   \n         <chr>                                <drv_id> <list>           \n       1 foo_sheet-TEST-drive_publish         <NA>     <named list [36]>\n       2 foo_doc-TEST-drive_publish           1oUrQNg~ <named list [36]>\n       3 DESC-TEST-drive_mv-jenny-7694ef72    1V6qQhC~ <named list [40]>\n       4 DESC-TEST-drive_mv-jenny-7694ef72    1uBR1UM~ <named list [40]>\n       5 name-collision-TEST-path-utils-jenny 1U_5_O1~ <named list [39]>\n       6 DESCRIPTION-TEST-drive-update-jenny  1Y2O_ot~ <named list [40]>\n       7 name-collision-TEST-path-utils-jenny 1o_Umld~ <named list [39]>\n       8 DESC-TEST-drive-mv-jenny             1oa-yeD~ <named list [40]>\n       9 DESC-TEST-drive-mv-jenny             1yeH1Tq~ <named list [40]>\n      10 DESC-TEST-drive-mv-jenny             1qSmvJt~ <named list [40]>\n\n# gargle_map_cli() is implemented for drive_id\n\n    Code\n      gargle_map_cli(as_id(month.name[1:3]))\n    Output\n      [1] \"{.field January}\"  \"{.field February}\" \"{.field March}\"   \n\n# validate_drive_id fails informatively\n\n    Code\n      validate_drive_id(\"\")\n    Condition\n      Error in `validate_drive_id()`:\n      ! A <drive_id> must match this regular expression: `^[a-zA-Z0-9_-]+$`\n      Invalid input:\n      x '\"\"'\n\n---\n\n    Code\n      validate_drive_id(\"a@&\")\n    Condition\n      Error in `validate_drive_id()`:\n      ! A <drive_id> must match this regular expression: `^[a-zA-Z0-9_-]+$`\n      Invalid input:\n      x 'a@&'\n\n# you can't insert invalid strings into a drive_id\n\n    Code\n      x[2] <- \"\"\n    Condition\n      Error in `validate_drive_id()`:\n      ! A <drive_id> must match this regular expression: `^[a-zA-Z0-9_-]+$`\n      Invalid input:\n      x '\"\"'\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_ls.md",
    "content": "# drive_ls() errors if `path` does not exist\n\n    Code\n      drive_ls(nm_(\"this-should-not-exist\"))\n    Condition\n      Error in `as_parent()`:\n      ! Parent specified via `path` is invalid:\n      x Does not exist.\n\n# drive_ls() list contents of the target of a folder shortcut\n\n    Code\n      write_utf8(drive_ls_message)\n    Output\n      i Parent specified via `path` is a shortcut; resolving to its target folder\n      i Resolved 1 shortcut found in 1 file:\n      * '{shortcut_name}' <id: {FILE_ID}> -> '{target_name}' <id: {FILE_ID}>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_mime_type.md",
    "content": "# drive_mime_type() errors for invalid input\n\n    Code\n      drive_mime_type(1)\n    Condition\n      Error in `drive_mime_type()`:\n      ! `type` must be character.\n\n---\n\n    Code\n      drive_mime_type(dribble())\n    Condition\n      Error in `drive_mime_type()`:\n      ! `type` must be character.\n\n# drive_mime_type() errors for single unrecognized input\n\n    Code\n      drive_mime_type(\"nonsense\")\n    Condition\n      Error in `drive_mime_type()`:\n      ! Unrecognized `type`:\n      x 'nonsense'\n\n# drive_extension() errors for invalid input\n\n    Code\n      drive_extension(1)\n    Condition\n      Error in `drive_extension()`:\n      ! is.character(type) is not TRUE\n\n---\n\n    Code\n      drive_extension(dribble())\n    Condition\n      Error in `drive_extension()`:\n      ! is.character(type) is not TRUE\n\n# drive_extension() errors for single unrecognized input\n\n    Code\n      drive_extension(\"nonsense\")\n    Condition\n      Error in `drive_mime_type()`:\n      ! Unrecognized `type`:\n      x 'nonsense'\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_mv.md",
    "content": "# drive_mv() can rename file\n\n    Code\n      write_utf8(drive_mv_message)\n    Output\n      Original file:\n      * '{name_1}' <id: {FILE_ID}>\n      Has been renamed:\n      * '{name_2}' <id: {FILE_ID}>\n\n# drive_mv() can move a file into a folder given as path\n\n    Code\n      write_utf8(drive_mv_message)\n    Output\n      Original file:\n      * '{mv_name}' <id: {FILE_ID}>\n      Has been moved:\n      * 'move-files-into-me-TEST-drive_mv/{mv_name}' <id: {FILE_ID}>\n\n# drive_mv() can move a file into a folder given as dribble\n\n    Code\n      write_utf8(drive_mv_message)\n    Output\n      Original file:\n      * '{mv_name}' <id: {FILE_ID}>\n      Has been moved:\n      * 'move-files-into-me-TEST-drive_mv/{mv_name}' <id: {FILE_ID}>\n\n# drive_mv() can rename and move, using `path` and `name`\n\n    Code\n      write_utf8(drive_mv_message)\n    Output\n      Original file:\n      * '{name_1}' <id: {FILE_ID}>\n      Has been renamed and moved:\n      * 'move-files-into-me-TEST-drive_mv/{name_2}' <id: {FILE_ID}>\n\n# drive_mv() can rename and move, using `path` only\n\n    Code\n      write_utf8(drive_mv_message)\n    Output\n      Original file:\n      * '{name_1}' <id: {FILE_ID}>\n      Has been renamed and moved:\n      * 'move-files-into-me-TEST-drive_mv/{name_2}' <id: {FILE_ID}>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_publish.md",
    "content": "# drive_publish() fails for non-native file type\n\n    Code\n      drive_publish(drive_pdf)\n    Condition\n      Error in `drive_change_publish()`:\n      ! Only native Google files can be published.\n      `file` includes a file with non-native MIME type\n      * 'foo_pdf-TEST-drive_publish': 'application/pdf'\n      i You can use `drive_share()` to change a file's sharing permissions.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_put.md",
    "content": "# drive_put() works\n\n    Code\n      write_utf8(first_put)\n    Output\n      i No pre-existing Drive file at this path. Calling `drive_upload()`.\n      Local file:\n      * '{local_file}'\n      Uploaded into Drive file:\n      * '{put_file}' <id: {FILE_ID}>\n      With MIME type:\n      * 'text/plain'\n\n---\n\n    Code\n      write_utf8(second_put)\n    Output\n      i A Drive file already exists at this path. Calling `drive_update()`.\n      File updated:\n      * '{put_file}' <id: {FILE_ID}>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_reveal.md",
    "content": "# drive_reveal() works\n\n    Code\n      print(out <- drive_reveal(dat, \"starred\")[c(\"name\", \"starred\")])\n    Output\n      # A tibble: 3 x 2\n        name                                   starred\n        <chr>                                  <lgl>  \n      1 i-am-a-google-doc-TEST-drive_reveal    FALSE  \n      2 i-have-a-description-TEST-drive_reveal FALSE  \n      3 i-am-starred-TEST-drive_reveal         TRUE   \n\n---\n\n    Code\n      print(out <- drive_reveal(dat, \"description\")[c(\"name\", \"description\")])\n    Output\n      # A tibble: 3 x 2\n        name                                   description \n        <chr>                                  <chr>       \n      1 i-am-a-google-doc-TEST-drive_reveal    <NA>        \n      2 i-have-a-description-TEST-drive_reveal description!\n      3 i-am-starred-TEST-drive_reveal         <NA>        \n\n---\n\n    Code\n      print(out <- drive_reveal(dat, \"mimeType\")[c(\"name\", \"mime_type\")])\n    Output\n      # A tibble: 3 x 2\n        name                                   mime_type                           \n        <chr>                                  <chr>                               \n      1 i-am-a-google-doc-TEST-drive_reveal    application/vnd.google-apps.document\n      2 i-have-a-description-TEST-drive_reveal text/plain                          \n      3 i-am-starred-TEST-drive_reveal         text/plain                          \n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_share.md",
    "content": "# drive_share() errors for invalid `role` or `type`\n\n    Code\n      drive_share(dribble(), role = \"chef\")\n    Condition\n      Error in `match.arg()`:\n      ! 'arg' should be one of \"reader\", \"commenter\", \"writer\", \"fileOrganizer\", \"owner\", \"organizer\"\n\n---\n\n    Code\n      drive_share(dribble(), type = \"pet\")\n    Condition\n      Error in `match.arg()`:\n      ! 'arg' should be one of \"user\", \"group\", \"domain\", \"anyone\"\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_update.md",
    "content": "# drive_update() errors if local media does not exist\n\n    Code\n      drive_update(dribble(), \"nope123\")\n    Condition\n      Error in `drive_update()`:\n      ! No file exists at the local `media` path:\n      x 'nope123'\n\n# drive_update() informatively errors if the path does not exist\n\n    Code\n      drive_update(nm_(\"does-not-exist\"), system.file(\"DESCRIPTION\"))\n    Condition\n      Error in `confirm_single_file()`:\n      ! `file` does not identify at least one Drive file.\n\n# drive_update() informatively errors if the path is not unique\n\n    Code\n      drive_update(nm_(\"not-unique\"), system.file(\"DESCRIPTION\"))\n    Condition\n      Error in `confirm_single_file()`:\n      ! `file` identifies more than one Drive file.\n\n# no op if no media, no metadata\n\n    Code\n      out <- drive_update(nm_(\"update-fodder\"))\n    Message\n      ! No updates specified.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/drive_upload.md",
    "content": "# drive_upload() detects non-existent file\n\n    Code\n      drive_upload(\"no-such-file\", \"File does not exist\")\n    Condition\n      Error in `drive_upload()`:\n      ! No file exists at the local `media` path:\n      x 'no-such-file'\n\n# drive_upload() can convert local markdown to a Doc\n\n    Code\n      write_utf8(drive_upload_message)\n    Output\n      Local file:\n      * '{file_to_upload}'\n      Uploaded into Drive file:\n      * '{upload_name}' <id: {FILE_ID}>\n      With MIME type:\n      * 'application/vnd.google-apps.document'\n\n"
  },
  {
    "path": "tests/testthat/_snaps/request_generate.md",
    "content": "# request_generate() errors for unrecognized parameters\n\n    Code\n      (expect_error(request_generate(endpoint = \"drive.files.list\", params = params,\n        token = NULL), class = \"gargle_error_bad_params\"))\n    Output\n      <error/gargle_error_bad_params>\n      Error in `gargle::request_develop()`:\n      ! These parameters are unknown:\n      x 'chicken'\n      x 'bunny'\n      i API endpoint: 'drive.files.list'\n\n"
  },
  {
    "path": "tests/testthat/_snaps/shared_drives.md",
    "content": "# new_corpus() checks type and length, if not-NULL\n\n    Code\n      new_corpus(driveId = c(\"1\", \"2\"))\n    Condition\n      Error in `new_corpus()`:\n      ! length(driveId) == 1 is not TRUE\n\n---\n\n    Code\n      new_corpus(corpora = c(\"a\", \"b\"))\n    Condition\n      Error in `new_corpus()`:\n      ! is_string(corpora) is not TRUE\n\n---\n\n    Code\n      new_corpus(includeItemsFromAllDrives = c(TRUE, FALSE))\n    Condition\n      Error in `new_corpus()`:\n      ! length(includeItemsFromAllDrives) == 1 is not TRUE\n\n# `corpora` is checked for validity\n\n    Code\n      shared_drive_params(corpora = \"foo\")\n    Condition\n      Error in `validate_corpora()`:\n      ! Invalid value for `corpus`:\n      x 'foo'\n      These are the only acceptable values:\n      * 'user'\n      * 'drive'\n      * 'allDrives'\n      * 'domain'\n\n# `corpora = \"drive\"` requires shared drive specification\n\n    Code\n      shared_drive_params(corpora = \"drive\")\n    Condition\n      Error in `rationalize_corpus()`:\n      ! When `corpus = \"drive\"`, you must also specify the `shared_drive`.\n\n# `corpora != \"drive\"` rejects shared drive specification\n\n    Code\n      shared_drive_params(corpora = \"user\", driveId = \"123\")\n    Condition\n      Error in `rationalize_corpus()`:\n      ! When `corpus != \"drive\"`, you must not specify a `shared_drive`.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/shortcut.md",
    "content": "# shortcut_create() works\n\n    Code\n      write_utf8(shortcut_create_message)\n    Output\n      Created Drive file:\n      * '{sc_name}' <id: {FILE_ID}>\n      With MIME type:\n      * 'application/vnd.google-apps.shortcut'\n\n# shortcut_create() requires `name` to control `overwrite`\n\n    Code\n      shortcut_create(nm_(\"top-level-file\"), overwrite = FALSE)\n    Condition\n      Error in `shortcut_create()`:\n      ! You must specify the shortcut's `name` in order to specify `overwrite` behaviour.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/utils-paths.md",
    "content": "# root_folder() and root_id() work\n\n    Code\n      root_folder()\n    Output\n      # A dribble: 1 x 3\n        name     id                  drive_resource   \n        <chr>    <drv_id>            <list>           \n      1 My Drive 0AK935f1rlmIZUk9PVA <named list [33]>\n\n---\n\n    Code\n      root_id()\n    Output\n      <drive_id[1]>\n      [1] 0AK935f1rlmIZUk9PVA\n\n# rootize_path() errors for leading slash\n\n    Code\n      rootize_path(\"/\")\n    Condition\n      Error in `rootize_path()`:\n      ! googledrive does not allow paths to start with `/`\n\n# partition_path() fails for bad input\n\n    Code\n      partition_path(letters)\n    Condition\n      Error in `partition_path()`:\n      ! is_string(path) is not TRUE\n\n---\n\n    Code\n      partition_path(dribble())\n    Condition\n      Error in `partition_path()`:\n      ! is_string(path) is not TRUE\n\n---\n\n    Code\n      partition_path(as_id(\"123\"))\n    Condition\n      Error in `partition_path()`:\n      ! is_string(path) is not TRUE\n\n# rationalize_path_name() errors for bad `name`, before hitting API\n\n    Code\n      rationalize_path_name(name = letters)\n    Condition\n      Error in `rationalize_path_name()`:\n      ! is_string(name) is not TRUE\n\n"
  },
  {
    "path": "tests/testthat/_snaps/utils-ui.md",
    "content": "# warn_for_verbose() warns for `verbose = FALSE` w/ good message\n\n    Code\n      drive_something()\n    Condition\n      Warning:\n      The `verbose` argument of `drive_something()` is deprecated as of googledrive 2.0.0.\n      i Set `options(googledrive_quiet = TRUE)` to suppress all googledrive messages.\n      i For finer control, use `local_drive_quiet()` or `with_drive_quiet()`.\n      i googledrive's `verbose` argument will be removed in the future.\n\n# warn_for_verbose(FALSE) makes googledrive quiet, in scope\n\n    Code\n      drive_bullets(\"chatty before\")\n    Message\n      chatty before\n    Code\n      drive_something()\n      drive_bullets(\"chatty after\")\n    Message\n      chatty after\n\n"
  },
  {
    "path": "tests/testthat/driver.R",
    "content": "# this script extracts code from all individual test files to do:\n#   * test setup = create the files/folders our tests expect to find on Drive\n#   * test cleanup = delete the above files/folder from Drive\n# execute this to get two R scripts:\n#   * all-test-setup.R\n#   * all-test-clean.R\n\nlibrary(purrr)\nlibrary(glue)\nlibrary(testthat)\n\n## grabs code from two chunks: 'nm_fun' and chunk ('clean' or 'setup')\ndo_one <- function(r_file, chunk) {\n  knitr::read_chunk(r_file)\n  out <- c(\n    knitr:::knit_code$get(\"nm_fun\"),\n    knitr:::knit_code$get(chunk)\n  )\n  knitr:::knit_code$restore()\n  if (length(out) == 0) {\n    return(NULL)\n  }\n  c(paste(\"#' ##\", basename(r_file)), out)\n}\n\ntest_files <- list.files(\n  path = test_path(),\n  pattern = \"test-.+\\\\.R\",\n  full.names = TRUE\n)\n\nclean_code <- test_files |>\n  map(do_one, chunk = \"clean\") |>\n  compact()\nsetup_code <- test_files |>\n  map(do_one, chunk = \"setup\") |>\n  compact()\n\nheader <- \"\n#' ---\n#' title: googledrive test {action}\n#' date: '`r format(Sys.time())`'\n#' output: html_document\n#' ---\n\n#' This script aggregates the test-related {action} code from all test files.\n\n#+ setup, include = FALSE, cache = FALSE\nknitr::opts_chunk$set(collapse = TRUE, comment = '#>', error = TRUE)\n\n#+ body\npkgload::load_all(here::here())\nsource(here::here('tests', 'testthat', 'helper.R'))\ndrive_user()\n\n## change this to TRUE when you are really ready to do this!\n{ACTION} <- FALSE\n\n\"\n\nwriteLines(\n  c(\n    glue_data(list(action = \"clean\", ACTION = \"CLEAN\"), header),\n    unlist(clean_code)\n  ),\n  test_path(\"all-test-clean.R\")\n)\nwriteLines(\n  c(\n    glue_data(list(action = \"setup\", ACTION = \"SETUP\"), header),\n    unlist(setup_code)\n  ),\n  test_path(\"all-test-setup.R\")\n)\n"
  },
  {
    "path": "tests/testthat/helper.R",
    "content": "auth_success <- tryCatch(\n  drive_auth_testing(),\n  googledrive_auth_internal_error = function(e) NULL\n)\nif (!isTRUE(auth_success)) {\n  drive_bullets(c(\n    \"!\" = \"Internal auth failed; calling {.fun drive_deauth}.\"\n  ))\n  drive_deauth()\n}\n\nskip_if_no_token <- function() {\n  testthat::skip_if_not(drive_has_token(), \"No Drive token\")\n}\n\n# usage:\n# test_fixture(\"something.rds\")\ntest_fixture <- function(name) testthat::test_path(\"test-fixtures\", name)\n\ndefer_drive_rm <- function(..., env = parent.frame()) {\n  withr::defer(\n    with_drive_quiet(drive_rm(...)),\n    envir = env\n  )\n}\n\n# used to replace volatile filepaths and file ids in snapshot tests\n# may eventually be unnecessary, depending on how this works out:\n# https://github.com/r-lib/testthat/issues/1345\n# @param replace_me Should be a bare symbol that holds a fixed string\nscrub_filepath <- function(message, replace_me) {\n  x <- ensym(replace_me)\n  gsub(replace_me, paste0(\"{\", as_string(x), \"}\"), message, fixed = TRUE)\n}\n\nscrub_file_id <- function(message) {\n  gsub(\"<id: [a-zA-Z0-9_-]+>\", \"<id: {FILE_ID}>\", message, perl = TRUE)\n}\n\nexpect_dribble <- function(x) {\n  expect_s3_class(x, \"dribble\")\n}\n\nexpect_bare_tibble <- function(x) {\n  expect_s3_class(x, c(\"tbl_df\", \"tbl\", \"data.frame\"), exact = TRUE)\n}\n"
  },
  {
    "path": "tests/testthat/setup-testing.R",
    "content": "CLEAN <- SETUP <- FALSE\nisFALSE <- function(x) identical(x, FALSE)\n\nwith_drive_loud({\n  nm_ <- nm_fun(\"TEST-drive_something\", user_run = FALSE)\n  me_ <- nm_fun(\"TEST-drive_something\")\n\n  drive_bullets(c(\n    \"Test file naming scheme:\",\n    \"*\" = nm_(\"foo\"),\n    \"*\" = me_(\"foo\")\n  ))\n  flush.console()\n  Sys.sleep(1) # without this, the message still gets mixed in w/ test results\n})\n"
  },
  {
    "path": "tests/testthat/test-camelCase.R",
    "content": "test_that(\"snake_case() works\", {\n  expect_equal(snake_case(\"name\"), \"name\")\n  expect_equal(snake_case(\"drive_resource\"), \"drive_resource\")\n\n  expect_equal(snake_case(\"mimeType\"), \"mime_type\")\n  expect_equal(snake_case(\"viewedByMeTime\"), \"viewed_by_me_time\")\n  expect_equal(snake_case(\"md5Checksum\"), \"md5_checksum\")\n})\n"
  },
  {
    "path": "tests/testthat/test-compat-dplyr.R",
    "content": "# based on https://github.com/tidymodels/workflowsets/blob/main/tests/testthat/test-compat-dplyr.R\n\n# ---- other ----\nif (FALSE) {\n  ## how the test file was created\n  saveRDS(\n    drive_find(n_max = 10),\n    test_fixture(\"just_a_dribble.rds\"),\n    version = 2\n  )\n}\n\n# dplyr_reconstruct() ----\n\ntest_that(\"dplyr_reconstruct() returns a dribble when it should\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(x)\n  expect_identical(dplyr::dplyr_reconstruct(x, x), x)\n})\n\ntest_that(\"dplyr_reconstruct() returns dribble when row slicing\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  row1 <- x[1, ]\n  row0 <- x[0, ]\n\n  expect_dribble(dplyr::dplyr_reconstruct(row1, x))\n  expect_dribble(dplyr::dplyr_reconstruct(row0, x))\n})\n\ntest_that(\"dplyr_reconstruct() returns bare tibble if dribble-ness is lost\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  col <- x[1]\n  expect_bare_tibble(dplyr::dplyr_reconstruct(col, x))\n})\n\n# dplyr_col_modify() ----\n\ntest_that(\"can add columns and retain dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  cols <- list(x = rep(1, vec_size(x)))\n\n  result <- dplyr::dplyr_col_modify(x, cols)\n\n  expect_dribble(result)\n  expect_identical(result$x, cols$x)\n})\n\ntest_that(\"modifying dribble columns removes dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  cols <- list(name = rep(1L, vec_size(x)))\n\n  result <- dplyr::dplyr_col_modify(x, cols)\n\n  expect_bare_tibble(result)\n  expect_identical(result$name, cols$name)\n\n  cols <- list(drive_resource = rep(list(a = \"a\"), vec_size(x)))\n\n  result <- dplyr::dplyr_col_modify(x, cols)\n\n  expect_bare_tibble(result)\n  expect_identical(result$drive_resource, cols$drive_resource)\n})\n\ntest_that(\"replacing dribble col with the exact same col retains dribble-ness\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  cols <- list(id = x$id)\n\n  result <- dplyr::dplyr_col_modify(x, cols)\n\n  expect_dribble(result)\n  expect_identical(result, x)\n})\n\n# dplyr_row_slice() ----\n\ntest_that(\"row slicing generally keeps the dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(dplyr::dplyr_row_slice(x, 0))\n  expect_dribble(dplyr::dplyr_row_slice(x, 3))\n})\n\ntest_that(\"dribble class is kept if row order is changed\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  loc <- rev(seq_len(nrow(x)))\n  expect_dribble(dplyr::dplyr_row_slice(x, loc))\n})\n\n# bind_rows() ----\n\ntest_that(\"bind_rows() can keep dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(dplyr::bind_rows(x[1:2, ], x[3, ]))\n})\n\n# bind_cols() ----\n\ntest_that(\"bind_cols() can keep dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  y <- tibble(x = rep(1, vec_size(x)))\n  expect_dribble(dplyr::bind_cols(x, y))\n})\n\n# summarise() ----\n\ntest_that(\"summarise() always drops the dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_bare_tibble(dplyr::summarise(x, y = 1))\n  expect_bare_tibble(dplyr::summarise(\n    x,\n    name = name[1],\n    id = id[1],\n    drive_resource = drive_resource[1]\n  ))\n})\n\n# group_by() ----\n\ntest_that(\"group_by() always returns a bare grouped-df or bare tibble\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_bare_tibble(dplyr::group_by(x))\n  expect_s3_class(\n    dplyr::group_by(x, id),\n    c(\"grouped_df\", \"tbl_df\", \"tbl\", \"data.frame\"),\n    exact = TRUE\n  )\n})\n\n# ungroup() ----\n\ntest_that(\"ungroup() returns a dribble\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(dplyr::ungroup(x))\n})\n\n# relocate() ----\n\ntest_that(\"relocate() keeps the dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  x <- dplyr::relocate(x, id)\n  expect_dribble(x)\n})\n\n# distinct() ----\n\ntest_that(\"distinct() keeps the dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(dplyr::distinct(x))\n})\n\n# other dplyr verbs ----\n\ntest_that(\"dribble class can be retained by dplyr verbs\", {\n  skip_if_not_installed(\"dplyr\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(dplyr::arrange(x, name))\n  expect_dribble(dplyr::filter(x, grepl(\"-TEST-\", name)))\n  expect_dribble(dplyr::mutate(x, a = \"a\"))\n  expect_dribble(dplyr::slice(x, 3:4))\n\n  x_augmented <- dplyr::mutate(x, new = name)\n  expect_dribble(dplyr::rename(x_augmented, new2 = new))\n  expect_dribble(dplyr::select(x_augmented, name, id, drive_resource))\n})\n\ntest_that(\"dribble class can be dropped by dplyr verbs\", {\n  skip_if_not_installed(\"dplyr\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_false(inherits(dplyr::mutate(x, name = 1L), \"dribble\"))\n  expect_false(inherits(dplyr::rename(x, HEY = name), \"dribble\"))\n  expect_false(inherits(dplyr::select(x, name, id), \"dribble\"))\n})\n\n# joins ----\n\ntest_that(\"left_join() can keep dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(dplyr::left_join(x, x, by = names(x)))\n\n  y <- tibble(id = x$id[[1]], x = 1)\n  expect_dribble(dplyr::left_join(x, y, by = \"id\"))\n})\n\ntest_that(\"right_join() can keep dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(dplyr::right_join(x, x, by = names(x)))\n\n  y <- dplyr::mutate(dplyr::select(x, id), x = 1)\n  expect_dribble(dplyr::right_join(x, y, by = \"id\"))\n})\n\ntest_that(\"right_join() restores to the type of first input\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  y <- tibble(id = x$id[[1]], x = 1)\n  # technically dribble structure is intact, but `y` is a bare tibble!\n  expect_bare_tibble(dplyr::right_join(y, x, by = \"id\"))\n})\n\ntest_that(\"full_join() can keep dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(dplyr::full_join(x, x, by = names(x)))\n})\n\ntest_that(\"anti_join() can keep dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  y <- tibble(id = x$id[[1]])\n  result <- dplyr::anti_join(x, y, by = \"id\")\n  expect_equal(nrow(result), nrow(x) - 1)\n  expect_dribble(result)\n})\n\ntest_that(\"semi_join() can keep dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(dplyr::semi_join(x, x, by = names(x)))\n})\n\ntest_that(\"nest_join() can keep dribble class\", {\n  skip_if_not_installed(\"dplyr\", \"1.0.0\")\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  y <- dplyr::mutate(x, foo = \"bar\")\n  expect_dribble(dplyr::nest_join(x, y, by = names(x)))\n})\n"
  },
  {
    "path": "tests/testthat/test-compat-vctrs.R",
    "content": "# based on https://github.com/tidymodels/workflowsets/blob/main/tests/testthat/test-compat-dplyr.R\n\n# vec_restore() ----\n\ntest_that(\"vec_restore() returns a dribble when it should\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_identical(vec_restore(x, x), x)\n  expect_dribble(vec_restore(x, x))\n})\n\ntest_that(\"vec_restore() returns dribble when row slicing\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  row1 <- x[1, ]\n  row0 <- x[0, ]\n\n  expect_dribble(vec_restore(row1, x))\n  expect_dribble(vec_restore(row0, x))\n})\n\ntest_that(\"vec_restore() returns bare tibble if `x` loses dribble cols\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  col <- x[1]\n  expect_bare_tibble(vec_restore(col, x))\n})\n\n# vec_ptype2() ----\n\ntest_that(\"vec_ptype2() is working\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  x2 <- x\n  x2$y <- 1\n  x3 <- x\n  x3$z <- 2\n\n  tbl <- tibble(x = 1)\n  df <- data.frame(x = 1)\n\n  # dribble-dribble\n  expect_identical(vec_ptype2(x, x), vec_slice(x, NULL))\n  expect_identical(\n    vec_ptype2(x2, x3),\n    new_dribble(df_ptype2(x2, x3))\n  )\n\n  # dribble-tbl_df\n  expect_identical(\n    vec_ptype2(x, tbl),\n    vec_ptype2(new_tibble0(x), tbl)\n  )\n  expect_identical(\n    vec_ptype2(tbl, x),\n    vec_ptype2(tbl, new_tibble0(x))\n  )\n\n  # dribble-df\n  expect_identical(\n    vec_ptype2(x, df),\n    vec_ptype2(new_tibble0(x), df)\n  )\n  expect_identical(\n    vec_ptype2(df, x),\n    vec_ptype2(df, new_tibble0(x))\n  )\n})\n\n# vec_cast() ----\n\ntest_that(\"vec_cast() is working\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  x2 <- x\n  x2$y <- 1\n  x3 <- x\n  x3$z <- 2\n\n  tbl <- new_tibble0(x)\n  df <- as.data.frame(tbl)\n\n  # dribble-dribble\n  expect_identical(vec_cast(x, x), x)\n\n  x2_expect <- x\n  x2_expect$y <- NA_real_\n  expect_identical(vec_cast(x, x2), x2_expect)\n\n  expect_error(\n    vec_cast(x2, x3),\n    class = \"vctrs_error_cast_lossy_dropped\"\n  )\n\n  # dribble-tbl_df\n  expect_identical(vec_cast(x, tbl), tbl)\n  expect_error(vec_cast(tbl, x), class = \"vctrs_error_incompatible_type\")\n\n  # dribble-df\n  expect_identical(vec_cast(x, df), df)\n  expect_error(vec_cast(df, x), class = \"vctrs_error_incompatible_type\")\n})\n\n# vctrs methods ----\n\ntest_that(\"vec_ptype() returns a dribble\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(vec_ptype(x))\n})\n\ntest_that(\"vec_slice() generally returns a dribble\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_dribble(vec_slice(x, 0))\n  expect_dribble(vec_slice(x, 1:2))\n})\n\ntest_that(\"vec_c() works\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  tbl <- new_tibble0(x)\n\n  expect_identical(vec_c(x), x)\n  expect_identical(vec_c(x, x), new_dribble(vec_c(tbl, tbl)))\n  expect_identical(vec_c(x[1:5, ], x[6:10, ]), x)\n})\n\ntest_that(\"vec_rbind() works\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  tbl <- new_tibble0(x)\n\n  expect_identical(vec_rbind(x), x)\n  expect_identical(\n    vec_rbind(x, x),\n    new_dribble(vec_rbind(tbl, tbl))\n  )\n  expect_identical(vec_rbind(x[1:5, ], x[6:10, ]), x)\n})\n\ntest_that(\"vec_cbind() returns a bare tibble\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  tbl <- new_tibble0(x)\n\n  # Unlike vec_c() and vec_rbind(), the prototype of the output comes\n  # from doing `x[0]`, which will drop the dribble class\n  expect_identical(vec_cbind(x), vec_cbind(tbl))\n  expect_identical(\n    vec_cbind(x, x, .name_repair = \"minimal\"),\n    vec_cbind(tbl, tbl, .name_repair = \"minimal\")\n  )\n  expect_identical(\n    vec_cbind(x, tbl, .name_repair = \"minimal\"),\n    vec_cbind(tbl, tbl, .name_repair = \"minimal\")\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-deprecated.R",
    "content": "test_that(\"drive_auth_config() is deprecated\", {\n  withr::local_options(lifecycle_verbosity = \"warning\")\n  expect_snapshot(\n    error = TRUE,\n    drive_auth_config()\n  )\n})\n\ntest_that(\"drive_oauth_app() is deprecated\", {\n  withr::local_options(lifecycle_verbosity = \"warning\")\n  expect_snapshot(absorb <- drive_oauth_app())\n})\n\ntest_that(\"drive_auth_configure(app =) is deprecated in favor of client\", {\n  withr::local_options(lifecycle_verbosity = \"warning\")\n  (original_client <- drive_oauth_client())\n  withr::defer(drive_auth_configure(client = original_client))\n\n  client <- gargle::gargle_oauth_client_from_json(\n    system.file(\n      \"extdata\",\n      \"client_secret_installed.googleusercontent.com.json\",\n      package = \"gargle\"\n    ),\n    name = \"test-client\"\n  )\n  expect_snapshot(\n    drive_auth_configure(app = client)\n  )\n  expect_equal(drive_oauth_client()$name, \"test-client\")\n  expect_equal(drive_oauth_client()$id, \"abc.apps.googleusercontent.com\")\n})\n"
  },
  {
    "path": "tests/testthat/test-dribble.R",
    "content": "# ---- tests ----\n\ntest_that(\"tbl_sum.dribble method works\", {\n  d <- new_dribble(\n    tibble(\n      name = letters[1:2],\n      id = letters[2:1],\n      drive_resource = list(list(kind = \"drive#file\"))\n    )\n  )\n  expect_snapshot(print(d))\n})\n\ntest_that(\"dribble() creates empty dribble\", {\n  expect_dribble(dribble())\n  expect_equal(nrow(dribble()), 0)\n})\n\ntest_that(\"new_dribble() requires a list and adds the dribble class\", {\n  expect_snapshot(new_dribble(1:3), error = TRUE)\n  expect_dribble(new_dribble(list(\n    name = \"NAME\",\n    id = \"ID\",\n    drive_resource = list(\"DRIVE_RESOURCE\")\n  )))\n})\n\ntest_that(\"validate_dribble() checks class, var names, var types\", {\n  expect_snapshot(validate_dribble(\"a\"), error = TRUE)\n\n  ## wrong type\n  d <- dribble()\n  d$id <- numeric()\n  expect_snapshot(validate_dribble(d), error = TRUE)\n  d$name <- logical()\n  expect_snapshot(validate_dribble(d), error = TRUE)\n\n  ## missing a required variable\n  d <- dribble()\n  d$name <- NULL\n  expect_snapshot(validate_dribble(d), error = TRUE)\n  d$id <- NULL\n  expect_snapshot(validate_dribble(d), error = TRUE)\n\n  ## list-col elements do not have `kind = \"drive#file\"`\n  d <- new_dribble(\n    tibble(\n      name = \"a\",\n      id = \"1\",\n      drive_resource = list(kind = \"whatever\")\n    )\n  )\n  expect_snapshot(validate_dribble(d), error = TRUE)\n})\n\ntest_that(\"as_tibble() drops the dribble class\", {\n  expect_false(inherits(as_tibble(dribble()), \"dribble\"))\n})\n\ntest_that(\"`[` retains dribble class when possible\", {\n  d <- new_dribble(\n    tibble(\n      name = letters[1:4],\n      id = letters[4:1],\n      drive_resource = list(list(kind = \"drive#file\"))\n    )\n  )\n  expect_dribble(d)\n  expect_dribble(d[1, ])\n  expect_dribble(d[1:2, ])\n  expect_dribble(d[1:3])\n  d$foo <- \"foo\"\n  expect_dribble(d)\n  expect_dribble(d[-4])\n})\n\ntest_that(\"`[` drops dribble class when not valid\", {\n  d <- new_dribble(\n    tibble(\n      name = letters[1:4],\n      id = letters[4:1],\n      drive_resource = list(list(kind = \"drive#file\"))\n    )\n  )\n  expect_dribble(d)\n  expect_false(inherits(d[1], \"dribble\"))\n  expect_false(inherits(d[, 1], \"dribble\"))\n})\n\ntest_that(\"dribble nrow checkers work\", {\n  d <- dribble()\n  expect_true(no_file(d))\n  expect_false(single_file(d))\n  expect_false(some_files(d))\n  expect_snapshot(confirm_single_file(d), error = TRUE)\n  expect_snapshot(confirm_some_files(d), error = TRUE)\n\n  d <- new_dribble(\n    tibble(\n      name = \"a\",\n      id = \"b\",\n      drive_resource = list(list(kind = \"drive#file\"))\n    )\n  )\n  expect_false(no_file(d))\n  expect_true(single_file(d))\n  expect_true(some_files(d))\n  expect_identical(confirm_single_file(d), d)\n  expect_identical(confirm_some_files(d), d)\n\n  d <- d[c(1, 1), ]\n  expect_false(no_file(d))\n  expect_false(single_file(d))\n  expect_true(some_files(d))\n  expect_snapshot(confirm_single_file(d), error = TRUE)\n  expect_identical(confirm_some_files(d), d)\n})\n\ntest_that(\"is_folder() works\", {\n  expect_identical(is_folder(dribble()), logical(0))\n  d <- new_dribble(\n    tibble::tribble(\n      ~name,\n      ~id,\n      ~drive_resource,\n      \"a\",\n      \"aa\",\n      list(mimeType = \"application/vnd.google-apps.folder\"),\n      \"b\",\n      \"bb\",\n      list(mimeType = \"foo\")\n    )\n  )\n  expect_identical(is_folder(d), c(TRUE, FALSE))\n})\n\ntest_that(\"as_dribble(NULL) returns empty dribble\", {\n  expect_identical(as_dribble(), dribble())\n})\n\ntest_that(\"as_dribble() default method handles unsuitable input\", {\n  expect_snapshot(as_dribble(1.3), error = TRUE)\n  expect_snapshot(as_dribble(TRUE), error = TRUE)\n})\n\ntest_that(\"as_dribble.list() works for good input\", {\n  drib_lst <- list(\n    name = \"name\",\n    id = \"id\",\n    kind = \"drive#file\"\n  )\n  expect_silent(d <- as_dribble(list(drib_lst)))\n  expect_dribble(d)\n})\n\ntest_that(\"as_dribble.list() catches bad input\", {\n  ## not testing error messages, as_dribble.list() intended for internal use\n  drib_lst <- list(\n    name = \"name\"\n  )\n  expect_snapshot(as_dribble(list(drib_lst)), error = TRUE)\n\n  drib_lst <- list(\n    name = \"name\",\n    id = \"id\",\n    kind = \"whatever\"\n  )\n  expect_snapshot(as_dribble(list(drib_lst)), error = TRUE)\n})\n\ntest_that(\"as_parent() throws specific errors\", {\n  d <- new_dribble(\n    tibble::tibble(\n      name = letters[1:4],\n      id = letters[4:1],\n      drive_resource = list(list(kind = \"drive#file\"))\n    )\n  )\n\n  expect_snapshot(\n    {\n      foo <- d[0, ]\n      as_parent(foo)\n    },\n    error = TRUE\n  )\n\n  expect_snapshot(\n    {\n      foo <- d\n      as_parent(foo)\n    },\n    error = TRUE\n  )\n\n  expect_snapshot(\n    {\n      foo <- d[1, ]\n      as_parent(foo)\n    },\n    error = TRUE\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_auth.R",
    "content": "test_that(\"drive_auth_configure works\", {\n  old_client <- drive_oauth_client()\n  old_api_key <- drive_api_key()\n  withr::defer(\n    drive_auth_configure(client = old_client, api_key = old_api_key)\n  )\n\n  expect_no_error(drive_oauth_client())\n  expect_no_error(drive_api_key())\n\n  expect_snapshot(\n    drive_auth_configure(client = gargle::gargle_client(), path = \"PATH\"),\n    error = TRUE\n  )\n\n  drive_auth_configure(client = gargle::gargle_client())\n  expect_s3_class(drive_oauth_client(), \"gargle_oauth_client\")\n\n  drive_auth_configure(\n    path = system.file(\n      \"extdata\",\n      \"client_secret_installed.googleusercontent.com.json\",\n      package = \"gargle\"\n    )\n  )\n  expect_s3_class(drive_oauth_client(), \"gargle_oauth_client\")\n\n  drive_auth_configure(client = NULL)\n  expect_null(drive_oauth_client())\n\n  drive_auth_configure(api_key = \"API_KEY\")\n  expect_identical(drive_api_key(), \"API_KEY\")\n\n  drive_auth_configure(api_key = NULL)\n  expect_null(drive_api_key())\n})\n\n# drive_scopes() ----\ntest_that(\"drive_scopes() reveals Drive scopes\", {\n  expect_snapshot(drive_scopes())\n})\n\ntest_that(\"drive_scopes() substitutes actual scope for short form\", {\n  expect_equal(\n    drive_scopes(c(\n      \"full\",\n      \"drive\",\n      \"drive.readonly\"\n    )),\n    c(\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive\",\n      \"https://www.googleapis.com/auth/drive.readonly\"\n    )\n  )\n})\n\ntest_that(\"drive_scopes() passes unrecognized scopes through\", {\n  expect_equal(\n    drive_scopes(c(\n      \"email\",\n      \"drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/cloud-platform\"\n    )),\n    c(\n      \"email\",\n      \"https://www.googleapis.com/auth/drive.metadata.readonly\",\n      \"https://www.googleapis.com/auth/cloud-platform\"\n    )\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_browse.R",
    "content": "# ---- other ----\nif (FALSE) {\n  # how the test file was created\n  # using shared-drive-capable token ...\n  files <- drive_find(corpus = \"allDrives\", n_max = 10)\n  sds <- shared_drive_find()\n  x <- vec_rbind(files, sds)\n  saveRDS(x, test_fixture(\"mix_of_files_and_teamdrives.rds\"), version = 2)\n}\n\n# ---- tests ----\ntest_that(\"drive_link() extracts links for files and Team Drives, alike\", {\n  x <- readRDS(test_fixture(\"mix_of_files_and_teamdrives.rds\"))\n  links <- drive_link(x)\n  expect_true(all(grepl(\"^https://.*\\\\.google\\\\.com/\", links)))\n  expect_identical(as_id(links), as_id(x))\n})\n\ntest_that(\"drive_browse() passes links through\", {\n  skip_if(interactive())\n  x <- readRDS(test_fixture(\"mix_of_files_and_teamdrives.rds\"))\n  expect_identical(drive_browse(x), drive_link(x))\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_cp.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-drive_cp\")\nnm_ <- nm_fun(\"TEST-drive_cp\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"i-am-a-folder\"),\n    nm_(\"copy-to-folder-shortcut\"),\n    nm_(\"not-unique-folder\"),\n    nm_(\"i-am-a-file\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_mkdir(nm_(\"i-am-a-folder\"))\n  shortcut_create(nm_(\"i-am-a-folder\"), name = nm_(\"copy-to-folder-shortcut\"))\n  drive_mkdir(name = nm_(\"not-unique-folder\"), path = googledrive:::root_id())\n  drive_mkdir(name = nm_(\"not-unique-folder\"), path = googledrive:::root_id())\n  drive_upload(\n    system.file(\"DESCRIPTION\"),\n    nm_(\"i-am-a-file\")\n  )\n}\n\n# ---- tests ----\ntest_that(\"drive_cp() can copy file in place\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  cp_name <- me_(\"i-am-a-file\")\n  defer_drive_rm(cp_name)\n\n  file <- drive_get(nm_(\"i-am-a-file\"))\n\n  local_drive_loud_and_wide()\n  drive_cp_message <- capture.output(\n    cp_file <- drive_cp(file, name = cp_name),\n    type = \"message\"\n  )\n  drive_cp_message <- drive_cp_message |>\n    scrub_filepath(cp_name) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_cp_message)\n  )\n\n  expect_identical(cp_file$name, cp_name)\n\n  ## should have the same parent\n  expect_identical(\n    file$drive_resource[[1]]$parents,\n    cp_file$drive_resource[[1]]$parents\n  )\n})\n\ntest_that(\"drive_cp() can copy a file into a different folder\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  cp_name <- me_(\"i-am-a-file\")\n  defer_drive_rm(cp_name)\n\n  file <- drive_get(nm_(\"i-am-a-file\"))\n  folder <- drive_get(nm_(\"i-am-a-folder\"))\n\n  local_drive_loud_and_wide()\n  drive_cp_message <- capture.output(\n    cp_file <- drive_cp(file, path = folder, name = cp_name),\n    type = \"message\"\n  )\n  drive_cp_message <- drive_cp_message |>\n    scrub_filepath(cp_name) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_cp_message)\n  )\n  expect_identical(cp_file$name, cp_name)\n\n  # should have folder as parent\n  file <- drive_reveal(cp_file, \"parent\")\n  expect_identical(file$id_parent, folder$id)\n})\n\ntest_that(\"drive_cp() doesn't tolerate ambiguity in `path`\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  file <- drive_get(nm_(\"i-am-a-file\"))\n  # `path` lacks trailing slash, so ambiguous if it's parent folder or\n  # folder + name\n  expect_snapshot(\n    drive_cp(file, nm_(\"i-am-a-folder\")),\n    error = TRUE\n  )\n})\n\ntest_that(\"drive_cp() errors if asked to copy a folder\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  expect_snapshot(\n    drive_cp(nm_(\"i-am-a-folder\")),\n    error = TRUE\n  )\n})\n\ntest_that(\"drive_cp() takes name, assumes path is folder if both are specified\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  cp_name <- me_(\"file-name\")\n  defer_drive_rm(cp_name)\n  local_drive_loud_and_wide()\n\n  # if given `path` and `name`, assumes `path` is a folder\n  # the message capture trick is necessary because cp_name includes {user}\n  drive_cp_message <- capture.output(\n    file_cp <- drive_cp(\n      nm_(\"i-am-a-file\"),\n      path = nm_(\"i-am-a-folder\"),\n      name = cp_name\n    ),\n    type = \"message\"\n  )\n  drive_cp_message <- drive_cp_message |>\n    scrub_filepath(cp_name) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_cp_message)\n  )\n\n  expect_identical(file_cp$name, me_(\"file-name\"))\n\n  # error if `path` is not a folder\n  expect_snapshot(\n    file_cp <- drive_cp(\n      nm_(\"i-am-a-file\"),\n      path = nm_(\"file-name\"),\n      name = nm_(\"file-name\")\n    ),\n    error = TRUE\n  )\n\n  # error if `path` doesn't uniquely identify one folder/shared drive\n  expect_snapshot(\n    file_cp <- drive_cp(\n      nm_(\"i-am-a-file\"),\n      append_slash(nm_(\"not-unique-folder\"))\n    ),\n    error = TRUE\n  )\n})\n\ntest_that(\"drive_cp() can copy to a folder-shortcut\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  target_parent <- drive_get(nm_(\"i-am-a-folder\"))\n  file_to_copy <- drive_get(nm_(\"i-am-a-file\"))\n\n  cp_name <- me_(\"i-am-a-file\")\n  defer_drive_rm(cp_name)\n\n  out <- drive_cp(\n    file_to_copy,\n    path = nm_(\"copy-to-folder-shortcut\"),\n    name = cp_name\n  )\n  expect_equal(drive_reveal(out, \"parent\")$id_parent, target_parent$id)\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_create.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-drive_create\")\nnm_ <- nm_fun(\"TEST-drive_create\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"create-in-me\"),\n    nm_(\"create-in-folder-shortcut\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_mkdir(nm_(\"create-in-me\"))\n  shortcut_create(nm_(\"create-in-me\"), name = nm_(\"create-in-folder-shortcut\"))\n}\n\n# ---- tests ----\ntest_that(\"drive_create() errors for bad input (before hitting Drive API)\", {\n  expect_snapshot(drive_create(), error = TRUE)\n  expect_snapshot(drive_create(letters), error = TRUE)\n})\n\ntest_that(\"drive_create() errors if parent path does not exist\", {\n  skip_if_no_token()\n  skip_if_offline()\n  expect_snapshot(drive_create(\"a\", path = \"qweruiop\"), error = TRUE)\n})\n\ntest_that(\"drive_create() errors if parent exists but is not a folder\", {\n  skip_if_no_token()\n  skip_if_offline()\n  x <- drive_find(\n    q = \"mimeType != 'application/vnd.google-apps.folder'\",\n    # make sure we don't somehow find a folder-shortcut\n    q = \"mimeType != 'application/vnd.google-apps.shortcut'\",\n    n_max = 1\n  )\n  expect_snapshot(drive_create(\"a\", path = x), error = TRUE)\n})\n\ntest_that(\"drive_create() create specific things in root folder\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  defer_drive_rm(me_(\"docs-in-root\"))\n  out <- drive_create(me_(\"docs-in-root\"), type = \"document\")\n  expect_dribble(out)\n  expect_identical(out$name, me_(\"docs-in-root\"))\n  expect_identical(drive_reveal(out, \"parent\")[[\"id_parent\"]], root_id())\n  expect_identical(\n    drive_reveal(out, \"mime_type\")$mime_type,\n    drive_mime_type(\"document\")\n  )\n\n  defer_drive_rm(me_(\"sheets-in-root\"))\n  out <- drive_create(me_(\"sheets-in-root\"), type = \"spreadsheet\")\n  expect_dribble(out)\n  expect_identical(out$name, me_(\"sheets-in-root\"))\n  expect_identical(drive_reveal(out, \"parent\")[[\"id_parent\"]], root_id())\n  expect_identical(\n    drive_reveal(out, \"mime_type\")$mime_type,\n    drive_mime_type(\"spreadsheet\")\n  )\n\n  defer_drive_rm(me_(\"slides-in-root\"))\n  out <- drive_create(me_(\"slides-in-root\"), type = \"presentation\")\n  expect_dribble(out)\n  expect_identical(out$name, me_(\"slides-in-root\"))\n  expect_identical(drive_reveal(out, \"parent\")[[\"id_parent\"]], root_id())\n  expect_identical(\n    drive_reveal(out, \"mime_type\")$mime_type,\n    drive_mime_type(\"presentation\")\n  )\n})\n\ntest_that(\"drive_mkdir() creates a folder in root folder\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  defer_drive_rm(me_(\"folder-in-root\"))\n  out <- drive_mkdir(me_(\"folder-in-root\"))\n  expect_dribble(out)\n  expect_identical(out$name, me_(\"folder-in-root\"))\n  expect_identical(drive_reveal(out, \"parent\")[[\"id_parent\"]], root_id())\n  expect_identical(\n    drive_reveal(out, \"mime_type\")$mime_type,\n    drive_mime_type(\"folder\")\n  )\n})\n\ntest_that(\"drive_create() accepts parent folder given as dribble\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(me_(\"a\"))\n\n  PARENT <- drive_get(nm_(\"create-in-me\"))\n  out <- drive_create(me_(\"a\"), PARENT)\n  expect_dribble(out)\n  expect_identical(out$name, me_(\"a\"))\n  expect_identical(drive_reveal(out, \"parent\")[[\"id_parent\"]], as_id(PARENT))\n})\n\ntest_that(\"drive_create() accepts parent folder given as file id\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(me_(\"b\"))\n\n  PARENT <- drive_get(nm_(\"create-in-me\"))\n  out <- drive_create(me_(\"b\"), as_id(PARENT$id))\n  expect_dribble(out)\n  expect_identical(out$name, me_(\"b\"))\n})\n\ntest_that(\"drive_create() accepts name as part of path\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(me_(\"c\"))\n\n  out <- drive_create(file.path(nm_(\"create-in-me\"), me_(\"c\")))\n  expect_dribble(out)\n  expect_identical(out$name, me_(\"c\"))\n})\n\ntest_that(\"drive_create() parent separately, as a path\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(c(me_(\"e\"), me_(\"f\")))\n\n  # no trailing slash on parent\n  out <- drive_create(me_(\"e\"), path = nm_(\"create-in-me\"))\n  expect_dribble(out)\n  expect_identical(out$name, me_(\"e\"))\n\n  # yes trailing slash on parent\n  out <- drive_create(me_(\"f\"), path = append_slash(nm_(\"create-in-me\")))\n  expect_dribble(out)\n  expect_identical(out$name, me_(\"f\"))\n})\n\ntest_that(\"drive_create() deals with folder-shortcut as path\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(c(me_(\"g\"), me_(\"h\")))\n\n  target_parent_name <- nm_(\"create-in-me\")\n  shortcut_name <- nm_(\"create-in-folder-shortcut\")\n  target_parent <- drive_get(target_parent_name)\n\n  # no trailing slash on parent\n  out <- drive_create(me_(\"g\"), path = shortcut_name)\n  expect_equal(drive_reveal(out, \"parent\")$id_parent, target_parent$id)\n\n  # yes trailing slash on parent\n  out <- drive_create(me_(\"h\"), path = append_slash(shortcut_name))\n  expect_equal(drive_reveal(out, \"parent\")$id_parent, target_parent$id)\n})\n\ntest_that(\"drive_create() accepts metadata via ...\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(me_(\"create-me-in-root\"))\n\n  out <- drive_create(\n    me_(\"create-me-in-root\"),\n    starred = TRUE,\n    description = \"files are amazing\"\n  )\n  expect_dribble(out)\n  expect_identical(nrow(out), 1L)\n  expect_true(out$drive_resource[[1]]$starred)\n  expect_identical(out$drive_resource[[1]]$description, \"files are amazing\")\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_download.R",
    "content": "# ---- nm_fun ----\nnm_ <- nm_fun(\"TEST-drive_download\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"DESC\"),\n    nm_(\"DESC-doc\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_upload(system.file(\"DESCRIPTION\"), nm_(\"DESC\"))\n  drive_upload(\n    system.file(\"DESCRIPTION\"),\n    nm_(\"DESC-doc\"),\n    type = \"document\"\n  )\n  drive_upload(\n    system.file(\n      \"extdata\",\n      \"example_files\",\n      \"markdown.md\",\n      package = \"googledrive\"\n    ),\n    nm_(\"markdown-doc\"),\n    type = \"document\"\n  )\n}\n\n# ---- tests ----\ntest_that(\"drive_download() won't overwrite existing file\", {\n  tmpdir <- withr::local_tempdir()\n  precious_filepath <- paste0(nm_(\"precious\"), \".txt\")\n  write_utf8(\"I exist and I am special\", file.path(tmpdir, precious_filepath))\n  expect_snapshot(\n    withr::with_dir(\n      tmpdir,\n      drive_download(dribble(), path = precious_filepath)\n    ),\n    error = TRUE\n  )\n})\n\ntest_that(\"drive_download() downloads a file and adds local_path column\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  file_to_download <- nm_(\"DESC\")\n  download_filepath <- withr::local_file(\n    tempfile(file_to_download, fileext = \".txt\")\n  )\n\n  local_drive_loud_and_wide()\n  drive_download_message <- capture.output(\n    out <- drive_download(file_to_download, path = download_filepath),\n    type = \"message\"\n  )\n  # the order of scrubbing matters here\n  drive_download_message <- drive_download_message |>\n    scrub_filepath(download_filepath) |>\n    scrub_filepath(file_to_download) |>\n    scrub_file_id()\n\n  expect_snapshot(\n    write_utf8(drive_download_message)\n  )\n\n  expect_true(file.exists(download_filepath))\n  expect_identical(out$local_path, download_filepath)\n})\n\ntest_that(\"drive_download() errors if file does not exist on Drive\", {\n  skip_if_no_token()\n  skip_if_offline()\n  expect_snapshot(drive_download(nm_(\"this-should-not-exist\")), error = TRUE)\n})\n\ntest_that(\"drive_download() converts with explicit `type`\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  file_to_download <- nm_(\"DESC-doc\")\n  tmpdir <- withr::local_tempdir(file_to_download)\n  download_filename <- paste0(file_to_download, \".docx\")\n  local_drive_loud_and_wide()\n\n  drive_download_message <- capture.output(\n    withr::with_dir(\n      tmpdir,\n      drive_download(file = file_to_download, type = \"docx\")\n    ),\n    type = \"message\"\n  )\n  drive_download_message <- drive_download_message |>\n    scrub_filepath(download_filename) |>\n    scrub_filepath(file_to_download) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_download_message)\n  )\n\n  expect_true(file.exists(file.path(tmpdir, download_filename)))\n})\n\ntest_that(\"drive_download() converts with type implicit in `path`\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  file_to_download <- nm_(\"DESC-doc\")\n  tmpdir <- withr::local_tempdir(file_to_download)\n  download_filename <- paste0(file_to_download, \".docx\")\n  local_drive_loud_and_wide()\n\n  drive_download_message <- capture.output(\n    withr::with_dir(\n      tmpdir,\n      drive_download(file = file_to_download, path = download_filename)\n    ),\n    type = \"message\"\n  )\n  drive_download_message <- drive_download_message |>\n    scrub_filepath(download_filename) |>\n    scrub_filepath(file_to_download) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_download_message)\n  )\n\n  expect_true(file.exists(file.path(tmpdir, download_filename)))\n})\n\ntest_that(\"drive_download() converts using default MIME type, if necessary\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  file_to_download <- nm_(\"DESC-doc\")\n  tmpdir <- withr::local_tempdir(file_to_download)\n  download_filename <- paste0(file_to_download, \".docx\")\n  local_drive_loud_and_wide()\n\n  drive_download_message <- capture.output(\n    withr::with_dir(\n      tmpdir,\n      drive_download(file = file_to_download)\n    ),\n    type = \"message\"\n  )\n  drive_download_message <- drive_download_message |>\n    scrub_filepath(download_filename) |>\n    scrub_filepath(file_to_download) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_download_message)\n  )\n\n  expect_true(file.exists(file.path(tmpdir, download_filename)))\n})\n\ntest_that(\"drive_download() can convert a Google Doc to local markdown\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  file_to_download <- nm_(\"markdown-doc\")\n  tmpdir <- withr::local_tempdir(file_to_download)\n  download_filename <- paste0(file_to_download, \".md\")\n  local_drive_loud_and_wide()\n\n  drive_download_message <- capture.output(\n    withr::with_dir(\n      tmpdir,\n      drive_download(file = file_to_download, type = \"md\")\n    ),\n    type = \"message\"\n  )\n  drive_download_message <- drive_download_message %>%\n    scrub_filepath(download_filename) %>%\n    scrub_filepath(file_to_download) %>%\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_download_message)\n  )\n\n  download_filepath <- file.path(tmpdir, download_filename)\n\n  expect_true(file.exists(download_filepath))\n\n  upload_lines <- read_utf8(system.file(\n    \"extdata\",\n    \"example_files\",\n    \"markdown.md\",\n    package = \"googledrive\"\n  ))\n  upload_lines <- upload_lines[upload_lines != \"\"]\n  download_lines <- read_utf8(download_filepath)\n  download_lines <- download_lines[download_lines != \"\"]\n\n  expect_equal(upload_lines, download_lines)\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_endpoints.R",
    "content": "test_that(\"drive_endpoint(s)() work(s)\", {\n  expect_length(drive_endpoints(), length(.endpoints))\n  expect_length(drive_endpoints(c(1, 3, 5)), 3)\n  nms <- names(drive_endpoints())\n  expect_identical(\n    drive_endpoints(c(1, 3, 5)),\n    drive_endpoints(nms[c(1, 3, 5)])\n  )\n  expect_identical(drive_endpoints(2)[[1]], drive_endpoint(2))\n  expect_identical(drive_endpoints(nms[2])[[1]], drive_endpoint(nms[2]))\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_examples.R",
    "content": "test_that(\"drive_examples_remote() lists the remote example files\", {\n  skip_if_offline()\n  skip_on_cran()\n\n  dat <- drive_examples_remote()\n  expect_s3_class(dat, \"dribble\")\n  expect_true(nrow(dat) > 0)\n\n  dat <- drive_examples_remote(\"chicken\")\n  expect_s3_class(dat, \"dribble\")\n  expect_true(nrow(dat) > 0)\n})\n\ntest_that(\"drive_example_remote() errors when >1 match\", {\n  skip_if_offline()\n  skip_on_cran()\n\n  expect_snapshot(\n    drive_example_remote(\"chicken\"),\n    error = TRUE\n  )\n})\n\ntest_that(\"drive_examples_local() lists the local example files\", {\n  all_files <- drive_examples_local()\n  expect_true(all(file.exists(all_files)))\n\n  chicken_files <- drive_examples_local(\"chicken\")\n  expect_match(chicken_files, \"chicken\")\n})\n\ntest_that(\"drive_example_local() errors when >1 match\", {\n  expect_snapshot(\n    drive_example_local(\"chicken\"),\n    error = TRUE\n  )\n})\n\ntest_that(\"drive_examples_local() errors when no match\", {\n  expect_snapshot(\n    drive_examples_local(\"platypus\"),\n    error = TRUE\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_fields.R",
    "content": "# ---- tests ----\ntest_that(\"drive_fields() returns nothing, if no input\", {\n  expect_identical(drive_fields(), character())\n})\n\ntest_that(\"drive_fields(expose()) returns full tibble of Files fields\", {\n  expect_identical(\n    drive_fields(expose()),\n    .drive$files_fields\n  )\n  out <- drive_fields(expose(), resource = \"foo\")\n  expect_identical(out, drive_fields(expose()))\n})\n\ntest_that(\"drive_fields() admits it only knows about Files fields\", {\n  local_drive_loud_and_wide()\n\n  x <- letters[1:6]\n  expect_snapshot(\n    out <- drive_fields(x, resource = \"foo\")\n  )\n  expect_identical(out, x)\n})\n\ntest_that(\"drive_fields() detects bad fields\", {\n  local_drive_loud_and_wide()\n  expect_snapshot(\n    out <- drive_fields(c(\"name\", \"parents\", \"ownedByMe\", \"pancakes!\"))\n  )\n  expect_identical(out, c(\"name\", \"parents\", \"ownedByMe\"))\n})\n\ntest_that(\"prep_fields() concatenates input\", {\n  expect_identical(\n    prep_fields(letters[1:2]),\n    \"files/a,files/b\"\n  )\n  expect_identical(\n    prep_fields(letters[1:2], resource = NULL),\n    \"a,b\"\n  )\n  expect_identical(\n    prep_fields(letters[1:2], resource = \"blah\"),\n    \"blah/a,blah/b\"\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_find.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-drive_find\")\nnm_ <- nm_fun(\"TEST-drive_find\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"find-me\"),\n    nm_(\"this-should-not-exist\"),\n    nm_(\"copy-me\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_mkdir(nm_(\"find-me\"))\n  drive_upload(\n    system.file(\"DESCRIPTION\"),\n    nm_(\"copy-me\")\n  )\n}\n\n# ---- tests ----\ntest_that(\"drive_find() passes q\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  ## this should find at least 1 folder (find-me), and all files found should\n  ## be folders\n  out <- drive_find(q = \"mimeType='application/vnd.google-apps.folder'\")\n  mtypes <- map_chr(out$drive_resource, \"mimeType\")\n  expect_true(all(mtypes == \"application/vnd.google-apps.folder\"))\n})\n\ntest_that(\"drive_find() `type` filters for MIME type\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  ## this should find at least 1 folder (find-me), and all files found should\n  ## be folders\n  out <- drive_find(type = \"folder\")\n  mtypes <- map_chr(out$drive_resource, \"mimeType\")\n  expect_true(all(mtypes == \"application/vnd.google-apps.folder\"))\n})\n\ntest_that(\"drive_find() filters for the regex in `pattern`\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  expect_identical(\n    drive_find(pattern = nm_(\"find-me\"))$name,\n    nm_(\"find-me\")\n  )\n})\n\ntest_that(\"drive_find() errors for nonsense in `n_max`\", {\n  expect_snapshot(drive_find(n_max = \"a\"), error = TRUE)\n  expect_snapshot(drive_find(n_max = 1:3), error = TRUE)\n  expect_snapshot(drive_find(n_max = -2), error = TRUE)\n})\n\ntest_that(\"drive_find() returns early if n_max < 1\", {\n  expect_identical(drive_find(n_max = 0.5), dribble())\n})\n\ntest_that(\"drive_find() returns empty dribble if no match for `pattern`\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  expect_identical(\n    drive_find(pattern = nm_(\"this-should-not-exist\")),\n    dribble()\n  )\n})\n\ntest_that(\"drive_find() tolerates specification of pageSize\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  out <- drive_find(n_max = 10, pageSize = 5)\n  expect_lte(nrow(out), 10)\n  expect_lt(anyDuplicated(out$id), 1)\n})\n\ntest_that(\"drive_find() honors n_max\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  out <- drive_find(n_max = 4)\n  expect_equal(nrow(out), 4)\n})\n\ntest_that(\"marshal_q_clauses() works in the absence of q\", {\n  params <- list(a = \"a\", b = \"b\")\n  expect_identical(marshal_q_clauses(params), params)\n})\n\ntest_that(\"marshal_q_clauses() handles multiple q and vector q\", {\n  ## non-q params present\n  params <- list(a = \"a\", q = as.character(1:2), q = \"3\")\n  expect_identical(\n    marshal_q_clauses(params),\n    list(a = \"a\", q = as.character(1:3))\n  )\n\n  ## non-q params absent\n  params <- list(q = as.character(1:2), q = \"3\")\n  expect_identical(\n    marshal_q_clauses(params),\n    list(q = as.character(1:3))\n  )\n})\n\ntest_that(\"trashed argument works\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(drive_find(me_(\"trashed\"), trashed = NA))\n\n  trashed <- drive_cp(nm_(\"copy-me\"), name = me_(\"trashed\"))\n  drive_trash(trashed)\n  untrashed <- drive_cp(nm_(\"copy-me\"), name = me_(\"untrashed\"))\n\n  out <- drive_find()\n  expect_false(me_(\"trashed\") %in% out$name)\n  expect_true(me_(\"untrashed\") %in% out$name)\n\n  out <- drive_find(trashed = TRUE)\n  expect_true(me_(\"trashed\") %in% out$name)\n  expect_false(me_(\"untrashed\") %in% out$name)\n\n  out <- drive_find(trashed = NA)\n  expect_true(me_(\"trashed\") %in% out$name)\n  expect_true(me_(\"untrashed\") %in% out$name)\n\n  ## make sure that `trashed = NA` is \"inert\", i.e. `trashed` can still be\n  ## used in user-written q clauses\n  out <- drive_find(trashed = NA, q = \"trashed = true\")\n  expect_true(me_(\"trashed\") %in% out$name)\n  expect_false(me_(\"untrashed\") %in% out$name)\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_get.R",
    "content": "# ---- nm_fun ----\nnm_ <- nm_fun(\"TEST-drive_get\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  files <- drive_find(nm_(\"thing0[1234]\"))\n  drive_trash(files)\n}\n\n# ---- setup ----\nif (SETUP) {\n  file_in_root <- drive_upload(\n    system.file(\"DESCRIPTION\"),\n    name = nm_(\"thing01\")\n  )\n  drive_upload(system.file(\"DESCRIPTION\"), name = nm_(\"thing02\"))\n  drive_upload(system.file(\"DESCRIPTION\"), name = nm_(\"thing03\"))\n  folder_in_root <- drive_mkdir(nm_(\"thing01\"))\n  folder_in_folder <- drive_mkdir(nm_(\"thing01\"), path = folder_in_root)\n  file_in_folder_in_folder <- drive_cp(\n    file_in_root,\n    path = folder_in_folder,\n    name = nm_(\"thing01\")\n  )\n  drive_upload(\n    system.file(\"DESCRIPTION\"),\n    path = folder_in_root,\n    name = nm_(\"thing04\")\n  )\n}\n\n# ---- tests ----\ntest_that(\"drive_get() 'no input' edge cases\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  expect_identical(drive_get(), dribble_with_path())\n  expect_identical(drive_get(NULL), dribble_with_path())\n  expect_identical(drive_get(character(0)), dribble_with_path())\n\n  expect_snapshot(drive_get(id = NA_character_), error = TRUE)\n  expect_snapshot(drive_get(id = \"\"), error = TRUE)\n\n  local_drive_loud()\n  expect_snapshot(\n    dat <- drive_get(\"\")\n  )\n  expect_equal(dat, dribble_with_path())\n})\n\ntest_that(\"drive_get() gives n-row output for n ids as input\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  two_files_find <- drive_find(pattern = nm_(\"thing0[12]\"))\n  two_files_get <- drive_get(id = two_files_find$id)\n  expect_identical(\n    two_files_find[c(\"name\", \"id\")],\n    two_files_get[c(\"name\", \"id\")]\n  )\n})\n\ntest_that(\"drive_get(path = ...) works\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  one_file <- drive_get(nm_(\"thing02\"))\n  expect_dribble(one_file)\n  expect_identical(nrow(one_file), 1L)\n\n  two_files <- drive_get(c(nm_(\"thing02\"), nm_(\"thing03\")))\n  expect_dribble(two_files)\n  expect_identical(two_files$name, c(nm_(\"thing02\"), nm_(\"thing03\")))\n})\n\ntest_that(\"drive_get() for non-existent file\", {\n  skip_if_no_token()\n  skip_if_offline()\n  expect_identical(drive_get(\"this-should-give-empty\"), dribble_with_path())\n})\n\ntest_that(\"drive_get(path = ...) is correct wrt folder-ness, path config, rooted-ness\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  # files with these names exist, but not in this path configuration\n  out <- drive_get(c(nm_(\"thing01\"), nm_(\"thing02\")))\n  expect_true(all(c(nm_(\"thing01\"), nm_(\"thing02\")) %in% out$name))\n  expect_identical(\n    drive_get(file.path(nm_(\"thing01\"), nm_(\"thing02\"))),\n    dribble_with_path()\n  )\n\n  # file exists, but we don't get if specify it must be in root\n  out <- drive_get(nm_(\"thing04\"))\n  expect_identical(out$name, nm_(\"thing04\"))\n  expect_identical(\n    drive_get(file.path(\"~\", nm_(\"thing04\"))),\n    dribble_with_path()\n  )\n\n  # several files/folders exist with this name, but we only want rooted ones\n  out <- drive_get(file.path(\"~\", nm_(\"thing01\")))\n  out <- drive_reveal(out, \"parent\")\n  ROOT_ID <- root_id()\n  expect_true(all(out$id_parent == ROOT_ID))\n\n  # several files/folders exist with this name, but we only want folders\n  out <- drive_get(append_slash(nm_(\"thing01\")))\n  expect_true(all(is_folder(out)))\n\n  # several files/folders exist with this name, but we only want rooted folders\n  out <- drive_get(append_slash(file.path(\"~\", nm_(\"thing01\"))))\n  expect_true(all(is_folder(out)))\n  out <- drive_reveal(out, \"parent\")\n  expect_true(all(out$id_parent == ROOT_ID))\n})\n\ntest_that(\"drive_get() gets root folder\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  from_path <- drive_get(\"~/\")\n  from_id <- drive_get(id = \"root\")\n  from_id2 <- drive_get(as_id(\"root\"))\n  expect_equal(from_path$name, from_id$name)\n  expect_equal(from_path$id, from_id$id)\n  expect_equal(from_path$name, from_id2$name)\n  expect_equal(from_path$id, from_id2$id)\n})\n\ntest_that(\"drive_get(path = ...) puts trailing slash on a folder\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  out <- drive_get(nm_(\"thing01\"))\n  out <- vec_slice(out, is_folder(out))\n  expect_match(out$path, \"/$\")\n})\n\ntest_that(\"drive_reveal_path() puts trailing slash on a folder\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  out <- drive_find(nm_(\"thing01\"), type = \"folder\")\n  out <- out |> drive_reveal_path()\n  out <- out |> promote(\"mimeType\")\n  expect_match(out$path, \"/$\")\n})\n\ntest_that(\"drive_get() + drive_reveal_path() <--> drive_get() roundtrip\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  file <- drive_find(nm_(\"thing04\"))\n\n  file_from_id <- drive_get(as_id(file$id))\n  path_from_file <- drive_reveal_path(file_from_id)\n  file_from_path <- drive_get(path_from_file$path)\n\n  expect_equal(file_from_id$id, file_from_path$id)\n  expect_equal(path_from_file$path, file_from_path$path)\n})\n\ntest_that(\"drive_get() works with a URL\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  file <- drive_find(nm_(\"thing02\"))\n\n  out <- drive_get(pluck(file, \"drive_resource\", 1, \"webViewLink\"))\n  expect_identical(file$id, out$id)\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_get_path.R",
    "content": "test_that(\"get_last_path_part() works\", {\n  expect_last_part <- function(x, tail) {\n    expect_equal(get_last_path_part(x), tail)\n  }\n  expect_last_part(\"~\", \"~/\")\n  expect_last_part(\"~/\", \"~/\")\n\n  expect_last_part(\"abc\", \"abc\")\n  expect_last_part(\"abc/\", \"abc/\")\n\n  expect_last_part(\"~/abc\", \"abc\")\n  expect_last_part(\"~/abc/\", \"abc/\")\n\n  expect_last_part(\"~/abc/def\", \"def\")\n  expect_last_part(\"~/abc/def/\", \"def/\")\n  expect_last_part(\"abc/def\", \"def\")\n  expect_last_part(\"abc/def/\", \"def/\")\n\n  expect_last_part(\"~/abc/def/ghi\", \"ghi\")\n  expect_last_part(\"~/abc/def/ghi/\", \"ghi/\")\n  expect_last_part(\"abc/def/ghi\", \"ghi\")\n  expect_last_part(\"abc/def/ghi/\", \"ghi/\")\n})\n\ntest_that(\"resolve_paths() works, basic scenarios\", {\n  local_mocked_bindings(\n    root_id = function() \"\"\n  )\n\n  # a -- b -- c -- d\n  # ??? -- e\n  dr_folder <-\n    list(kind = \"drive#file\", mimeType = \"application/vnd.google-apps.folder\")\n  ancestors <- tibble(\n    name = c(\"a\", \"b\", \"c\"),\n    id = c(\"1\", \"2\", \"3\"),\n    #    id_parent = c(NA, \"1\", \"2\"),\n    drive_resource = list(\n      c(dr_folder, parents = list(list())),\n      c(dr_folder, parents = list(list(\"1\"))),\n      c(dr_folder, parents = list(list(\"2\")))\n    )\n  )\n\n  x <- tibble(\n    name = \"d\",\n    id = \"4\",\n    drive_resource = list(list(kind = \"drive#file\", parents = list(list(\"3\"))))\n  )\n  out <- resolve_paths(as_dribble(x), ancestors)\n  expect_equal(out$path, \"a/b/c/d\")\n\n  # target is a folder\n  x$drive_resource <- list(c(dr_folder, parents = list(list(\"3\"))))\n  out <- resolve_paths(as_dribble(x), ancestors)\n  expect_equal(out$path, \"a/b/c/d/\")\n\n  # target's parent is not among the elders\n  x <- tibble(\n    name = \"e\",\n    id = \"4\",\n    drive_resource = list(list(kind = \"drive#file\", parents = list(list(\"9\"))))\n  )\n  out <- resolve_paths(as_dribble(x), ancestors)\n  expect_equal(out$path, \"e\")\n})\n\ntest_that(\"resolve_paths() works, with some name duplication\", {\n  local_mocked_bindings(\n    root_id = function() \"\"\n  )\n\n  #     name(id)\n  #      ___~(1) __\n  #     /       \\    \\\n  #   a(2)     a(3)   \\ __ b(4)\n  #   /         |        |\n  # b(5)       b(6)    a(7)\n  #  |                   |\n  # c(8)                d(9)\n  dr_folder <-\n    list(kind = \"drive#file\", mimeType = \"application/vnd.google-apps.folder\")\n  ancestors <- tibble(\n    name = c(\"~\", \"a\", \"a\", \"b\", \"b\", \"b\", \"a\"),\n    id = c(\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"),\n    id_parent = c(NA, \"1\", \"1\", \"1\", \"2\", \"3\", \"4\"),\n    drive_resource = list(\n      c(dr_folder, parents = list(list())),\n      c(dr_folder, parents = list(list(\"1\"))),\n      c(dr_folder, parents = list(list(\"1\"))),\n      c(dr_folder, parents = list(list(\"1\"))),\n      c(dr_folder, parents = list(list(\"2\"))),\n      c(dr_folder, parents = list(list(\"3\"))),\n      c(dr_folder, parents = list(list(\"4\")))\n    )\n  )\n\n  x <- tibble(\n    name = c(\"c\", \"d\"),\n    id = c(\"8\", \"9\"),\n    drive_resource = list(\n      list(kind = \"drive#file\", parents = list(list(\"5\"))),\n      list(kind = \"drive#file\", parents = list(list(\"7\")))\n    )\n  )\n  out <- resolve_paths(as_dribble(x), ancestors)\n\n  expect_equal(out$path[1], \"~/a/b/c\")\n  expect_equal(out$path[2], \"~/b/a/d\")\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_id-class.R",
    "content": "# ---- other ----\nif (FALSE) {\n  ## how the test file was created\n  ## see also test-dplyr-compatbility.R\n  saveRDS(\n    drive_find(n_max = 10),\n    test_fixture(\"just_a_dribble.rds\")\n  )\n}\n\n# ---- tests ----\ntest_that(\"as_id() copes with no input, NULL, and length-0 input\", {\n  expect_null(as_id())\n  expect_null(as_id(NULL))\n  expect_identical(as_id(character()), new_drive_id())\n})\n\ntest_that(\"as_id() errors for unanticipated input\", {\n  expect_snapshot(as_id(mean), error = TRUE)\n  expect_snapshot(as_id(1.2), error = TRUE)\n  expect_snapshot(as_id(1L), error = TRUE)\n})\n\ntest_that(\"as_id() returns non-URL character strings as ids\", {\n  expect_true(is_drive_id(as_id(c(\"123\", \"456\"))))\n  expect_identical(unclass(as_id(c(\"123\", \"456\"))), c(\"123\", \"456\"))\n})\n\ntest_that(\"as_id() extracts ids from Drive URLs but not other URLs\", {\n  x <- c(\n    \"https://docs.google.com/document/d/doc12345/edit\",\n    \"https://drive.google.com/drive/folders/folder12345\",\n    # https://github.com/tidyverse/googledrive/issues/450\n    \"https://drive.google.com/drive/folders/folder12345?usp=drive_link\",\n    \"https://drive.google.com/open?id=blob12345\",\n    \"https://docs.google.com/a/example.com/spreadsheets/d/team12345\",\n    # Team Drive URL\n    \"https://drive.google.com/drive/u/0/folders/teamdrive12345\"\n  )\n  expect_identical(\n    as_id(x),\n    as_id(c(\n      \"doc12345\",\n      \"folder12345\",\n      \"folder12345\",\n      \"blob12345\",\n      \"team12345\",\n      \"teamdrive12345\"\n    ))\n  )\n  ## properly recognizes a missing URL\n  x <- c(\n    \"https://docs.google.com/document/d/doc12345/edit\",\n    NA,\n    \"https://drive.google.com/open?id=blob12345\"\n  )\n  expect_identical(as_id(x), as_id(c(\"doc12345\", NA, \"blob12345\")))\n\n  ## properly recognizes a non-conforming URL\n  x <- \"http://example.com\"\n  expect_identical(unclass(as_id(x)), NA_character_)\n})\n\ntest_that(\"as_id() works with dribble and dribble-ish data frames\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_true(is_drive_id(as_id(x)))\n  expect_identical(as_id(x), x$id)\n\n  class(x) <- class(x)[-1]\n  expect_true(is_drive_id(as_id(x)))\n  expect_identical(as_id(x), x$id)\n})\n\ntest_that(\"presence of drive_id column doesn't prevent row binding of dribbles\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  alfa <- x[1:2, ]\n  bravo <- x[3:4, ]\n\n  expect_no_error(\n    out <- vec_rbind(alfa, bravo)\n  )\n  expect_equal(out[c(\"name\", \"id\")], x[1:4, c(\"name\", \"id\")])\n})\n\n## how drive_ids look when printed\ntest_that(\"drive_id's are formatted OK\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n  expect_snapshot(print(x$id))\n})\n\ntest_that(\"drive_ids look OK in a dribble and truncate gracefully\", {\n  x <- readRDS(test_fixture(\"just_a_dribble.rds\"))\n\n  expect_snapshot(print(x))\n  expect_snapshot(print(drive_reveal(x, \"mime_type\")))\n\n  x$id[1] <- NA\n  expect_snapshot(print(x))\n})\n\ntest_that(\"gargle_map_cli() is implemented for drive_id\", {\n  expect_snapshot(\n    gargle_map_cli(as_id(month.name[1:3]))\n  )\n})\n\n## low-level helpers\ntest_that(\"new_drive_id() handles 0-length input and NA\", {\n  expect_no_error(\n    out <- new_drive_id(character())\n  )\n  expect_length(out, 0)\n  expect_true(is_drive_id(out))\n\n  expect_no_error(\n    out <- new_drive_id(NA_character_)\n  )\n  expect_true(is.na(out))\n  expect_true(is_drive_id(out))\n\n  expect_no_error(\n    out <- new_drive_id(c(NA_character_, \"abc\"))\n  )\n  expect_true(is.na(out[1]))\n  expect_true(is_drive_id(out))\n})\n\ntest_that(\"validate_drive_id fails informatively\", {\n  expect_snapshot(validate_drive_id(\"\"), error = TRUE)\n  expect_snapshot(validate_drive_id(\"a@&\"), error = TRUE)\n})\n\ntest_that(\"drive_id is dropped when combining with character\", {\n  x <- as_id(\"abc\")\n  y <- \"def\"\n\n  out <- vec_c(x, y)\n  expect_identical(out, c(\"abc\", \"def\"))\n  expect_false(is_drive_id(out))\n\n  out <- vec_c(y, x)\n  expect_identical(out, c(\"def\", \"abc\"))\n  expect_false(is_drive_id(out))\n})\n\ntest_that(\"you can't insert invalid strings into a drive_id\", {\n  x <- as_id(month.name)\n  expect_true(is_drive_id(x))\n  expect_snapshot(x[2] <- \"\", error = TRUE)\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_ls.R",
    "content": "# ---- nm_fun ----\nnm_ <- nm_fun(\"TEST-drive_ls\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"list-me\"),\n    nm_(\"list-a-folder-shortcut\"),\n    nm_(\"this-should-not-exist\"),\n    nm_(\"topdir\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_mkdir(nm_(\"list-me\"))\n  drive_upload(\n    system.file(\"DESCRIPTION\"),\n    path = file.path(nm_(\"list-me\"), nm_(\"DESCRIPTION\"))\n  )\n  drive_upload(\n    file.path(R.home(\"doc\"), \"html\", \"about.html\"),\n    path = file.path(nm_(\"list-me\"), nm_(\"about-html\"))\n  )\n  shortcut_create(nm_(\"list-me\"), name = nm_(\"list-a-folder-shortcut\"))\n\n  ## for testing `recursive = TRUE`\n  top <- drive_mkdir(nm_(\"topdir\"))\n  drive_upload(\n    system.file(\"DESCRIPTION\"),\n    path = top,\n    name = nm_(\"apple\"),\n    type = \"document\",\n    starred = TRUE\n  )\n  folder1_level1 <- drive_mkdir(nm_(\"folder1-level1\"), path = top)\n  drive_mkdir(nm_(\"folder2-level1\"), path = top)\n  x <- drive_upload(\n    system.file(\"DESCRIPTION\"),\n    path = folder1_level1,\n    name = nm_(\"banana\"),\n    type = \"document\"\n  )\n  folder1_level2 <- drive_mkdir(nm_(\"folder1-level2\"), path = folder1_level1)\n  x <- drive_upload(\n    system.file(\"DESCRIPTION\"),\n    path = folder1_level2,\n    name = nm_(\"cranberry\"),\n    type = \"document\",\n    starred = TRUE\n  )\n}\n\n# ---- tests ----\ntest_that(\"drive_ls() errors if `path` does not exist\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  expect_snapshot(drive_ls(nm_(\"this-should-not-exist\")), error = TRUE)\n})\n\ntest_that(\"drive_ls() outputs contents of folder\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  ## path\n  out <- drive_ls(nm_(\"list-me\"))\n  expect_dribble(out)\n  expect_true(setequal(out$name, c(nm_(\"about-html\"), nm_(\"DESCRIPTION\"))))\n\n  ## dribble\n  d <- drive_get(nm_(\"list-me\"))\n  out2 <- drive_ls(d)\n  expect_identical(out[c(\"name\", \"id\")], out2[c(\"name\", \"id\")])\n\n  ## id\n  out3 <- drive_ls(d$id)\n  expect_identical(out[c(\"name\", \"id\")], out3[c(\"name\", \"id\")])\n})\n\ntest_that(\"drive_ls() list contents of the target of a folder shortcut\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  target_name <- nm_(\"list-me\")\n  shortcut_name <- nm_(\"list-a-folder-shortcut\")\n\n  direct_ls <- drive_ls(target_name)\n\n  local_drive_loud_and_wide()\n  drive_ls_message <- capture.output(\n    indirect_ls <- drive_ls(shortcut_name),\n    type = \"message\"\n  )\n  drive_ls_message <- drive_ls_message |>\n    scrub_filepath(target_name) |>\n    scrub_filepath(shortcut_name) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_ls_message)\n  )\n\n  expect_equal(direct_ls$id, indirect_ls$id)\n})\n\ntest_that(\"drive_ls() passes ... through to drive_find()\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  d <- drive_get(nm_(\"list-me\"))\n\n  ## does user-specified q get appended to vs clobbered?\n  ## if so, only about-html is listed here\n  about <- drive_get(nm_(\"about-html\"))\n  out <- drive_ls(d, q = \"fullText contains 'portable'\", orderBy = NULL)\n  expect_identical(\n    about[c(\"name\", \"id\")],\n    out[c(\"name\", \"id\")]\n  )\n\n  ## does a non-q query parameter get passed through?\n  ## if so, files are listed in reverse alphabetical order here\n  out <- drive_ls(d, orderBy = \"name desc\")\n  expect_identical(\n    out$name,\n    c(nm_(\"DESCRIPTION\"), nm_(\"about-html\"))\n  )\n})\n\ntest_that(\"`recursive` does its job\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  out <- drive_ls(nm_(\"topdir\"), recursive = FALSE)\n  expect_true(\n    all(\n      c(nm_(\"apple\"), nm_(\"folder1-level1\"), nm_(\"folder2-level1\")) %in%\n        out$name\n    )\n  )\n\n  out <- drive_ls(nm_(\"topdir\"), recursive = TRUE)\n  expect_true(\n    all(\n      c(\n        nm_(\"apple\"),\n        nm_(\"folder1-level1\"),\n        nm_(\"folder2-level1\"),\n        nm_(\"banana\"),\n        nm_(\"folder1-level2\"),\n        nm_(\"cranberry\")\n      ) %in%\n        out$name\n    )\n  )\n\n  out <- drive_ls(nm_(\"topdir\"), q = \"starred = true\", recursive = TRUE)\n  expect_true(all(c(nm_(\"apple\"), nm_(\"cranberry\")) %in% out$name))\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_mime_type.R",
    "content": "# ---- tests ----\ntest_that(\"drive_mime_type() returns NULL if no input\", {\n  expect_null(drive_mime_type())\n})\n\ntest_that(\"drive_mime_type(expose()) returns the full tibble\", {\n  expect_identical(\n    drive_mime_type(expose()),\n    .drive$mime_tbl\n  )\n})\n\ntest_that(\"drive_mime_type() returns MIME type for Drive native type\", {\n  expect_identical(\n    drive_mime_type(c(\"spreadsheet\", \"document\")),\n    c(\n      \"application/vnd.google-apps.spreadsheet\",\n      \"application/vnd.google-apps.document\"\n    )\n  )\n})\n\ntest_that(\"drive_mime_type() returns MIME type for file extension\", {\n  expect_identical(\n    drive_mime_type(c(\"pdf\", \"jpeg\", \"md\")),\n    c(\"application/pdf\", \"image/jpeg\", \"text/markdown\")\n  )\n})\n\ntest_that(\"drive_mime_type() returns MIME type for MIME type\", {\n  input <- c(\"application/vnd.ms-excel\", \"text/html\", \"text/x-markdown\")\n  expect_identical(drive_mime_type(input), input)\n})\n\ntest_that(\"drive_mime_type() returns MIME type for mixed input\", {\n  input <- c(\"text/html\", NA, \"folder\", \"csv\")\n  expect_identical(\n    drive_mime_type(input),\n    c(\"text/html\", NA, \"application/vnd.google-apps.folder\", \"text/csv\")\n  )\n})\n\ntest_that(\"drive_mime_type() errors for invalid input\", {\n  expect_snapshot(drive_mime_type(1), error = TRUE)\n  expect_snapshot(drive_mime_type(dribble()), error = TRUE)\n})\n\ntest_that(\"drive_mime_type() errors for single unrecognized input\", {\n  expect_snapshot(drive_mime_type(\"nonsense\"), error = TRUE)\n})\n\ntest_that(\"drive_extension() returns NULL if no input\", {\n  expect_null(drive_extension())\n})\n\ntest_that(\"drive_extension() returns file extension for MIME type\", {\n  expect_identical(\n    drive_extension(c(\"application/pdf\", \"image/jpeg\", \"text/x-markdown\")),\n    c(\"pdf\", \"jpeg\", \"md\")\n  )\n})\n\ntest_that(\"drive_extension() returns file extension for file extension\", {\n  input <- c(\"xlsx\", \"html\")\n  expect_identical(drive_extension(input), input)\n})\n\ntest_that(\"drive_extension() returns file extension for mixed input\", {\n  input <- c(\"text/html\", NA, \"application/vnd.google-apps.folder\", \"csv\")\n  expect_identical(\n    drive_extension(input),\n    c(\"html\", NA, NA, \"csv\")\n  )\n})\n\ntest_that(\"drive_extension() errors for invalid input\", {\n  expect_snapshot(drive_extension(1), error = TRUE)\n  expect_snapshot(drive_extension(dribble()), error = TRUE)\n})\n\ntest_that(\"drive_extension() errors for single unrecognized input\", {\n  expect_snapshot(drive_extension(\"nonsense\"), error = TRUE)\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_mv.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-drive_mv\")\nnm_ <- nm_fun(\"TEST-drive_mv\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"move-files-into-me\"),\n    nm_(\"move-to-folder-shortcut\"),\n    nm_(\"DESC\"),\n    nm_(\"DESC-renamed\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_mkdir(nm_(\"move-files-into-me\"))\n  shortcut_create(\n    nm_(\"move-files-into-me\"),\n    name = nm_(\"move-to-folder-shortcut\")\n  )\n}\n\n# ---- tests ----\ntest_that(\"drive_mv() can rename file\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  name_1 <- me_(\"DESC\")\n  name_2 <- me_(\"DESC-renamed\")\n  defer_drive_rm(name_2)\n\n  file <- drive_upload(system.file(\"DESCRIPTION\"), name_1)\n\n  local_drive_loud_and_wide()\n  drive_mv_message <- capture.output(\n    file <- drive_mv(file, name = name_2),\n    type = \"message\"\n  )\n  drive_mv_message <- drive_mv_message |>\n    scrub_filepath(name_1) |>\n    scrub_filepath(name_2) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_mv_message)\n  )\n\n  expect_dribble(file)\n  expect_identical(nrow(file), 1L)\n})\n\ntest_that(\"drive_mv() can move a file into a folder given as path\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  mv_name <- me_(\"DESC\")\n  defer_drive_rm(mv_name)\n\n  mv_file <- drive_upload(system.file(\"DESCRIPTION\"), mv_name)\n\n  local_drive_loud_and_wide()\n  # path is detected as folder (must have trailing slash)\n  drive_mv_message <- capture.output(\n    mv_file <- drive_mv(mv_file, paste0(nm_(\"move-files-into-me\"), \"/\")),\n    type = \"message\"\n  )\n  drive_mv_message <- drive_mv_message |>\n    scrub_filepath(mv_name) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_mv_message)\n  )\n\n  expect_dribble(mv_file)\n  expect_identical(nrow(mv_file), 1L)\n  with_drive_quiet(\n    destination <- drive_get(nm_(\"move-files-into-me\"))\n  )\n  mv_file <- drive_reveal(mv_file, \"parent\")\n  expect_equal(mv_file$id_parent, destination$id)\n})\n\ntest_that(\"drive_mv() can move a file into a folder given as dribble\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  mv_name <- me_(\"DESC\")\n  defer_drive_rm(mv_name)\n\n  mv_file <- drive_upload(system.file(\"DESCRIPTION\"), mv_name)\n  destination <- drive_get(nm_(\"move-files-into-me\"))\n\n  local_drive_loud_and_wide()\n  drive_mv_message <- capture.output(\n    mv_file <- drive_mv(mv_file, destination),\n    type = \"message\"\n  )\n  drive_mv_message <- drive_mv_message |>\n    scrub_filepath(mv_name) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_mv_message)\n  )\n\n  expect_dribble(mv_file)\n  expect_identical(nrow(mv_file), 1L)\n  expect_identical(drive_reveal(mv_file, \"parent\")$id_parent, destination$id)\n})\n\ntest_that(\"drive_mv() can rename and move, using `path` and `name`\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  name_1 <- me_(\"DESC\")\n  name_2 <- me_(\"DESC-renamed\")\n  defer_drive_rm(name_2)\n\n  mv_file <- drive_upload(system.file(\"DESCRIPTION\"), name_1)\n\n  local_drive_loud_and_wide()\n  drive_mv_message <- capture.output(\n    mv_file <- drive_mv(mv_file, nm_(\"move-files-into-me\"), name_2),\n    type = \"message\"\n  )\n  drive_mv_message <- drive_mv_message |>\n    scrub_filepath(name_1) |>\n    scrub_filepath(name_2) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_mv_message)\n  )\n\n  expect_dribble(mv_file)\n  expect_identical(nrow(mv_file), 1L)\n})\n\ntest_that(\"drive_mv() can rename and move, using `path` only\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  name_1 <- me_(\"DESC\")\n  name_2 <- me_(\"DESC-renamed\")\n  defer_drive_rm(name_2)\n\n  mv_file <- drive_upload(system.file(\"DESCRIPTION\"), name_1)\n\n  local_drive_loud_and_wide()\n  drive_mv_message <- capture.output(\n    mv_file <- drive_mv(\n      mv_file,\n      file.path(nm_(\"move-files-into-me\"), name_2)\n    ),\n    type = \"message\"\n  )\n  drive_mv_message <- drive_mv_message |>\n    scrub_filepath(name_1) |>\n    scrub_filepath(name_2) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_mv_message)\n  )\n\n  expect_dribble(mv_file)\n  expect_identical(nrow(mv_file), 1L)\n})\n\ntest_that(\"drive_mv() can move using a folder shortcut\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  name <- me_(\"move-me-via-folder-shortcut\")\n  defer_drive_rm(name)\n  mv_file <- drive_upload(system.file(\"DESCRIPTION\"), name)\n\n  target_parent <- drive_get(nm_(\"move-files-into-me\"))\n  shortcut <- nm_(\"move-to-folder-shortcut\")\n\n  # since I'm not specifying name, append slash to make clear that I regard\n  # `path` as a parent specification\n  out <- drive_mv(mv_file, path = append_slash(shortcut))\n\n  expect_equal(drive_reveal(out, \"parent\")$id_parent, target_parent$id)\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_publish.R",
    "content": "# ---- nm_fun ----\nnm_ <- nm_fun(\"TEST-drive_publish\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"foo_pdf\"),\n    nm_(\"foo_doc\"),\n    nm_(\"foo_sheet\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_upload(\n    file.path(R.home(\"doc\"), \"html\", \"about.html\"),\n    name = nm_(\"foo_doc\"),\n    type = \"document\"\n  )\n  drive_upload(\n    file.path(R.home(\"doc\"), \"BioC_mirrors.csv\"),\n    name = nm_(\"foo_sheet\"),\n    type = \"spreadsheet\"\n  )\n  drive_upload(\n    file.path(R.home(\"doc\"), \"html\", \"RLogo.pdf\"),\n    name = nm_(\"foo_pdf\")\n  )\n}\n\n# ---- tests ----\ntest_that(\"drive_publish() publishes Google Documents\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  drive_doc <- drive_get(nm_(\"foo_doc\"))\n\n  ## since we haven't checked the publication status,\n  ## this should be NULL\n  expect_null(drive_doc[[\"drive_resource\"]][[1]][[\"publish\"]])\n\n  drive_doc <- drive_publish(drive_doc)\n\n  ## the published column should be TRUE\n  expect_true(drive_doc$published)\n\n  ## let's unpublish it\n  drive_doc <- drive_unpublish(drive_doc)\n\n  ## now this sould be false\n  expect_false(drive_doc$published)\n})\n\ntest_that(\"drive_publish() publishes Google Sheets\", {\n  ## we are testing this separately because revision\n  ## history is a bit different for Sheets\n  skip_if_no_token()\n  skip_if_offline()\n\n  drive_sheet <- drive_get(nm_(\"foo_sheet\"))\n\n  ## since we haven't checked the publication status,\n  ## this should be NULL\n  expect_null(drive_sheet[[\"drive_resource\"]][[1]][[\"publish\"]])\n\n  drive_sheet <- drive_publish(drive_sheet)\n\n  ## the published column should be TRUE\n  expect_true(drive_sheet$published)\n\n  ## let's unpublish it\n  drive_sheet <- drive_unpublish(drive_sheet)\n\n  ## now this sould be false\n  expect_false(drive_sheet$published)\n})\n\ntest_that(\"drive_publish() fails for non-native file type\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  drive_pdf <- drive_get(nm_(\"foo_pdf\"))\n  expect_snapshot(drive_publish(drive_pdf), error = TRUE)\n})\n\ntest_that(\"drive_publish() is vectorized\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  files <- drive_get(c(nm_(\"foo_doc\"), nm_(\"foo_sheet\")))\n\n  files <- drive_publish(files)\n  expect_true(all(files$published))\n  files <- drive_unpublish(files)\n  expect_false(all(files$published))\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_put.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-drive_put\")\nnm_ <- nm_fun(\"TEST-drive_put\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    # no current need\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  # no current need\n}\n\n# ---- tests ----\n\ntest_that(\"drive_put() works\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  local_file <- tempfile(me_(\"foo\"), fileext = \".txt\")\n  put_file <- basename(local_file)\n  download_target <- tempfile(me_(\"download\"), fileext = \".txt\")\n  withr::defer({\n    unlink(local_file)\n    unlink(download_target)\n  })\n  defer_drive_rm(drive_find(me_(\"foo\")))\n\n  write_utf8(c(\"beginning\", \"middle\"), local_file)\n\n  local_drive_loud_and_wide()\n  first_put <- capture.output(\n    original <- drive_put(local_file),\n    type = \"message\"\n  )\n  first_put <- first_put |>\n    scrub_filepath(local_file) |>\n    scrub_filepath(put_file) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(first_put)\n  )\n  expect_dribble(original)\n\n  with_drive_quiet(\n    drive_download(original, path = download_target)\n  )\n  expect_identical(\n    read_utf8(local_file),\n    read_utf8(download_target)\n  )\n\n  cat(\"end\", file = local_file, sep = \"\\n\", append = TRUE)\n\n  second_put <- capture.output(\n    second <- drive_put(local_file),\n    type = \"message\"\n  )\n  second_put <- second_put |>\n    scrub_filepath(put_file) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(second_put)\n  )\n  expect_identical(original$id, second$id)\n\n  with_drive_quiet(\n    drive_download(original, path = download_target, overwrite = TRUE)\n  )\n  expect_identical(\n    read_utf8(local_file),\n    read_utf8(download_target)\n  )\n\n  with_drive_quiet(\n    name_collider <- drive_create(basename(local_file))\n  )\n\n  # not easy to convert to snapshot, due to volatile file ids\n  expect_error(\n    drive_put(local_file),\n    \"Multiple items\"\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_read.R",
    "content": "# ---- nm_fun ----\nnm_ <- nm_fun(\"TEST-drive_read\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"DESC\"),\n    nm_(\"chicken_doc\"),\n    nm_(\"imdb_latin1_csv\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_upload(system.file(\"DESCRIPTION\"), name = nm_(\"DESC\"))\n\n  drive_upload(\n    drive_example_local(\"chicken.txt\"),\n    name = nm_(\"chicken_doc\"),\n    type = \"document\"\n  )\n\n  tfile <- tempfile(fileext = \".csv\")\n  curl::curl_download(\n    \"https://matthew-brett.github.io/cfd2019/data/imdblet_latin.csv\",\n    destfile = tfile\n  )\n  drive_upload(tfile, name = nm_(\"imdb_latin1_csv\"))\n}\n\n# ---- tests ----\ntest_that(\"drive_read_string() extracts text\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  suppressMessages(\n    r_desc <- drive_read_string(nm_(\"DESC\"))\n  )\n  r_desc <- as.list(read.dcf(textConnection(r_desc))[1, ])\n  expect_equal(r_desc$Package, \"base\")\n  expect_equal(r_desc$Title, \"The R Base Package\")\n})\n\ntest_that(\"drive_read_raw() returns bytes\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  suppressMessages(\n    r_desc_raw <- drive_read_raw(nm_(\"DESC\"))\n  )\n  suppressMessages(\n    r_desc_string <- drive_read_string(nm_(\"DESC\"))\n  )\n  expect_equal(rawToChar(r_desc_raw), r_desc_string)\n})\n\ntest_that(\"drive_read() works on a native Google file\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  suppressMessages(\n    chicken_poem <- drive_read_string(nm_(\"chicken_doc\"), type = \"text/plain\")\n  )\n  chicken_poem <- strsplit(chicken_poem, split = \"(\\r\\n|\\r|\\n)\")[[1]]\n  expect_setequal(\n    chicken_poem,\n    read_utf8(drive_example_local(\"chicken.txt\"))\n  )\n})\n\ntest_that(\"drive_read() can handle non UTF-8 input, if informed\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  suppressMessages(\n    imdb <- drive_read_string(nm_(\"imdb_latin1_csv\"), encoding = \"latin1\")\n  )\n  imdb <- utils::read.csv(\n    text = imdb,\n    stringsAsFactors = FALSE,\n    encoding = \"UTF-8\"\n  )\n  expect_equal(\n    names(imdb),\n    c(\"Votes\", \"Rating\", \"Title\", \"Year\", \"Decade\")\n  )\n  leon <- \"\\u004C\\u00E9\\u006F\\u006E\"\n  expect_equal(imdb$Title[[1]], leon)\n  eight_and_a_half <- \"\\u0038\\u00BD\"\n  expect_equal(imdb$Title[[31]], eight_and_a_half)\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_reveal.R",
    "content": "# ---- nm_fun ----\nnm_ <- nm_fun(\"TEST-drive_reveal\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"i-am-starred\"),\n    nm_(\"i-have-a-description\"),\n    nm_(\"i-am-a-google-doc\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  # some \"simple\" cases of digging info out of `drive_resource`\n  f <- drive_example_local(\"chicken.txt\")\n  drive_upload(f, nm_(\"i-am-starred\"), starred = TRUE)\n  drive_upload(f, nm_(\"i-have-a-description\"), description = \"description!\")\n  drive_upload(f, nm_(\"i-am-a-google-doc\"), type = \"document\")\n}\n\n# ---- tests ----\ntest_that(\"drive_reveal() works\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  dat <- drive_find(nm_(\"\"))\n\n  expect_snapshot(\n    print(out <- drive_reveal(dat, \"starred\")[c(\"name\", \"starred\")])\n  )\n  expect_true(out$starred[grepl(\"starred\", out$name)])\n\n  expect_snapshot(\n    print(out <- drive_reveal(dat, \"description\")[c(\"name\", \"description\")])\n  )\n  expect_equal(out$description[grepl(\"description\", out$name)], \"description!\")\n\n  expect_snapshot(\n    print(out <- drive_reveal(dat, \"mimeType\")[c(\"name\", \"mime_type\")])\n  )\n  expect_equal(\n    out$mime_type[grepl(\"google-doc\", out$name)],\n    drive_mime_type(\"document\")\n  )\n})\n\ntest_that(\"drive_reveal() can return date-times\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  dat <- drive_find(nm_(\"\"))\n\n  out <- drive_reveal(dat, \"created_time\")\n  expect_s3_class(out$created_time, \"POSIXct\")\n})\n\ntest_that(\"drive_reveal() returns list-column for non-existent `what`\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  dat <- drive_find(nm_(\"\"))\n\n  out <- drive_reveal(dat, \"i_do_not_exist\")\n  expect_true(all(map_lgl(out$i_do_not_exist, is_null)))\n\n  out <- drive_reveal(dat, \"non_existent_time\")\n  expect_true(all(map_lgl(out$non_existent_time, is_null)))\n})\n\ntest_that(\"drive_reveal() inserts columns, even with 0 rows\", {\n  x <- dribble()\n  x <- drive_reveal(x, \"mime_type\")\n  x <- drive_reveal(x, \"starred\")\n  expect_equal(\n    names(x),\n    c(\"name\", \"starred\", \"mime_type\", \"id\", \"drive_resource\")\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_rm.R",
    "content": "# ---- tests ----\ntest_that(\"drive_rm() copes with no input\", {\n  expect_identical(drive_rm(), dribble())\n})\n\ntest_that(\"drive_rm() copes when there are no matching files\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  expect_identical(drive_rm(\"non-existent-file-name\"), dribble())\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_share.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-drive_share\")\nnm_ <- nm_fun(\"TEST-drive_share\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"mirrors-to-share\"),\n    nm_(\"DESC\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_upload(system.file(\"DESCRIPTION\"), nm_(\"DESC\"))\n}\n\n# ---- tests ----\n\ntest_that(\"drive_share() errors for invalid `role` or `type`\", {\n  expect_snapshot(drive_share(dribble(), role = \"chef\"), error = TRUE)\n  expect_snapshot(drive_share(dribble(), type = \"pet\"), error = TRUE)\n})\n\ntest_that(\"drive_share() adds permissions\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(me_(\"mirrors-to-share\"))\n\n  file <- drive_upload(\n    file.path(R.home(\"doc\"), \"BioC_mirrors.csv\"),\n    name = me_(\"mirrors-to-share\")\n  )\n  expect_false(file$drive_resource[[1]]$shared)\n\n  file <- drive_share(file, role = \"commenter\", type = \"anyone\")\n  expect_true(file$shared)\n  perms <- file[[\"permissions_resource\"]][[1]][[\"permissions\"]]\n  expect_setequal(map_chr(perms, \"role\"), c(\"owner\", \"commenter\"))\n  expect_setequal(map_chr(perms, \"type\"), c(\"user\", \"anyone\"))\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_trash.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-drive_trash\")\nnm_ <- nm_fun(\"TEST-drive_trash\", user_run = FALSE)\n\n# ---- setup ----\nif (SETUP) {\n  drive_upload(\n    system.file(\"DESCRIPTION\"),\n    nm_(\"trash-fodder\")\n  )\n}\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"trash-fodder\"),\n    me_(\"trashee-1\"),\n    me_(\"trashee-2\")\n  ))\n}\n\n# ---- tests ----\ntest_that(\"drive_trash() moves files to trash and drive_untrash() undoes\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(drive_find(me_(\"trashee-[12]\")))\n\n  trashee1 <- drive_cp(nm_(\"trash-fodder\"), name = me_(\"trashee-1\"))\n  trashee2 <- drive_cp(nm_(\"trash-fodder\"), name = me_(\"trashee-2\"))\n\n  out <- drive_trash(c(me_(\"trashee-1\"), me_(\"trashee-2\")))\n  expect_dribble(out)\n  expect_setequal(out$name, c(me_(\"trashee-1\"), me_(\"trashee-2\")))\n  expect_true(all(drive_reveal(out, \"trashed\")[[\"trashed\"]]))\n\n  out <- drive_untrash(c(me_(\"trashee-1\"), me_(\"trashee-2\")))\n  expect_dribble(out)\n  expect_setequal(out$name, c(me_(\"trashee-1\"), me_(\"trashee-2\")))\n  expect_false(any(drive_reveal(out, \"trashed\")[[\"trashed\"]]))\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_update.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-drive_update\")\nnm_ <- nm_fun(\"TEST-drive_update\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"update-fodder\"),\n    nm_(\"not-unique\"),\n    nm_(\"does-not-exist\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_upload(system.file(\"DESCRIPTION\"), nm_(\"update-fodder\"))\n  drive_upload(system.file(\"DESCRIPTION\"), nm_(\"not-unique\"))\n  drive_upload(system.file(\"DESCRIPTION\"), nm_(\"not-unique\"))\n}\n\n# ---- tests ----\ntest_that(\"drive_update() errors if local media does not exist\", {\n  expect_snapshot(drive_update(dribble(), \"nope123\"), error = TRUE)\n})\n\ntest_that(\"drive_update() informatively errors if the path does not exist\", {\n  skip_if_no_token()\n  skip_if_offline()\n  expect_snapshot(\n    drive_update(nm_(\"does-not-exist\"), system.file(\"DESCRIPTION\")),\n    error = TRUE\n  )\n})\n\ntest_that(\"drive_update() informatively errors if the path is not unique\", {\n  skip_if_no_token()\n  skip_if_offline()\n  expect_snapshot(\n    drive_update(nm_(\"not-unique\"), system.file(\"DESCRIPTION\")),\n    error = TRUE\n  )\n})\n\ntest_that(\"no op if no media, no metadata\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  local_drive_loud_and_wide()\n  expect_snapshot(\n    out <- drive_update(nm_(\"update-fodder\")),\n  )\n  expect_dribble(out)\n})\n\ntest_that(\"drive_update() can update metadata only\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(me_(\"update-me\"))\n\n  updatee <- drive_cp(nm_(\"update-fodder\"), name = me_(\"update-me\"))\n  out <- drive_update(updatee, starred = TRUE) |> promote(\"starred\")\n  expect_true(out$starred)\n})\n\ntest_that(\"drive_update() uses multipart request to update media + metadata\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(c(me_(\"update-me\"), me_(\"update-me-new\")))\n\n  updatee <- drive_cp(nm_(\"update-fodder\"), name = me_(\"update-me\"))\n  tmp <- tempfile()\n  now <- as.character(Sys.time())\n  write_utf8(now, tmp)\n\n  out <- drive_update(updatee, media = tmp, name = me_(\"update-me-new\"))\n  expect_identical(out$id, updatee$id)\n  drive_download(updatee, tmp, overwrite = TRUE)\n  now_out <- read_utf8(tmp)\n  expect_identical(now, now_out)\n  expect_identical(out$name, me_(\"update-me-new\"))\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_upload.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-drive_upload\")\nnm_ <- nm_fun(\"TEST-drive_upload\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"upload-into-me\"),\n    nm_(\"upload-via-folder-shortcut\"),\n    nm_(\"DESCRIPTION\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_mkdir(nm_(\"upload-into-me\"))\n  shortcut_create(\n    nm_(\"upload-into-me\"),\n    name = nm_(\"upload-via-folder-shortcut\")\n  )\n}\n\n# ---- tests ----\ntest_that(\"drive_upload() detects non-existent file\", {\n  expect_snapshot(\n    drive_upload(\"no-such-file\", \"File does not exist\"),\n    error = TRUE\n  )\n})\n\ntest_that(\"drive_upload() places file in non-root folder, with new name\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(me_(\"DESCRIPTION\"))\n\n  destination <- drive_get(nm_(\"upload-into-me\"))\n  uploadee <- drive_upload(\n    system.file(\"DESCRIPTION\"),\n    path = destination,\n    name = me_(\"DESCRIPTION\")\n  )\n\n  expect_dribble(uploadee)\n  expect_identical(nrow(uploadee), 1L)\n  expect_identical(drive_reveal(uploadee, \"parent\")$id_parent, destination$id)\n})\n\ntest_that(\"drive_upload() can place file via folder-shortcut\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  upload_name <- me_(\"upload-via-shortcut-folder\")\n  defer_drive_rm(upload_name)\n\n  target_parent <- drive_get(nm_(\"upload-into-me\"))\n  shortcut <- nm_(\"upload-via-folder-shortcut\")\n\n  uploadee <- drive_upload(\n    system.file(\"DESCRIPTION\"),\n    path = shortcut,\n    name = upload_name\n  )\n  expect_equal(drive_reveal(uploadee, \"parent\")$id_parent, target_parent$id)\n})\n\n\ntest_that(\"drive_upload() accepts body metadata via ...\", {\n  skip_if_no_token()\n  skip_if_offline()\n  defer_drive_rm(me_(\"DESCRIPTION\"))\n\n  uploadee <- drive_upload(\n    system.file(\"DESCRIPTION\"),\n    name = me_(\"DESCRIPTION\"),\n    starred = TRUE\n  )\n  expect_dribble(uploadee)\n  expect_identical(nrow(uploadee), 1L)\n  expect_true(uploadee$drive_resource[[1]]$starred)\n})\n\n# https://github.com/tidyverse/googledrive/pull/342\ntest_that(\"drive_upload() does not mangle name with multi-byte characters\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  # KATAKANA LETTERS MA RU TI\n  tricky_bit <- \"\\u30DE\\u30EB\\u30C1\"\n  filename_1 <- me_(paste0(\"multibyte-chars-1-\", tricky_bit))\n  defer_drive_rm(filename_1)\n\n  file_1 <- drive_upload(\n    drive_example_local(\"chicken.csv\"),\n    path = filename_1,\n    type = \"spreadsheet\"\n  )\n  expect_equal(charToRaw(file_1$name), charToRaw(filename_1))\n\n  # TODO: when I was here, I hoped to also handle the case where the user\n  # allows the Drive file name to come from its local name and *that*\n  # name contains CJK characters\n  # Ultimately I concluded that curl (the R package) doesn't really support\n  # this currently, so I'm leaving it alone for now.\n  # Leaving these notes, in case I ever come through here again.\n  # https://github.com/jeroen/curl/issues/182\n  # https://github.com/curl/curl/issues/345\n  # filename_2 <- me_(paste0(\"multibyte-chars-2-\", tricky_bit))\n  # filename_2 <- file.path(tempdir(), filename_2)\n  # file.copy(drive_example_local(\"chicken.csv\"), filename_2)\n  # expect_true(file.exists(filename_2))\n  # file_2 <- drive_upload(media = filename_2)\n  # expect_equal(charToRaw(file_2$name), charToRaw(filename_2))\n})\n\ntest_that(\"drive_upload() can convert local markdown to a Doc\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  file_to_upload <- system.file(\n    \"extdata\",\n    \"example_files\",\n    \"markdown.md\",\n    package = \"googledrive\"\n  )\n  upload_name <- me_(\"upload-md-to-doc\")\n  defer_drive_rm(upload_name)\n  local_drive_loud_and_wide()\n\n  drive_upload_message <- capture.output(\n    uploadee <- drive_upload(\n      file_to_upload,\n      name = upload_name,\n      type = \"document\"\n    ),\n    type = \"message\"\n  )\n  drive_upload_message <- drive_upload_message %>%\n    scrub_filepath(upload_name) %>%\n    scrub_filepath(file_to_upload) %>%\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(drive_upload_message)\n  )\n\n  expect_equal(\n    pluck(uploadee, \"drive_resource\", 1, \"mimeType\"),\n    drive_mime_type(\"document\")\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-drive_user.R",
    "content": "test_that(\"drive_user() reports on the user\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  user <- drive_user()\n  expect_s3_class(user, \"drive_user\")\n  expect_true(all(c(\"displayName\", \"emailAddress\") %in% names(user)))\n})\n"
  },
  {
    "path": "tests/testthat/test-promote.R",
    "content": "test_that(\"promote() works when input has zero rows\", {\n  dib <- dribble()\n  tib <- as_tibble(dib)\n  tib_out <- tibble::add_column(tib, bar = list(), .after = 1)\n  dib_out <- as_dribble(tib_out)\n\n  expect_identical(promote(tib, \"bar\"), tib_out)\n  expect_identical(promote(dib, \"bar\"), dib_out)\n})\n\ntest_that(\"promote() works when elem uniformly present or absent\", {\n  x <- tibble(\n    name = c(\"a\", \"b\", \"c\"),\n    id = c(\"1\", \"2\", \"3\"),\n    drive_resource = list(\n      list(foo = \"a1\"),\n      list(foo = \"b2\"),\n      list(foo = \"c3\")\n    )\n  )\n\n  expect_identical(\n    promote(x, \"foo\"),\n    tibble::add_column(x, foo = c(\"a1\", \"b2\", \"c3\"), .after = 1)\n  )\n\n  expect_identical(\n    promote(x, \"bar\"),\n    tibble::add_column(x, bar = list(NULL, NULL, NULL), .after = 1)\n  )\n})\n\ntest_that(\"promote() works when elem is partially present\", {\n  x <- tibble(\n    name = c(\"a\", \"b\", \"c\"),\n    id = c(\"1\", \"2\", \"3\"),\n    drive_resource = list(\n      list(foo = \"a1\", bar = TRUE),\n      list(foo = \"b2\", qux = list(letter = \"b\")),\n      list(foo = \"c3\", baz = \"c3\")\n    )\n  )\n\n  expect_identical(\n    promote(x, \"bar\"),\n    tibble::add_column(x, bar = c(TRUE, NA, NA), .after = 1)\n  )\n  expect_identical(\n    promote(x, \"qux\"),\n    tibble::add_column(\n      x,\n      qux = list(NULL, list(letter = \"b\"), NULL),\n      .after = 1\n    )\n  )\n  expect_identical(\n    promote(x, \"baz\"),\n    tibble::add_column(x, baz = c(NA, NA, \"c3\"), .after = 1)\n  )\n})\n\ntest_that(\"promote() replaces existing element in situ\", {\n  x <- tibble(\n    name = \"a\",\n    foo = \"b\",\n    bar = \"c\",\n    id = \"1\",\n    drive_resource = list(\n      list(foo = \"d\", bar = \"e\")\n    )\n  )\n  x2 <- promote(x, \"foo\")\n  x3 <- promote(x2, \"bar\")\n  expect_identical(x3$foo, \"d\")\n  expect_identical(x3$bar, \"e\")\n})\n\ntest_that(\"promote() does snake_case to camelCase conversion internally\", {\n  x <- tibble(\n    name = \"name\",\n    id = \"id\",\n    drive_resource = list(\n      list(thisThat = \"hi\")\n    )\n  )\n\n  out <- promote(x, \"this_that\")\n  expect_identical(out[2], tibble(this_that = \"hi\"))\n\n  out <- promote(x, \"thisThat\")\n  expect_identical(out[2], tibble(thisThat = \"hi\"))\n})\n"
  },
  {
    "path": "tests/testthat/test-request_generate.R",
    "content": "# ---- tests ----\ntest_that(\"request_generate() basically works\", {\n  req <- request_generate(endpoint = \"drive.files.list\", token = NULL)\n  expect_type(req, \"list\")\n  expect_setequal(\n    names(req),\n    c(\"method\", \"url\", \"body\", \"token\")\n  )\n  expect_match(req$url, \"supportsAllDrives=TRUE\")\n})\n\ntest_that(\"request_generate() errors for unrecognized parameters\", {\n  params <- list(chicken = \"muffin\", bunny = \"pippin\")\n  expect_snapshot(\n    (expect_error(\n      request_generate(\n        endpoint = \"drive.files.list\",\n        params = params,\n        token = NULL\n      ),\n      class = \"gargle_error_bad_params\"\n    ))\n  )\n})\n\ntest_that(\"request_generate() and request_build() can deliver same result\", {\n  ## include a dummy token to prevent earnest efforts to find an API key\n  gen <- request_generate(\n    \"drive.files.get\",\n    params = list(fileId = \"abc\"),\n    token = httr::config(token = \"token!\")\n  )\n  build <- gargle::request_build(\n    path = \"drive/v3/files/{fileId}\",\n    method = \"GET\",\n    params = list(fileId = \"abc\", supportsAllDrives = TRUE),\n    token = httr::config(token = \"token!\")\n  )\n  # don't fail for this difference: body is empty list vs empty named list\n  expect_identical(purrr::compact(gen), purrr::compact(build))\n})\n\ntest_that(\"request_generate() suppresses API key if token is non-NULL\", {\n  req <- request_generate(\n    \"drive.files.get\",\n    params = list(fileId = \"abc\", key = \"key in params\"),\n    key = \"explicit key\",\n    token = httr::config(token = \"token!\")\n  )\n  expect_false(grepl(\"key\", req$url))\n})\n\ntest_that(\"request_generate() adds gargle's tidyverse API key if no token\", {\n  req <- request_generate(\n    \"drive.files.get\",\n    params = list(fileId = \"abc\"),\n    token = NULL\n  )\n  expect_match(req$url, gargle::tidyverse_api_key())\n})\n\ntest_that(\"request_generate(): explicit API key > key in params > built-in\", {\n  req <- request_generate(\n    \"drive.files.get\",\n    params = list(fileId = \"abc\"),\n    key = \"xyz\",\n    token = NULL\n  )\n  expect_match(req$url, \"key=xyz\")\n\n  req <- request_generate(\n    \"drive.files.get\",\n    params = list(fileId = \"abc\", key = \"def\"),\n    key = \"xyz\",\n    token = NULL\n  )\n  expect_match(req$url, \"key=xyz\")\n\n  req <- request_generate(\n    \"drive.files.get\",\n    params = list(fileId = \"abc\", key = \"xyz\"),\n    token = NULL\n  )\n  expect_match(req$url, \"xyz\")\n})\n"
  },
  {
    "path": "tests/testthat/test-shared_drives.R",
    "content": "test_that(\"new_corpus() checks type and length, if not-NULL\", {\n  expect_silent(new_corpus())\n  expect_silent(\n    new_corpus(driveId = \"1\", corpora = \"b\", includeItemsFromAllDrives = FALSE)\n  )\n  expect_snapshot(new_corpus(driveId = c(\"1\", \"2\")), error = TRUE)\n  expect_snapshot(new_corpus(corpora = c(\"a\", \"b\")), error = TRUE)\n  expect_snapshot(\n    new_corpus(includeItemsFromAllDrives = c(TRUE, FALSE)),\n    error = TRUE\n  )\n})\n\ntest_that(\"`corpora` is checked for validity\", {\n  expect_silent(shared_drive_params(corpora = \"user\"))\n  expect_silent(shared_drive_params(corpora = \"allDrives\"))\n  expect_silent(shared_drive_params(corpora = \"domain\"))\n  expect_snapshot(shared_drive_params(corpora = \"foo\"), error = TRUE)\n})\n\ntest_that('`corpora = \"drive\"` requires shared drive specification', {\n  expect_snapshot(shared_drive_params(corpora = \"drive\"), error = TRUE)\n})\n\ntest_that('`corpora != \"drive\"` rejects shared drive specification', {\n  expect_snapshot(\n    shared_drive_params(corpora = \"user\", driveId = \"123\"),\n    error = TRUE\n  )\n})\n\ntest_that(\"a shared drive can be specified w/ corpora\", {\n  expect_silent(shared_drive_params(corpora = \"drive\", driveId = \"123\"))\n})\n\ntest_that('`corpora = \"drive\" is inferred from shared drive specification', {\n  out <- shared_drive_params(driveId = \"123\")\n  expect_identical(out$corpora, \"drive\")\n})\n"
  },
  {
    "path": "tests/testthat/test-shortcut.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-shortcut\")\nnm_ <- nm_fun(\"TEST-shortcut\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"top-level-file\"),\n    nm_(\"i-am-a-folder\"),\n    nm_(\"good-shortcut\"),\n    nm_(\"bad-shortcut\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  good_target <- drive_upload(\n    system.file(\"DESCRIPTION\"),\n    nm_(\"top-level-file\")\n  )\n  shortcut_create(good_target, name = nm_(\"good-shortcut\"), overwrite = FALSE)\n\n  drive_mkdir(nm_(\"i-am-a-folder\"), overwrite = FALSE)\n\n  bad_target <- drive_upload(\n    system.file(\"DESCRIPTION\"),\n    nm_(\"target-to-delete\")\n  )\n  shortcut_create(bad_target, name = nm_(\"bad-shortcut\"), overwrite = FALSE)\n  drive_rm(bad_target)\n}\n\n# ---- tests ----\ntest_that(\"shortcut_create() works\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  target_file <- drive_get(nm_(\"top-level-file\"))\n  folder <- drive_get(nm_(\"i-am-a-folder\"))\n  sc_name <- me_(\"custom-named-shortcut\")\n\n  local_drive_loud_and_wide()\n  shortcut_create_message <- capture.output(\n    sc <- shortcut_create(target_file, path = folder, name = sc_name),\n    type = \"message\"\n  )\n  defer_drive_rm(sc)\n  shortcut_create_message <- shortcut_create_message |>\n    scrub_filepath(sc_name) |>\n    scrub_file_id()\n  expect_snapshot(\n    write_utf8(shortcut_create_message)\n  )\n\n  expect_true(is_shortcut(sc))\n  expect_equal(\n    drive_reveal(sc, \"parent\")$id_parent,\n    folder$id\n  )\n  expect_match(sc$name, \"custom-named-shortcut\")\n})\n\ntest_that(\"shortcut_create() requires `name` to control `overwrite`\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  expect_snapshot(\n    shortcut_create(nm_(\"top-level-file\"), overwrite = FALSE),\n    error = TRUE\n  )\n})\n\ntest_that(\"shortcut_resolve() works\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  target_file <- drive_get(nm_(\"top-level-file\"))\n  dat <- drive_find(nm_(\"\"), type = \"shortcut\")\n  dat <- shortcut_resolve(dat)\n\n  expect_true(is.na(dat$name[grep(\"bad\", dat$name_shortcut)]))\n  expect_equal(\n    dat$name[grep(\"good\", dat$name_shortcut)],\n    target_file$name\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-utils-paths.R",
    "content": "# ---- nm_fun ----\nme_ <- nm_fun(\"TEST-utils-paths\")\nnm_ <- nm_fun(\"TEST-utils-paths\", user_run = FALSE)\n\n# ---- clean ----\nif (CLEAN) {\n  drive_trash(c(\n    nm_(\"create-in-me\")\n  ))\n}\n\n# ---- setup ----\nif (SETUP) {\n  drive_mkdir(nm_(\"create-in-me\"))\n}\n\n# ---- tests ----\ntest_that(\"root_folder() and root_id() work\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  expect_snapshot(\n    root_folder()\n  )\n  expect_snapshot(\n    root_id()\n  )\n})\n\ntest_that(\"rootize_path() standardizes root\", {\n  expect_identical(rootize_path(NULL), NULL)\n  expect_identical(rootize_path(character()), character())\n  expect_identical(rootize_path(\"~\"), \"~/\")\n  expect_identical(rootize_path(\"~/\"), \"~/\")\n})\n\ntest_that(\"rootize_path() errors for leading slash\", {\n  expect_snapshot(rootize_path(\"/\"), error = TRUE)\n  expect_error(rootize_path(\"/abc\"))\n})\n\ntest_that(\"append_slash() appends a slash or declines to do so\", {\n  expect_identical(append_slash(\"a\"), \"a/\")\n  expect_identical(append_slash(\"a/\"), \"a/\")\n  expect_identical(append_slash(\"\"), \"\")\n  expect_identical(append_slash(c(\"a\", \"\")), c(\"a/\", \"\"))\n  expect_identical(append_slash(character(0)), character(0))\n})\n\ntest_that(\"strip_slash() strips a trailing slash\", {\n  expect_identical(strip_slash(\"a\"), \"a\")\n  expect_identical(strip_slash(\"a/\"), \"a\")\n  expect_identical(strip_slash(\"\"), \"\")\n  expect_identical(strip_slash(character(0)), character(0))\n})\n\ntest_that(\"file_ext_safe() returns NULL unless there's a usable extension\", {\n  expect_null(file_ext_safe(NULL))\n  expect_null(file_ext_safe(\"foo\"))\n  expect_null(file_ext_safe(\"a/b/c/foo\"))\n  expect_identical(file_ext_safe(\"foo.wut\"), \"wut\")\n})\n\ntest_that(\"partition_path() splits into stuff before/after last slash\", {\n  f <- function(x, y) list(parent = x, name = y)\n\n  expect_identical(partition_path(NULL), f(NULL, NULL))\n  expect_identical(partition_path(character(0)), f(NULL, NULL))\n\n  expect_identical(partition_path(\"\"), f(NULL, \"\"))\n\n  expect_identical(partition_path(\"~\"), f(\"~/\", NULL))\n  expect_identical(partition_path(\"~/\"), f(\"~/\", NULL))\n\n  ## maybe_name = TRUE --> use `path` as is, don't append slash\n  expect_identical(partition_path(\"~/a\", TRUE), f(\"~/\", \"a\"))\n  expect_identical(partition_path(\"a/\", TRUE), f(\"a/\", NULL))\n  expect_identical(partition_path(\"a\", TRUE), f(NULL, \"a\"))\n\n  expect_identical(partition_path(\"~/a/b/\", TRUE), f(\"~/a/b/\", NULL))\n  expect_identical(partition_path(\"a/b/\", TRUE), f(\"a/b/\", NULL))\n  expect_identical(partition_path(\"a/b\", TRUE), f(\"a/\", \"b\"))\n})\n\ntest_that(\"partition_path() fails for bad input\", {\n  expect_snapshot(partition_path(letters), error = TRUE)\n  expect_snapshot(partition_path(dribble()), error = TRUE)\n  expect_snapshot(partition_path(as_id(\"123\")), error = TRUE)\n})\n\ntest_that(\"is_path() works\", {\n  expect_true(is_path(\"a\"))\n  expect_true(is_path(letters))\n  expect_false(is_path(as_id(\"a\")))\n  expect_false(is_path(as_id(letters)))\n  expect_false(is_path(dribble()))\n})\n\ntest_that(\"rationalize_path_name() errors for bad `name`, before hitting API\", {\n  expect_snapshot(rationalize_path_name(name = letters), error = TRUE)\n})\n\ntest_that(\"rationalize_path_name() can pass `path` and `name` through, w/o hitting API\", {\n  # specifically, this happens when `is_path(path)` is FALSE\n  expect_identical(\n    rationalize_path_name(path = NULL, name = \"NAME\"),\n    list(path = NULL, name = \"NAME\")\n  )\n  expect_identical(\n    rationalize_path_name(path = as_id(\"FILE_ID\"), name = NULL),\n    list(path = as_id(\"FILE_ID\"), name = NULL)\n  )\n  expect_identical(\n    rationalize_path_name(path = as_id(\"FILE_ID\"), name = \"NAME\"),\n    list(path = as_id(\"FILE_ID\"), name = \"NAME\")\n  )\n  expect_identical(\n    rationalize_path_name(path = dribble(), name = NULL),\n    list(path = dribble(), name = NULL)\n  )\n  expect_identical(\n    rationalize_path_name(path = dribble(), name = \"NAME\"),\n    list(path = dribble(), name = \"NAME\")\n  )\n})\n\ntest_that(\"rationalize_path_name() won't hit API if we can infer `path` is a folder\", {\n  expect_identical(\n    rationalize_path_name(path = \"PARENT_FOLDER\", name = \"NAME\"),\n    list(path = \"PARENT_FOLDER/\", name = \"NAME\")\n  )\n  expect_identical(\n    rationalize_path_name(path = \"PARENT_FOLDER/\", name = NULL),\n    list(path = \"PARENT_FOLDER/\", name = NULL)\n  )\n})\n\ntest_that(\"rationalize_path_name() populates `path` and `name` and correctly\", {\n  local_mocked_bindings(\n    confirm_clear_path = function(path, name) NULL\n  )\n  expect_identical(\n    rationalize_path_name(path = \"FILE_NAME\", name = NULL),\n    list(path = NULL, name = \"FILE_NAME\")\n  )\n  expect_identical(\n    rationalize_path_name(path = \"PARENT_FOLDER/FILE_NAME\", name = NULL),\n    list(path = \"PARENT_FOLDER/\", name = \"FILE_NAME\")\n  )\n})\n\ntest_that(\"check_for_overwrite() does its job\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  withr::defer(drive_empty_trash())\n  defer_drive_rm(file.path(nm_(\"create-in-me\"), me_(\"name-collision\")))\n\n  PARENT_ID <- drive_get(nm_(\"create-in-me\"))$id\n\n  first <- drive_create(me_(\"name-collision\"), path = PARENT_ID)\n\n  expect_error(\n    check_for_overwrite(\n      parent = PARENT_ID,\n      name = me_(\"name-collision\"),\n      overwrite = FALSE\n    ),\n    \"already exist\"\n  )\n\n  expect_no_error(\n    second <- drive_create(\n      me_(\"name-collision\"),\n      path = PARENT_ID,\n      overwrite = TRUE\n    )\n  )\n  expect_identical(first$name, second$name)\n  expect_identical(\n    drive_reveal(first, \"parent\")$id_parent,\n    drive_reveal(second, \"parent\")$id_parent\n  )\n  expect_false(first$id == second$id)\n\n  expect_no_error(\n    drive_create(\n      me_(\"name-collision\"),\n      path = PARENT_ID,\n      overwrite = NA\n    )\n  )\n  df <- drive_ls(nm_(\"create-in-me\"))\n  expect_identical(nrow(df), 2L)\n\n  expect_error(\n    check_for_overwrite(\n      parent = PARENT_ID,\n      me_(\"name-collision\"),\n      overwrite = TRUE\n    ),\n    \"Multiple items\"\n  )\n})\n\ntest_that(\"check_for_overwrite() copes with `parent = NULL`\", {\n  skip_if_no_token()\n  skip_if_offline()\n\n  expect_error(\n    check_for_overwrite(parent = NULL, nm_(\"create-in-me\"), overwrite = FALSE),\n    \"already exist\"\n  )\n})\n\ntest_that(\"apply_extension() doesn't apply 'NA' as an extension\", {\n  expect_equal(apply_extension(\"somefile\", NA), \"somefile\")\n})\n"
  },
  {
    "path": "tests/testthat/test-utils-ui.R",
    "content": "test_that(\"warn_for_verbose() does nothing for `verbose = TRUE`\", {\n  expect_warning(warn_for_verbose(TRUE), NA)\n})\n\ntest_that(\"warn_for_verbose() warns for `verbose = FALSE` w/ good message\", {\n  drive_something <- function() {\n    withr::local_options(lifecycle_verbosity = \"warning\")\n    warn_for_verbose(FALSE)\n  }\n  expect_snapshot(\n    drive_something()\n  )\n})\n\ntest_that(\"warn_for_verbose(FALSE) makes googledrive quiet, in scope\", {\n  withr::local_options(lifecycle_verbosity = \"quiet\")\n  local_drive_loud_and_wide()\n  drive_something <- function() {\n    warn_for_verbose(verbose = FALSE)\n    drive_bullets(\"this message should not be emitted\")\n  }\n\n  expect_snapshot({\n    drive_bullets(\"chatty before\")\n    drive_something()\n    drive_bullets(\"chatty after\")\n  })\n})\n"
  },
  {
    "path": "tests/testthat/test-utils.R",
    "content": "# ---- tests ----\ntest_that(\"put_column() adds a column in the right place\", {\n  df <- tibble(v1 = 1, v2 = 2)\n  expect_identical(\n    put_column(df, nm = \"insert\", val = 3, .after = \"v1\"),\n    tibble(v1 = 1, insert = 3, v2 = 2)\n  )\n})\n\ntest_that(\"put_column() updates an existing column\", {\n  df <- tibble(v1 = 1, v2 = 2)\n  expect_identical(\n    put_column(df, nm = \"v3\", val = \"hi\"),\n    tibble(v1 = 1, v2 = 2, v3 = \"hi\")\n  )\n})\n\ntest_that(\"put_column() works with an expression\", {\n  df <- tibble(v1 = 1, v2 = 2)\n  stuff <- \"stuff\"\n  expect_identical(\n    put_column(df, nm = \"v3\", val = stuff),\n    tibble(v1 = 1, v2 = 2, v3 = \"stuff\")\n  )\n})\n\ntest_that(\"and() protects its inputs with parentheses\", {\n  x <- c(\"organizerCount > 5\", \"memberCount > 20\")\n  expect_identical(\n    as.character(and(c(\"createdTime > '2019-01-01T12:00:00'\", or(x)))),\n    \"(createdTime > '2019-01-01T12:00:00') and (organizerCount > 5 or memberCount > 20)\"\n  )\n})\n"
  },
  {
    "path": "tests/testthat.R",
    "content": "library(testthat)\nlibrary(googledrive)\n\ntest_check(\"googledrive\")\n"
  },
  {
    "path": "vignettes/.gitignore",
    "content": "*.html\n*.R\n"
  },
  {
    "path": "vignettes/articles/.gitignore",
    "content": "*_cache\n"
  },
  {
    "path": "vignettes/articles/bring-your-own-client.Rmd",
    "content": "---\ntitle: \"Bring your own OAuth client or API key\"\n---\n\n```{r setup, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  error = TRUE\n)\n```\n\n## Role of the OAuth client and API key\n\ngoogledrive helps you obtain a token to work with the Google Drive API from R primarily through the `drive_auth()` function. Under the hood, that process relies on an OAuth client and secret, a.k.a. an \"OAuth client\".\n\ngoogledrive can also make unauthorized calls to the Google Drive API, for example accessing a file available to \"Anyone with a link\", by sending an API key, instead of a user token.\n\nIf there is a problem with googledrive's internal OAuth client or API key or if you would prefer to use your own, you can configure this. Below we describe how.\n\n## Get an OAuth client and tell googledrive about it\n\nFollow the instructions in the gargle article [How to get your own API credentials](https://gargle.r-lib.org/articles/get-api-credentials.html) to get an OAuth client ID and secret. Now register it with googledrive.\n\nPreferred method: Provide the path to the JSON file downloaded from the [Google Cloud Platform Console](https://console.cloud.google.com).\n\n```{r eval = FALSE}\ndrive_auth_configure(\n  path = \"/path/to/the/JSON/you/downloaded/from/google/dev/console.json\"\n)\n```\n\nIt is also possible, though discouraged, to directly use the constructor `gargle::gargle_oauth_client()`.\n\nConfirm success and carry on! You can see the currently configured OAuth client like so:\n\n```{r eval = FALSE}\ndrive_oauth_client()\n```\n\nYou should see your own client there now.\n\nFor the rest of this R session, when you get a new token with `drive_auth()`, your OAuth client is used.\n\n## Get an API key and tell googledrive about it\n\nFollow the instructions in the gargle article [How to get your own API credentials](https://gargle.r-lib.org/articles/get-api-credentials.html) to get an API key. You probably want to use the same GCP project to create both your OAuth client (above) and your API key. Now register it with googledrive.\n\n```{r eval = FALSE}\ndrive_auth_configure(api_key = \"YOUR_API_KEY_GOES_HERE\")\n```\n\nConfirm success and carry on! You can see the currently configured API key like so:\n\n```{r eval = FALSE}\ndrive_api_key()\n```\n\nYou should see your own API key now.\n\nFor the rest of this R session, if you go into a de-authorized state via `drive_deauth()`, your API key will be sent with the request.\n"
  },
  {
    "path": "vignettes/articles/example-files.Rmd",
    "content": "---\ntitle: \"Example Files\"\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  error = TRUE\n)\n```\n\nThe googledrive package makes some world-readable, persistent example files available on Google Drive, to use in examples and reprexes.\nLocal versions of those same example files also ship with the googledrive package, to make it easier to demo specific workflows that start with, e.g., `drive_upload()`.\n\nThis article lists these assets and explains how to get at them.\nSince the remote example files are accessible to all, after we attach googledrive, we also do `drive_deauth()`.\n\n```{r setup}\nlibrary(googledrive)\n\ndrive_deauth()\n```\n\n## Local example files\n\nCall `drive_examples_local()` to get the full filepaths.\n`basename()` (and `fs::path_file()`) are handy functions for getting just the filename.\n\n```{r}\n(x <- drive_examples_local())\n\nbasename(x)\n```\n\nYou can filter the files by providing a regular expression.\n\n```{r}\ndrive_examples_local(\"csv\") |> basename()\n```\n\nIf you want exactly one file, use the singular `drive_example_local()` and provide the file's name (or any sufficiently specific regular expression):\n\n```{r}\ndrive_examples_local(\"chicken.jpg\") |> basename()\n\ndrive_examples_local(\"imdb\") |> basename()\n```\n\nHere's how you might use one of these examples to start demonstrating something with googledrive:\n\n```{r eval = FALSE}\nnew_google_sheet <- drive_examples_local(\"chicken.csv\") |>\n  drive_upload(type = \"spreadsheet\")\n# ... example or reprex continues ...\n```\n\n## Remote example files\n\nCall `drive_examples_remote()` to get a `dribble` of the remote example files.\nHere I also reveal their MIME type.\n\n```{r}\ndrive_examples_remote() |>\n  drive_reveal(\"mime_type\")\n```\n\nYou'll notice there are two files that aren't among the local example files, but that are derived from them:\n\n* `chicken_doc`: a Google Document made from `chicken.txt`\n* `chicken_sheet`: a Google Sheet made from `chicken.csv`\n\nHere's a clickable table of the remote example files:\n\n```{r include = FALSE}\ndat <- drive_examples_remote() |>\n  drive_reveal(\"webViewLink\")\ndat2 <- tibble::tibble(\n  `name (these are links)` =  glue::glue_data(dat, \"[{name}]({web_view_link})\"),\n  id = unclass(dat$id)\n)\n```\n\n```{r echo = FALSE}\nknitr::kable(dat2)\n```\n\nAccessing the remote example files works just like the local files.\nProvide a regular expression to specify the name of target file(s).\nUse the singular form to target exactly one file.\n\n```{r}\ndrive_examples_remote(\"chicken\")\n\ndrive_example_remote(\"logo\")\n```\n\nHere's how you might use one of these examples to start demonstrating something with googledrive:\n\n```{r eval = FALSE}\nnew_google_doc <- drive_examples_remote(\"chicken_doc\") |>\n  drive_cp(name = \"I have a chicken problem\")\n# ... example or reprex continues ...\n```\n"
  },
  {
    "path": "vignettes/articles/file-identification.Rmd",
    "content": "---\ntitle: \"File Identification\"\n---\n\n```{r setup, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  # HELLO this article currently has no executable code chunks\n  eval = FALSE\n)\n```\n\nThe most natural way to identify a file is by its **name**. The Drive API, however, fundamentally identifies a file by its unique id. googledrive makes it easy to specify your file of interest by name at first, but then immediately capture that in a way that includes the file's id. This facilitates downstream file operations.\n\ngoogledrive holds information on Drive files in what we call a **dribble**, a Drive tibble. A [tibble](https://tibble.tidyverse.org/reference/tbl_df-class.html) is the variant of the data frame that is used throughout the [tidyverse](https://www.tidyverse.org). A googledrive dribble will have one row per file and is guaranteed to have these variables:\n\n  * `name`: The file's name.\n  * `id`: The file's unique id.\n  * `drive_resource`: A list column containing Drive API metadata that is internally useful and possibly interesting to some users. The typical user will leave this variable unexamined. Just let it be.\n  \nSome functions add additional variables, but the three above are always present. `drive_reveal()`, for example, can add file paths, MIME types, trash status, and information about permissions and publishing. Use your usual techniques for data frame manipulation in order to isolate specific rows -- files, in this case -- that you want to operate on. For example, you can manipulate the dribble with dplyr verbs such as `filter()`, `mutate()`, `arrange()`, and `slice()`.\n\n## How to get one or more files in a dribble\n\nHow do you get files into a dribble in the first place? Two main functions for this:\n\n  * `drive_find()`: Similar to <https://drive.google.com>. Lists all your files\n    or lets you narrow things down based on name or file properties.\n  * `drive_get()`: Get files by name -- file path, actually -- or by id,\n    including by URL.\n  \n## drive_find()\n\nRead the help for complete documentation but here are some of the many ways to call `drive_find()`:\n\n```{r}\ndrive_find()\ndrive_find(n_max = 40)\ndrive_find(pattern = \"chicken\")\ndrive_find(type = \"pdf\")\ndrive_find(type = \"folder\")\ndrive_find(type = \"spreadsheet\")\ndrive_find(trashed = TRUE)\ndrive_find(q = \"fullText contains 'project'\")\ndrive_find(q = \"modifiedTime > '2019-04-21T12:00:00'\", order_by = \"recency\")\ndrive_find(q = c(\"starred = true\", \"visibility = 'anyoneWithLink'\"))\n```\n\n`drive_find()` is for exhaustive file listing or filtering on file properties.\n\n## drive_get()\n\nRead the help for complete documentation but here are how calls to `drive_get()` can look:\n\n```{r}\ndrive_get(\"i_am_a_file_name\")\ndrive_get(\"i/am/a/deeply/buried/file.txt\")\ndrive_get(\"i/am/a/folder/\")\ndrive_get(c(\"i_am_a_file_name\", \"path/to/file\"))\ndrive_get(as_id(\"abcdefghijklm\"))\ndrive_get(as_id(c(\"abcdefghijklm\", \"nopqrstuvwxyz\")))\ndrive_get(id = \"abcdefghijklm\")\ndrive_get(id = c(\"abcdefghijklm\", \"nopqrstuvwxyz\"))\ndrive_get(as_id(\"https://docs.google.com/document/d/abcdefghijklm/edit\"))\n```\n\n`drive_get()` is for targetted file fetching based on name, path, id, or URL.\n\n## Other handy functions\n\n`drive_reveal()` adds bonus information to the dribble, either by excavating it from the `drive_resource` variable or by calling the Drive API. Use it on a dribble containing files of interest.\n\n```{r}\ndrive_reveal(files, \"path\")\ndrive_reveal(files, \"trashed\")\ndrive_reveal(files, \"mime_type\")\ndrive_reveal(files, \"permissions\")\ndrive_reveal(files, \"published\")\n```\n\n`drive_ls()` lists files below a specified folder. It's a thin wrapper around `drive_find()`, so all those capabilities are available.\n\n```{r}\ndrive_ls(\"i/am/a/folder/\", type = \"spreadsheet\")\n```\n\n`drive_browse()` will open a file in your browser.\n\n```{r}\ndrive_browse(i_am_a_dribble)\ndrive_browse(\"i_am_a_file_name\")\ndrive_browse(as_id(\"abcdefghijklm\"))\n```\n"
  },
  {
    "path": "vignettes/articles/messages-and-errors.Rmd",
    "content": "---\ntitle: \"Messages and errors in googledrive\"\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  error = TRUE\n)\n```\n\n```{r setup}\nlibrary(googledrive)\n```\n\n*Things I do in a hidden chunk here, to aid exposition about internal tooling:*\n\n-   *\"Export\" the internal helpers covered below*\n-   *(Attempt to) auth as the service account we use when rendering documentation*\n\n```{r include = FALSE}\ndrive_bullets <- googledrive:::drive_bullets\ndrive_abort <- googledrive:::drive_abort\nbulletize <- gargle::bulletize\ngargle_map_cli <- gargle::gargle_map_cli\n\nauth_success <- tryCatch(\n  googledrive:::drive_auth_docs(),\n  googledrive_auth_internal_error = function(e) e\n)\n```\n\n## User-facing messages\n\nEverything should be emitted by helpers in `utils-ui.R`: specifically, `drive_bullets()` (and, for errors, `drive_abort()`).\nThese helpers are all wrappers around cli functions, such as `cli::cli_bullets()`.\n\n*These may not demo well via pkgdown, but the interactive experience is nice.*\n\n```{r}\ndrive_bullets(c(\n        \"noindent\",\n  \" \" = \"indent\",\n  \"*\" = \"bullet\",\n  \">\" = \"arrow\",\n  \"v\" = \"success\",\n  \"x\" = \"danger\",\n  \"!\" = \"warning\",\n  \"i\" = \"info\"\n))\n```\n\nThe helpers encourage consistent styling and make it possible to selectively silence messages coming from googledrive.\nThe googledrive message helpers:\n\n-   Use the [cli package](https://cli.r-lib.org/index.html) to get interpolation, inline markup, and pluralization.\n\n-   Eventually route through `rlang::inform()`, which is important because `inform()` prints to standard output in interactive sessions.\n    This means that informational messages won't have the same \"look\" as errors and can generally be more stylish, at least in IDEs like RStudio.\n\n-   Use some googledrive-wide style choices, such as:\n\n    -   The custom `.drivepath` style is like cli's inline `.file` style, except cyan instead of blue.\n    -   The built-in `.field` style is tweaked to be flanked by single quotes in a no-color situation.\n    -   The typical \"\\*\" bullet isn't colored, since we've got so much other color going on.\n\n-   Are under the control of the `googledrive_quiet` option.\n    If it's unset, the default is to show messages (unless we're testing, i.e. the environment variable `TESTTHAT` is `\"true\"`).\n    Doing `options(googledrive_quiet = TRUE)` will suppress messages.\n    There are withr-style convenience helpers: `local_drive_quiet()` and `with_drive_quiet()`.\n\n### Inline styling\n\nHow we use the inline classes:\n\n-   `.drivepath` for the name or, occasionally, the (partial) path of a Drive file\n-   `.field` for the value of an argument, e.g. a MIME type\n-   `.code` for a column in a data frame and for reserved words, such as `NULL`, `TRUE`, and `NA`\n-   `.arg`, `.fun`, `.path`, `.cls`, `.url` for their usual purpose\n\n```{r}\ndrive_bullets(c(\n  \"We need to talk about the {.arg foofy} argument to {.fun blarg}\",\n  \"You provided {.field a_very_weird_value} and I suspect you're confused \\\\\n   about something\"\n))\n```\n\nMost relevant cli docs:\n\n-   [CLI inline markup](https://cli.r-lib.org/reference/inline-markup.html)\n-   [Building a Semantic CLI](https://cli.r-lib.org/articles/semantic-cli.html)\n\n### Bullets\n\nI use the different bullet points in `drive_bullets()` to convey a mood.\n\nExclamation mark `\"!\"`: I'm not throwing an error or warning, but I want to get the user's attention, because it seems likely (but not certain) that they misunderstand something about googledrive or Google Drive or their Drive files.\nExamples:\n\n```{r}\ndrive_bullets(c(\n  \"!\" = \"Ignoring {.arg type}. Only consulted for native Google file types.\",\n  \" \" = \"MIME type of {.arg file}: {.field mime_type}.\"\n))\n\ndrive_bullets(c(\n  \"!\" = \"Currently only fields for the {.field files} resource can be \\\\\n         checked for validity.\",\n  \" \" = \"Nothing done.\"\n))\n\ndrive_bullets(c(\n  \"!\" = \"No updates specified.\"\n))\n\ndrive_bullets(c(\n  \"!\" = \"No such file to delete.\"\n))\n```\n\nInformation \"i\": I'm just keeping you informed of how my work is going.\n\n```{r}\ndrive_bullets(c(\n  \"i\" = \"No pre-existing file at this filepath. Calling \\\\\n         {.fun drive_upload}.\"\n))\n\ndrive_bullets(c(\n  \"i\" = \"Pre-existing file at this filepath. Calling \\\\\n         {.fun drive_update}.\"\n))\n\ndrive_bullets(c(\n  \"i\" = \"Not logged in as any specific Google user.\"\n))\n```\n\nIn cases where we determine there is nothing we can or should do, sometimes I use `\"!\"` and sometimes I use `\"i\"`.\nIt depends on whether it feels like the user could or should have known that no work would be possible or needed.\n\n### Programmatic generation of bullets\n\nOften we need to create bullets from an R object, such as a character vector or a dribble.\nWhat needs to happen:\n\n-   Map a cli-using string template over the object to get a character vector\n-   Truncate this vector in an aesthetically pleasing way\n-   Apply names to this vector to get the desired bullet points\n\n`gargle_map_cli()` is a new generic in gargle that turns an object into a vector of strings with cli markup.\nCurrently gargle exports methods for `character` (and `NULL` and a `default`) and googlesheets4 defines a method for `dribble`.\nThis is likely to be replaced by something in cli itself in due course.\n\n```{r}\ngargle_map_cli(letters[1:3])\n```\n\nBy default `gargle_map_cli.character()` just applies the `.field` style, i.e. the template is `\"{.field <<x>>}\"`.\nBut the template can be customized, if you need something else.\nNote that we use non-standard glue delimiters (`<<` and `>>`, by default), because we are interpolating into a string with glue/cli markup, where `{}` has the usual meaning.\n\n```{r}\ngargle_map_cli(letters[4:6], template = \"how about a path {.path <<x>>}?\")\n```\n\nThe `gargle_map_cli.dribble()` method makes a cli-marked up string for each row of the dribble, i.e. for each Drive file.\n\n```{r}\ndat <- drive_find(n_max = 5)\ngargle_map_cli(dat)\n```\n\n`gargle_map_cli.dribble()` also allows a custom template, but it's a more complicated and less common situation than for `character`.\nWe won't get into that here.\n(I don't consider the dribble styling to be finalized yet.)\n\nThe result of `gargle_map_cli()` then gets processed with `gargle::bulletize()`, which adds the bullet-specifying names and does aesthetically pleasing truncation.\n\n```{r}\nbulletize(gargle_map_cli(letters))\n\nbulletize(gargle_map_cli(letters), bullet = \"x\", n_show = 2)\n\ndrive_bullets(c(\n  \"These are surprising things:\",\n  bulletize(gargle_map_cli(letters), bullet = \"!\")\n))\n\ndat <- drive_find(n_max = 10)\n\ndrive_bullets(c(\n  \"Some Drive files:\",\n  bulletize(gargle_map_cli(dat))\n))\n```\n\nIt's conceivable that cli will gain a better way of vectorization, but this works for now.\n\nKnown dysfunction: it's inefficient to `gargle_map_cli()` over the whole object, then truncate with `bulletize()`.\nBut it's easy.\nThere are contexts, like tibble printing, where formatting stuff that will never see the light of day is really punishing.\nBut I'm not sure I really have to worry about that.\n\n## Errors\n\nI am currently using `cli::cli_abort()`, which is present in the dev version of cli (as of late May 2021, cli version 2.5.0.9000).\n\nIt's wrapped as `drive_abort()`, for the same reason as `drive_bullets()`, namely to apply some package-wide style tweaks.\n\nThe mechanics of `drive_abort()` usage are basically the same as `drive_bullets()`.\n"
  },
  {
    "path": "vignettes/articles/multiple-files.Rmd",
    "content": "---\ntitle: \"Dealing with multiple files\"\n---\n\n```{r setup, include = FALSE}\nauth_success <- tryCatch(\n  googledrive:::drive_auth_docs(),\n  googledrive_auth_internal_error = function(e) e\n)\n\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  error = TRUE,\n  purl = googledrive::drive_has_token(),\n  eval = googledrive::drive_has_token()\n)\n\noptions(tidyverse.quiet = TRUE)\n```\n\n```{r eval = !googledrive::drive_has_token(), echo = FALSE, comment = NA}\ngoogledrive:::drive_bullets(c(\n  \"Code chunks will not be evaluated, because:\",\n  strsplit(auth_success$message, split = \"\\n\")[[1]]\n))\ngoogledrive::drive_deauth()\n```\n\n```{r, include = FALSE}\n# clean up if any previous runs left this lying around\ntrash_me <- googledrive::drive_find(\n  \"upload-into-me-article-demo\", type = \"folder\"\n)\nif (googledrive::some_files(trash_me)) {\n  googledrive::drive_trash(trash_me)\n}\n```\n\nSome googledrive functions are built to naturally handle multiple files, while others operate on a single file.\n\nFunctions that expect a single file:\n\n* `drive_browse()`  \n* `drive_cp()`  \n* `drive_download()` \n* `drive_ls()`\n* `drive_mv()`  \n* `drive_put()`\n* `drive_rename()`  \n* `drive_update()`\n* `drive_upload()`\n\nFunctions that allow multiple files: \n\n* `drive_publish()`  \n* `drive_reveal()`  \n* `drive_rm()`  \n* `drive_share()`  \n* `drive_trash()`  \n\nIn general, the principle is: if there are multiple parameters that are likely to vary across multiple files, the function is designed to take a single input. In order to use these function with multiple inputs, use them together with your favorite approach for iteration in R. Below is a worked example, focusing on tools in the tidyverse, namely the `map()` functions in purrr.\n\n## Upload multiple files, then rename them\n\nScenario: we have multiple local files we want to upload into a folder on Drive. Then we regret their original names and want to rename them.\n\nLoad packages.\n\n```{r}\nlibrary(googledrive)\nlibrary(glue)\nlibrary(tidyverse)\n```\n\n### Upload\n\nUse the example files that ship with googledrive.\n\n```{r}\nlocal_files <- drive_examples_local()\nlocal_files <- set_names(local_files, basename(local_files))\nlocal_files\n```\n\nCreate a folder on your Drive and upload all files into this folder by iterating over the `local_files` using `purrr::map()`.\n\n```{r}\nfolder <- drive_mkdir(\"upload-into-me-article-demo\")\nwith_drive_quiet(\n  files <- map(local_files, ~ drive_upload(.x, path = folder))\n)\n```\n\nFirst, let's confirm that we uploaded the files into the new folder.\n\n```{r}\ndrive_ls(folder)\n```\n\nNow let's reflect on the `files` object returned by this operation. `files` is a list of **dribbles**, one per uploaded file.\n\n```{r}\nstr(files, max.level = 1)\n```\n\nThis would be a favorable data structure if you've got more `map()`ing to do, as you'll see below.\n\nBut what if not? You can always row bind individual dribbles into one big dribble yourself with, e.g., `dplyr::bind_rows()`.\n\n```{r}\nbind_rows(files)\n```\n\nBelow we show another way to finesse this by using a variant of `purrr::map()` that does this for us, namely `map_dfr()`.\n\n### Rename\n\nImagine that we now wish these file names had a date prefix. First, form the new names. We use `glue::glue()` for string interpolation but you could also use `paste()`. Second, we map over two inputs: the list of dribbles from above and the vector of new names.\n\n```{r}\n(new_names <- glue(\"{Sys.Date()}_{basename(local_files)}\"))\nfiles_dribble <- map2_dfr(files, new_names, drive_rename)\n```\n\nWe use `purrr::map2_dfr()` to work through `files`, the list of dribbles (= Drive files), and `new_names`, the vector of new names, and row bind the returned dribbles into a single dribble holding all files.\n\nLet's check on the contents of this folder again to confirm the new names:\n\n```{r}\ndrive_ls(folder)\n```\n\nLet's confirm that, by using `map2_df2()` instead of `map2()`, we got a single dribble back, instead of a list of one-row dribbles:\n\n```{r}\nfiles_dribble\n```\n\nWhat if you wanted to get a list back, because your downstream operations include yet more `map()`ing? Then you would use `map2()`.\n\n```{r eval = FALSE}\nfiles_list <- map2(files, new_names, drive_rename)\n```\n\n### Clean up\n\nOur trashing function, `drive_trash()` is vectorized and can therefore operate on a multi-file dribble. We could trash these files like so:\n\n```{r eval = FALSE}\ndrive_trash(files_dribble)\n```\n\nIf you're absolutely sure of yourself and happy to do something irreversible, you could truly delete these files with `drive_rm()`, which is also vectorized:\n\n```{r eval = FALSE}\ndrive_rm(files_dribble)\n```\n\nFinally -- and this is the code we will actually execute -- the easiest way to delete these files is to delete their enclosing folder.\n\n```{r}\ndrive_rm(folder)\n```\n"
  },
  {
    "path": "vignettes/articles/permissions.Rmd",
    "content": "---\ntitle: \"File permissions\"\n---\n\n```{r setup, include = FALSE}\nauth_success <- tryCatch(\n  googledrive:::drive_auth_docs(),\n  googledrive_auth_internal_error = function(e) e\n)\n\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  error = TRUE,\n  purl = googledrive::drive_has_token(),\n  eval = googledrive::drive_has_token()\n)\n\noptions(tidyverse.quiet = TRUE)\n```\n\n```{r eval = !googledrive::drive_has_token(), echo = FALSE, comment = NA}\ngoogledrive:::drive_bullets(c(\n  \"Code chunks will not be evaluated, because:\",\n  strsplit(auth_success$message, split = \"\\n\")[[1]]\n))\ngoogledrive::drive_deauth()\n```\n\n```{r, include = FALSE}\n# clean up if any previous runs left this lying around\ntrash_me <- googledrive::drive_find(\"chicken-perm-article\")\nif (googledrive::some_files(trash_me)) {\n  googledrive::drive_trash(trash_me)\n}\n```\n\nYou can use googledrive to manage permissions on your Drive files, i.e. grant different people or groups of people various levels of access (read, comment, edit, etc.).\n\nLet's upload a file and view its permissions.\n\n```{r}\nlibrary(googledrive)\n\nfile <- drive_example_local(\"chicken.txt\") |>\n  drive_upload(name = \"chicken-perm-article.txt\") |>\n  drive_reveal(\"permissions\")\n\nfile\n```\n\n`shared = FALSE` indicates that this file is not yet shared with anyone and, for those so inclined, detailed information on permissions can be found in the `permissions_resource` list-column. Note that the `drive_resource`, which is always present in a dribble, typically also contains information on permissions. So if you just want to *know* about permissions, as opposed to modifying them, you can probably consult `drive_resource`.\n\nLet's give a specific person permission to edit this file and a customized message, using the `emailAddress` and `emailMessage` parameters.\n\n```{r, eval = FALSE}\nfile <- file |>\n  drive_share(\n    role = \"writer\",\n    type = \"user\",\n    emailAddress = \"serena@example.com\",\n    emailMessage = \"Would appreciate your feedback on this!\"\n  )\n```\n\nLet's say we also want \"anyone with a link\" to be able to read the file.\n\n```{r eval = FALSE}\nfile <- file |>\n  drive_share(role = \"reader\", type = \"anyone\")\n```\n\nThis comes up often enough that we've made a convenience wrapper:\n\n```{r}\nfile <- file |>\n  drive_share_anyone()\nfile\n```\n\nWe see that the file is now `shared = TRUE`.\n\nNow that we've made a few updates to our permissions, the `permissions_resource` list-column has become more interesting. Here's how to pull important information out of this and put into a tibble with one row per permission. (*Permission handling will become more formalized in future versions of googledrive. See [the issue](https://github.com/tidyverse/googledrive/issues/180)*). We use other packages in the tidyverse now for this data wrangling.\n\n```{r eval = FALSE}\nlibrary(tidyverse)\n\nperm <- pluck(file, \"permissions_resource\", 1, \"permissions\")\n\npermissions <- tibble(\n  id =    map_chr(perm, \"id\",           .default = NA_character_),\n  name =  map_chr(perm, \"displayName\",  .default = NA_character_),\n  type =  map_chr(perm, \"type\",         .default = NA_character_),\n  role =  map_chr(perm, \"role\",         .default = NA_character_),\n  email = map_chr(perm, \"emailAddress\", .default = NA_character_)\n)\npermissions\n```\n\nWe've suppressed execution of the above chunk but here's some static, indicative output:\n\n```{r eval = FALSE}\n#> # A tibble: 3 x 5\n#>   id           name            type   role  email\n#>   <chr>        <chr>           <chr>  <chr> <chr>\n#> 1 12345678901… Serena Somebody user   writ… serena@example.com\n#> 2 anyoneWithL… NA              anyone read… NA\n#> 3 98765432109… Orville Owner   user   owner orville@example.com\n```\n\n## Clean up\n\n```{r}\ndrive_rm(file)\n```\n"
  },
  {
    "path": "vignettes/googledrive.Rmd",
    "content": "---\ntitle: \"googledrive\"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{googledrive}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\nPlease see the googledrive website for full documentation:\n\n  * <https://googledrive.tidyverse.org/index.html>\n  \nIn addition to function-specific help, there are several articles which are indexed here:\n\n  * [Article index](https://googledrive.tidyverse.org/articles/index.html)\n"
  }
]